GuideDecants

How to Track Decant Inventory on Shopify

Shopify counts each variant on its own, so 2, 5 and 10 ml decants poured from one bottle drift apart. Keep one number per bottle, in ml, and work out every size from it: (ml left − reserve) ÷ size, rounded down. A 10 ml sale takes 10 ml from the bottle, and every size is recounted after each order, refund and cancellation.

Updated October 3, 20266 min readBy Carboy

You list a fragrance as three variants: 2 ml, 5 ml and 10 ml. Shopify gives each variant its own stock number. All three come out of the same 100 ml bottle, and Shopify has no way of knowing that. That gap is where decant inventory goes wrong.

This guide covers why the numbers drift, the five ways shops deal with it and what each one is honestly good for, and a setup you can run by hand, in a spreadsheet or with an app.

Why per-size counts drift

Shopify tracks inventory per variant. A sale of one 10 ml lowers the 10 ml count by one and leaves the 2 ml and 5 ml counts alone, even though 10 ml just left the bottle. There are two ways to fill in those numbers, and both break.

Split the bottle between the sizes

Say you share the 100 ml bottle out as 2 ml × 10, 5 ml × 8 and 10 ml × 4. That adds up: 20 + 40 + 40 = 100 ml. Then the 10 ml sells well. After four orders the 10 ml shows sold out while 60 ml is still sitting in the bottle. You turn away sales you could have filled.

Put the whole bottle on every size

Now say you set 2 ml × 50, 5 ml × 20 and 10 ml × 10, so every size can sell the full bottle. Five 10 ml orders and ten 5 ml orders empty it, but Shopify still shows 50, 10 and 5. The next customer buys a decant you can't pour, and you send an apology instead.

On top of that, the bottle loses volume Shopify never hears about: spray tests, what stays in the syringe, the last few ml under the dip tube. Refunds and cancellations put units back on one size only, if they put anything back at all. The more fragrances and sizes you carry, the faster the numbers walk away from the shelf.

The fix is the same in every method below: keep one number per bottle, in ml, and work out each size from it. The methods differ in who does the arithmetic and how often.

The options, and what each is good for

1. Count by hand

After each batch of orders, look at the bottle and retype the size counts. It costs nothing and needs no setup, and for a handful of fragrances and a few orders a day it is fine. It stops working as the catalog grows: 30 fragrances in three sizes is 90 numbers to keep right, and between counts the store shows whatever you typed last.

2. A spreadsheet per bottle

One row per bottle with the ml left and the reserve, and a column per size. For the 5 ml, =INT((B2 - C2) / 5) gives the count. This is a real step up: one number per bottle, and the sizes come from it. The weak spot is copying. Orders don't update the sheet and the sheet doesn't update Shopify, so someone still types numbers in both directions, every day.

3. Bundle or multipack apps

These apps let one variant use up units of other items, which is how gift sets and 3-packs are usually tracked. Some shops bend them to fit decants: a hidden “1 ml” item with 100 units, and a 5 ml variant that uses five of them. If you already run one for gift sets, it can carry a few decants. Most think in whole units, though, so a 2.5 ml size doesn't fit, and you should check what happens to the hidden item when an order is refunded or cancelled before you rely on it.

4. Shared-stock apps

These keep several listings on one count, so the same physical item sold as two products sells from one number. They fit well when every sale takes exactly one unit. A decant sale doesn't: a 10 ml takes five times what a 2 ml takes. If the app lets you set how many units each variant uses, you can model ml as units and get close. Check how it rounds and how it handles refunds.

5. A measured pool

Keep the bottle as an amount, say 63 ml, and set every size from it: sellable = (ml left − reserve) ÷ size, rounded down. Every order takes size × quantity off the bottle, and then every size is worked out again, not only the one that sold. It is the spreadsheet method with the copying done for you. It needs an honest opening amount and an occasional recount, and it only pays off if the recount of sizes happens on every order, refund and cancellation.

MethodGood forWatch out for
Count by handA handful of bottles, a few orders a dayThe store is wrong between counts
SpreadsheetOne number per bottle, easy to readCopying both ways, every day
Bundle or multipack appGift sets and kits, a few decantsWhole units only, refund handling
Shared-stock appOne item sold under several listingsSizes use different amounts
Measured poolDecants, anything poured or weighedNeeds an honest opening amount

The same choice comes up for tea, coffee, spices and refills. Shared inventory across sizes compares the options for any product sold in sizes, including Shopify's own bundles.

How to set it up, step by step

These steps work by hand, in a spreadsheet or with an app. The numbers follow one bottle so you can check each one.

  1. Put the size in every variant name. Use one option, Size, with values like 2 ml, 5 ml and 10 ml. A name with a number and a unit can be read by people, spreadsheets and apps alike. Sell sealed full bottles as their own variant or product and keep them out of the decant math.
  2. Measure what's in the bottle. Not what the box says: a tester sprayed for a month is not 100 ml. Read the level against the bottle's markings, or weigh it and subtract the weight of an empty bottle of the same kind. Perfume weighs a little less than water, so weigh 10 ml from a syringe once and use that to turn grams into ml.
  3. Decide on a reserve. Keep back a few ml per bottle for testing and transfer loss. This example keeps 3 ml.
  4. Work out each size. With 63 ml in the bottle and 3 ml held back, 60 ml is sellable: 2 ml × 30, 5 ml × 12, 10 ml × 6. Those are the numbers Shopify should show.
  5. Work out every size again after every order. A 10 ml sells: 53 ml left, 50 ml sellable, so 2 ml × 25, 5 ml × 10, 10 ml × 5. All three numbers change, not only the 10 ml.
  6. Decide what a refund puts back. Shopify asks whether to restock a refunded item. Only restock what you would sell again; an opened vial usually isn't. If a 10 ml goes back, add 10 ml to the bottle and work out the sizes again. Treat a cancelled order the same way.
  7. Recount on a schedule. Weekly for your best sellers is a fair start. If the bottle holds less than your record, write the difference down as a loss. After a few weeks those losses tell you how big your reserve should be.

Steps 5 and 6 are where tracking by hand breaks. They have to happen on every order, at 2 a.m. as well as at noon, for every fragrance.

Where Carboy fits

Carboy is a Shopify app that runs the measured pool for you. You make one pool per bottle, in ml. It reads the sizes from your variant names, so Sample / 2ml and 10 ml Travel both work, and you enter what's in the bottle and what to keep in reserve. From then on each order, and each refund or cancellation you restock, moves the pool, and Carboy writes every size's number to Shopify within seconds.

Two details matter for decant shops. If someone changes a size's stock in Shopify by hand, Carboy holds that change and asks whether to add it to the pool, instead of quietly writing over it. And every night at 03:00 your time it takes in any order Shopify failed to send and checks every size against its bottle. The decant shops page shows a full example, and Getting started walks through the first pool.

Once the counts hold, the next question is price. How to price perfume decants works through cost per ml, vials and spray loss with real numbers.

Keep each bottle in ml and every size right in Shopify. Free for one pool.