# Product Add-ons for print and personalized products

**Category:** Products  ·  **Min plan:** Pro  ·  **Section:** Management Tools

**Product Add-ons** puts fields on a product page that the buyer fills in before ordering: a short text for the name to print, a long text for a gift message, or an image upload for the photo to print. A field can carry an extra price in DA, and every answer, the image included, reaches you on the order page. A print shop or a personalized gift seller gets the whole order in one step instead of calling the buyer back to ask for the photo.

## Video tutorial

[Product Add-ons for print and personalized products](https://www.youtube-nocookie.com/embed/78tj1zrwClo)

## What you can ask the buyer

Each product has its own list of fields, and each field is one of three types:

| Field type                     | What the buyer gets                                                                   | Settings                                                    |
| ------------------------------ | ------------------------------------------------------------------------------------- | ----------------------------------------------------------- |
| **Short text (one line)**      | A one-line box, for example for the name to print on a mug                            | Placeholder text, maximum characters, extra price, required |
| **Long text (multiple lines)** | A three-line box, for example for a gift card message                                 | Placeholder text, maximum characters, extra price, required |
| **Image upload**               | An upload area; the buyer picks a photo and sees a preview with a button to remove it | Extra price, required                                       |

* **Placeholder text (optional)** shows inside the empty box as a hint, for example "Write the name to print".
* **Maximum characters** stops the box at that length. Leave it empty for no limit.
* **Extra price (optional)** in DA is shown next to the field title on the product page, for example +200 DA.
* **Required field** adds a star to the title, and the buyer cannot order until the field is filled.

The image upload takes JPG, PNG, GIF and WEBP files up to 5 MB. The file is stored as the buyer sent it, with no compression or format change, so what you print is the original.

## How to set it up

1. Open **Dashboard → Add-ons**. In the **Management Tools** section, click **Manage add-ons** on the **Product Add-ons** card.
2. The page lists your active products. Each card shows the number of fields and a badge, **Enabled** or **Disabled**.
3. On the product you want, click **Manage add-ons**, then **Add a new field**.
4. Type the **Field title**, which is the question the buyer reads, pick the **Field type**, set the options you need and click **Save**.
5. Back on the product card, click the switch button next to **Manage add-ons**. The badge changes to **Enabled** and the fields appear on your store.

Every product starts with its fields switched off, so the buyer sees nothing until you switch the product on. You can prepare the fields first, and the same switch hides them again without deleting anything.

In a product's list of fields, drag the handle at the start of a row to change the order; the product page shows the fields in that order. The pencil button edits a field and the bin button deletes it after a confirmation.

## What the buyer sees

On the product page, the fields sit in a block titled **Customization options**, each with its title, a star when it is required and its extra price. The price shown on the page goes up as soon as the buyer fills a paid field, and goes back down if they empty it.

On the product list and on category pages, the add to cart button of a product whose fields are switched on opens its product page, so the buyer fills the fields before the product reaches the cart. The answers stay with the product whether the buyer orders through the cart or straight from the product page.

## How the extra price is counted

An extra price is charged only when the buyer fills that field. An optional field left empty adds nothing.

The extra price is added to the price of one piece: a buyer who orders 2 mugs with a paid name pays it twice. When the buyer picks a quantity offer, it is added once to the offer price.

The amount always comes from the field as you saved it, not from what the buyer's page displayed.

## Where you read the answers

Open the order from **Orders**. Under each product line, the order page lists every field title with the buyer's answer: the text as typed, or a thumbnail of the image. Click the thumbnail to get the original image file. A paid field also shows its extra price in brackets, for example (+200 DA).

## What it costs

Product Add-ons has no fee of its own: it is part of the Pro, Unlimited and Enterprise plans. On the Free plan, the card shows a **PRO** badge and an **Upgrade to Pro** button that opens the subscription page. See the [Pro plan](https://dzbuild.com/docs/plans/pro.md).

The extra prices you set are part of the order total, paid by the buyer like the product itself.

## For developers

The fields can also be read and replaced over the DZBuild API. A personal API key from **Dashboard → Settings → API** needs an active Enterprise plan and carries both scopes below by default; apps follow their own [access rules](https://dzbuild.dev/concepts).

| Endpoint                        | Scope            | What it does                                                                            |
| ------------------------------- | ---------------- | --------------------------------------------------------------------------------------- |
| `GET /v1/products/{id}/addons`  | `products:read`  | Returns the product's fields and its on/off switch, `enabled`                           |
| `POST /v1/products/{id}/addons` | `products:write` | Replaces all the product's fields with the list sent (at most 20) and can set `enabled` |

Add a required name at 200 DA to product 42 and switch its fields on:

```
curl -X POST https://api.dzbuild.app/v1/products/42/addons \

  -H "Authorization: Bearer $DZBUILD_API_KEY" \

  -H "Idempotency-Key: product-42-addons-1" \

  -H "Content-Type: application/json" \

  -d '{"enabled": true, "addons": [{"title": "Name to print", "input_type": "text", "max_length": 20, "extra_price": 200, "is_required": true}]}'
```

Every POST needs an `Idempotency-Key` header, and sending `"addons": []` removes every field. The [Products API page](https://dzbuild.com/api-docs/resources/products.md) lists every field, with sample responses and error codes.

## FAQ

**Can one product have several fields?** Yes. Combine them as you need, for example an image upload for the photo and a short text for the name on the same mug. The product page shows them in the order you set.

**Do the fields show on my landing pages?** No. They show on the product page of your store only. An order placed from a landing page does not collect them.

**I edited or deleted a field. What happens to past orders?** Nothing changes on them. Each order keeps the field title, the answer and the extra price as they were when the buyer ordered.

**Can the buyer send a PDF or another kind of file?** No. The upload accepts images only: JPG, PNG, GIF and WEBP, up to 5 MB.
