# Size and concentration

Chapter 8 of the Decant user guide.

The **Variant picker** turns two of your options into something a perfume shopper can read at a glance.

* **Size** becomes bottles standing on a shelf, in true relative size, so a 1 ml vial is tiny beside a 50 ml flacon. The chosen bottle fills with the scent's family tint, and the volume and price sit under each.
* **Concentration** becomes small pointed chips, with one line of explanation below.
* Under the bottles sits the size line: **"10 ml · about 150 sprays · $4.20 per ml"**. It updates the moment a shopper chooses, and the price per ml beside the main price follows.

These are still your ordinary Shopify options and variants, so stock, prices, links to a variant and sold-out states all work as usual. They're real radio buttons too, so the keyboard and screen readers work as they do on any form.

## Settings

In **Theme settings › Size and concentration**:

| Setting | Default | What it does |
| --- | --- | --- |
| Show size and concentration chips | On | Off gives every option plain buttons, and cards lose the size line |
| Size option names | Size | The option names to draw as bottles. Separate with commas. |
| Concentration option names | Concentration | The option names to draw as chips. Separate with commas. |
| Concentration notes | Four lines, below | One per line, as `value \| explanation` |
| Show price per ml | On | Every price per ml in the theme. See **Price per ml** below. |
| Sprays per ml | 15 | 0 to 20. Used for "about 150 sprays". 0 hides it. |
| Show the try a sample link | On | "Not sure yet? Try 1 ml for $6.00." under the button |

Option names ignore capitals. If a name is in both lists, Size wins. And in the **Variant picker** block:

| Setting | Default | What it does |
| --- | --- | --- |
| Bottle shape | Vial, atomiser or flacon, by volume | **Roll-on** draws a roll-on at the same heights. It suits oils and attars. |
| Show sprays in the size line | On | Turn off for oils, which don't spray. Off in `product.oil` and `product.goods`. |

A product's template has the last word over both. On `product.oil` it's always roll-ons and no sprays, and on `product.goods` it's always plain buttons, so changing these two settings there does nothing. It's the same on the product page, in quick view and in **Featured product**.

## Writing your sizes

Create an option called **Size** with values such as `1 ml`, `5 ml`, `10 ml` and `50 ml`. A value counts as millilitres when **a number is followed by `ml`**, in capitals or not, with or without a space, or when **the value is only a number**. So `10 ml`, `1.5ML`, `1,5 ml`, `Travel 10 ml` and `10` all work.

| Volume | Bottle drawn |
| --- | --- |
| Under 5 ml | Vial |
| 5 to 29 ml | Atomiser |
| 30 ml and up | Flacon |

A bottle ten times the volume is about twice as tall, and the height stops growing at 100 ml.

> **Note:** **A bare number is read as millilitres.** The theme can't tell what `10` measures, so on a scent's Size option write the unit. Any other unit isn't read at all: `3.4 oz` gets a plain button and no sprays. If you sell in ounces, give the ml as well, `100 ml (3.4 oz)`, or fill in `custom.volume_ml`.

Some other cases:

* **A value that isn't in ml**, such as `Sample`, `3.4 oz` or `Pack of 3`, uses the `custom.volume_ml` of its first variant for its bottle. With neither, it's a plain button on the shelf with no bottle. If no value has either, the option is a row of plain buttons.
* **A discovery set** never shows a size line or a price per ml, once it has its tag (chapter 9).
* **A combination you don't sell** stays selectable, struck through, with a dashed bottle.
* **Prices under the bottles** are for the chosen concentration.

Cards use the same reading: **Show the size line** prints "1, 5 and 10 ml", or the values as you wrote them if any isn't in ml, and **Quick add the smallest size** adds the smallest in stock.

## Concentration notes

The hint under the chips matches the chosen value, ignoring capitals. A value with no line shows no hint and leaves no gap. The defaults are:

