Contents

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:

SettingDefaultWhat it does
Show size and concentration chipsOnOff gives every option plain buttons, and cards lose the size line
Size option namesSizeThe option names to draw as bottles. Separate with commas.
Concentration option namesConcentrationThe option names to draw as chips. Separate with commas.
Concentration notesFour lines, belowOne per line, as value | explanation
Show price per mlOnEvery price per ml in the theme. See Price per ml below.
Sprays per ml150 to 20. Used for "about 150 sprays". 0 hides it.
Show the try a sample linkOn"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:

SettingDefaultWhat it does
Bottle shapeVial, atomiser or flacon, by volumeRoll-on draws a roll-on at the same heights. It suits oils and attars.
Show sprays in the size lineOnTurn 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.

VolumeBottle drawn
Under 5 mlVial
5 to 29 mlAtomiser
30 ml and upFlacon

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 pricecustom.volume_ml
Where it showsThe theme, plus Shopify's checkout and order confirmationThe theme only
What it can sayPer ml, or per any base you chooseAlways per ml
Set it up inThe variant's Pricing sectionA variant metafield (chapter 7)
Use it ifYour region requires unit prices, or you want them at checkoutYou 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.