```
EDT | Eau de toilette: 5 to 15% perfume oil, light and bright.
EDP | Eau de parfum: 15 to 20% perfume oil, the everyday strength.
Extrait | Extrait: 20 to 40% perfume oil, rich and close to the skin.
Oil | Perfume oil: no alcohol, worn on the pulse points.
```

Those percentages are general guides, not facts about your perfumes, so change them to match what you make. If your option values are `Eau de parfum` rather than `EDP`, change the first word of each line to match.

## Sprays

"About 150 sprays" is the volume times **Sprays per ml**. The default of 15 is a rule of thumb, so the theme always says "about". It needs a size value in ml or `custom.volume_ml`.

## Try 1 ml

"Not sure yet? Try 1 ml for $6.00." sits under the button. It chooses the smallest size in stock for the chosen concentration, and it uses your own value and price. It's hidden when the smallest is already chosen, when the product has one size, when the product is on `product.goods`, or when **Show the try a sample link** is off.

## Price per ml

Decant shows a price per ml beside the main price, in the size line, on cards ("from $4.20 per ml", the lowest among the sizes in stock, or among all of them if every size is sold out), in the bag and in the compare table.

For each variant it uses the first of these it finds:

1. **Shopify's unit price**, printed exactly as Shopify gives it.
2. **`custom.volume_ml`**: the variant's price divided by the volume.

A variant with neither shows no price per ml and leaves no gap. **Writing `10 ml` as the option value isn't enough on its own**: that draws the bottle, but the price per ml needs one of the two above.

| | Shopify's unit price | `custom.volume_ml` |
| --- | --- | --- |
| Where it shows | The theme, plus Shopify's checkout and order confirmation | The theme only |
| What it can say | Per ml, or per any base you choose | Always per ml |
| Set it up in | The variant's **Pricing** section | A variant metafield (chapter 7) |
| Use it if | Your region requires unit prices, or you want them at checkout | You only want the comparison on your storefront |

We suggest unit prices, because they carry through to checkout. If you set both on a variant, the unit price wins.

## Set a unit price

**Where it's available:** Shopify opened unit pricing to stores in every country on 2 October 2025, and its help page names no plan restriction. Before that it was limited to France and Germany, then to the EU and Switzerland, and you may still read those limits in older articles. If you don't see **Unit price** on a variant, use `custom.volume_ml`.

**Is it required?** Shopify treats it as optional for all products, and it won't prompt you, but it warns that **displaying the price per unit is a legal requirement in some regions, and it's up to you to find out whether that applies to your business**.

To add one, in Shopify admin:

1. Go to **Products** and open the product.
2. In the **Variants** section, click the variant. Each size needs its own unit price.
3. In the **Pricing** section, click **Unit price**.
4. In **Total amount**, enter the variant's volume and choose its unit: `10` and `ml`.
5. In **Base measure**, enter `1` and `ml`, so the theme prints "per ml".
6. Click **Done**, then **Save**.

Repeat for each variant. To do many at once, use the bulk editor with its **Unit price** column added, or a product CSV with the columns **Unit price total measure**, **Unit price total measure unit**, **Unit price base measure** and **Unit price base measure unit**. Both are desktop only.

Shopify's rules to know:

* **Metric or imperial:** the units you're offered follow the **Unit system** in **Settings › General**. Your store needs the metric system to offer ml.
* **Base measure:** it must be the same kind of unit as the total, and Decant prints it as Shopify gives it. A base of 1 ml reads "$4.20 per ml", and a base of 100 ml reads "$420.00 per 100 ml", so use the same base on every variant, or a card's "lowest price per ml" can't compare them fairly.
* **One per variant:** each variant has only one unit price, and the unit is the same in all your markets.
* **It keeps itself up to date:** Shopify recalculates the unit price when you change the variant's price.

> **Note:** **Show price per ml** switches off Shopify's unit prices in the theme as well as the metafield's. If unit prices are required where you sell, leave it on. **Theme settings › Product cards › Show price per ml** only affects cards.
