Shopify's inventory system isn't broken. It's answering a different question from the one a maker is asking.
Shopify says so itself. Its guide to managing perishable inventory (opens in new tab) puts it plainly: "Shopify's core inventory management software features focus on quantities." Quantities of what? Of the things you sell: a variant, at a location, in a state such as available or committed. Shopify does that well.
Picture Wren, an illustrative candle maker who pours soy candles in a converted garage and sells them through a Shopify store and a Saturday market table. Her Shopify admin says she has 46 Cedar & Smoke 8 oz candles. It's right. What it can't tell her is that she has wax for only 11 more, that the jar she buys by the case went up 18 cents in August, or which of last month's three pours the candle a customer just emailed about came from. None of those is a Shopify bug. Shopify doesn't track raw materials you don't sell, record a production run, keep a cost per item current, or track lots, and it was never built to. The rest of this post takes those four gaps one at a time: what the gap is, what Shopify offers for it, and what actually fills it.
Shopify inventory limitations at a glance
Rule of thumb: If you buy finished goods and resell them, Shopify's native inventory is probably enough. If you make what you sell, Shopify knows how many you have, but not what they're made of, what they cost this month, or which batch they came from.
Here are the four gaps, each sourced to Shopify's own help pages and guides:
| What a maker needs | Closest thing Shopify has | Where it stops |
|---|---|---|
| Materials that get used up when a batch is made | Shopify Bundles (components are other products) | Built around selling a set, not making a batch; bundles can't contain bundles |
| A record that a batch was made | Manual adjustment with a reason | None of the seven reasons means "produced" |
| A cost per unit that follows material prices | Cost per item field | Shopify calls the field "static data" |
| Knowing which batch a unit came from | Nothing native | Shopify's own guide points to add-on software |
Shopify counts candles, not wax
The gap. Every inventory record in Shopify belongs to a product variant. Wren's 4.4 kg slab of soy wax isn't a variant. It isn't for sale, it has no price and it doesn't go in a cart. Shopify has nowhere natural to put it, so it lives in a notebook, a spreadsheet, or her memory, and her memory is the one that says "plenty" right up until it isn't.
What Shopify offers. The nearest native tool is the Shopify Bundles app (opens in new tab), and it's worth knowing exactly what it does before treating it as a recipe system. A bundle is a product made of other products: up to 30 components in a fixed bundle, up to 2,000 units of each. The eligibility page (opens in new tab) explains that "bundle inventory is determined by the inventory levels of each product included within a bundle," and "the product with the lowest inventory level determines how many bundles can be sold."
That's excellent for a gift set of three candles. It breaks down as a bill of materials in three ways:
- It models a sale, not a pour. A bundle answers "how many sets can a customer buy from the stock I have?" Wren's question is different. She uses up wax when she pours, on a Tuesday, for candles that may not sell for six weeks, and nothing in a bundle records that pour. Her wax count stays wrong in the most dangerous direction: too high.
- Components have to be products. To bundle wax, Wren would need to create "soy wax" as a product in her store, which is a strange thing to put in a catalog that customers browse.
- No layers. The eligibility page says "bundles can't contain other bundles." A maker's recipes often have layers: a fragrance-blended wax used in four candle scents, a frosting used on three cakes. A flat list of components can't express a base that is itself a recipe.
What fills it. A materials layer that records consumption when the batch is made, not when it sells. In Ardent Seller, a production run deducts each recipe ingredient from stock and raises the finished-goods count in the same step, and a subassembly such as Wren's blended wax can be its own recipe used inside others. Shopify then gets the finished quantity it is good at selling.
Making a batch is a verb Shopify doesn't have
The gap. Wren pours 24 candles. In Shopify, the only way to show 24 more candles on the shelf is to edit the number.
What Shopify offers. A manual adjustment, with an optional reason. Shopify's adjusting inventory page (opens in new tab) lists seven: Correction, Count, Received, Return restock, Damaged, Theft or loss, and Promotion or donation. "Received" is defined as "new inventory from a supplier or external source." Nothing on the list means we made these. So a production run gets logged as a correction, or as stock received from a supplier who happens to be Wren.
That matters less on the day and more in March, when she's trying to work out how many candles she made last year. Shopify's adjustment history page (opens in new tab) notes that a product's history view shows only the last 180 days, and anything older means pulling the inventory adjustment changes report. Even then, her production is mixed in with miscounts and restocks under the same labels.
What fills it. Production as its own transaction type, with a date, a recipe, a batch size and the materials it used. Then "how many did we make in Q2?" is a filter, not an archaeology project.
Cost per item is a number you type once
The gap. Shopify does have a cost field. The profit reports page (opens in new tab) even anticipates makers: "If you create the product yourself, then you can enter a value that is based on your labor and material costs." The same page then names the limitation directly: "The Cost per item field contains static data, which means that the data in your profit reports is only relevant to a specific point in time."
Put that next to Wren's August. She set her candle's cost at $6.40 in March. Since then her jar supplier raised prices, and she switched to a pricier wick after a tunneling problem. None of that reached the field, because nothing connects the field to anything. Her Shopify profit report keeps reporting a March margin on September sales.
The same page adds one more condition: "Profit is reported only for products and variants that had cost recorded at the time they were sold." A variant whose cost Wren forgot to fill in simply falls out of the profit report.
What Shopify suggests. In the same section, Shopify's own options for dynamic cost reporting are to run financials in another business system, use a reporting app, or "calculate costs, profits, and losses manually."
What fills it. A cost that's calculated, not typed in. If each candle's cost is built from its recipe (wax by weight, wick, jar, fragrance, label, minutes of labor), a new jar price changes every candle that uses that jar. The recipe-costing method is the same whether you do it in a spreadsheet or in software; the difference is whether you have to remember to redo it.
Every candle in Shopify is identical
The gap. To Shopify, 46 Cedar & Smoke candles are 46 of the same thing. In reality they came from three pours, made from two lots of fragrance oil, and one of those lots smelled faintly off.
What Shopify offers. On this one, Shopify's perishable inventory guide (opens in new tab) is unusually direct: "To manage expiration dates, lot or batch tracking, or FEFO picking rules, use an inventory tracking software like Freshly on top of Shopify." In other words: not native, by design.
For candles, a lot number is a matter of quality control. For food, cosmetics and pet treats it can be the difference between pulling 40 jars and pulling every jar you sold this year. That's the case batch tracking for food sellers walks through.
What fills it. A lot stamped on each production run, linked back to the material purchases that went into it and forward to the sales that took units out. When a customer emails about a candle, the question "which pour?" has an answer.
What Shopify inventory does well
It would be unfair, and wrong, to stop at the gaps. Shopify's native inventory has grown up, and for plenty of shops it's enough:
- Real stock states, per location. Shopify's inventory states (opens in new tab) separate On hand into Available, Committed and Unavailable, with Incoming tracked alongside. Unavailable units can be set aside for reasons like "damaged, quality control, or safety stock."
- Purchase orders and transfers in the admin. You can create purchase orders (opens in new tab) with suppliers, costs and payment terms, then create an inventory transfer from them to receive the stock. This matters because Shopify announced that its Stocky app (opens in new tab) would no longer be available after August 31, 2026, so these native tools are now the default.
- Multiple locations for a workshop, a storage unit and a market stall, each with its own counts.
If Wren bought finished candles from a wholesaler and resold them, she could stop reading here.
Do you need more than Shopify? A decision framework
Start with question 1. If it's a yes, go through all three that follow: each yes names a gap Shopify's native inventory won't fill, and the earlier the question, the more urgent the gap.
- Do you make anything you sell, from materials you also stock? If no (you resell finished goods, or you sell digital products), Shopify's native inventory, purchase orders and transfers are likely enough, and you can stop here. If yes, keep going.
- Do you sell anything where a recall or complaint would need a batch? Food, cosmetics, soap, pet products, candles. If yes, you need lot tracking, and Shopify's own guide points to separate software for it.
- Have your material costs changed since you last typed a Cost per item? If yes, your Shopify profit reports are working from old numbers. You need a cost that's calculated from your recipe, not typed in.
- Have you run out of a material mid-batch, or over-ordered one, in the last six months? If yes, the missing piece is materials inventory that gets used up when you make a batch, which Shopify doesn't keep.
If you said yes to question 1 and no to the rest, you're a maker for whom Shopify plus a costing spreadsheet still works. The spreadsheet vs. inventory software decision guide has the signs that tell you when that stops being true.
Why the order matters: Batch tracking (question 2) is the most urgent gap because it's the hardest to fix after the fact, and for food, cosmetics, soap and pet products it carries a safety consequence too. You can recalculate an old cost; you can't go back and record which batch a jar came from. In practice, the lot number is recorded when you log a production run, so logging production runs is usually the first step: tracking materials per batch (question 4) gives you batch tracking (question 2) as well.
How a materials layer fits next to Shopify
A materials layer shouldn't replace Shopify. Shopify stays the storefront and the checkout. The extra layer sits behind it and handles the four gaps above. This is the split the Ardent Seller Shopify connection is built on:
- Orders come in as sales. Paid Shopify orders import with their line items matched to your products by SKU, along with discount, tax and shipping. A clean, consistent SKU scheme makes that matching automatic; the SKU Naming & Barcode System Starter Kit is a free way to set one up before you connect.
- Production happens on the materials side. Wren's Tuesday pour is a production run: wax, wicks, jars and fragrance are deducted, 24 candles are added, and the run gets a lot number.
- Ardent Seller leaves your Shopify stock counts alone until you turn on auto push or click Push now. With auto push on, for the whole store or one listing at a time, each Shopify location you've linked gets the updated count whenever stock changes, minus an optional buffer you hold back. Ardent Seller never creates or edits a Shopify product, price or description.
- Cost follows the recipe. Each sale is matched against a cost built from the recipe, priced at what you actually paid for its materials, so profit reports show what a Shopify order earned, not what it billed.
Two honest limits: Shopify Payments fees and payouts don't import yet (record them as an expense for now), and connecting both a Shopify store and an Etsy shop needs the Artisan plan or higher. The Shopify connection itself is included on every plan, including Free. The sync guide lists exactly what moves and what doesn't.
The question to ask your own admin
Open Shopify, pick your best-selling product, and look at its Cost per item. Ask when you last changed it, and what's changed in your supplier invoices since then. If the honest answer is "I don't remember," that number has been feeding your profit reports ever since.
Shopify will keep counting what's on the shelf. If you make what's on the shelf, see how the Ardent Seller Shopify connection works and let the materials, the batches and the real costs live somewhere that understands them.
Related reading
- Recipe Costing 101 — how to cost a recipe line by line, which is the number Shopify's Cost per item field can't keep current on its own.
- Batch Tracking for Food Sellers — the lot-tracking setup Shopify's own guide sends you elsewhere for, built step by step.
- SKU Design for Small Sellers — how to create SKUs that hold up when two systems have to match the same product.
- Best Platform for Handmade Products — if you're still choosing between Shopify, Etsy and the rest, the fee math comes first.
Free resources
Two free downloads for setting up Shopify and a materials system side by side:
- SKU Naming & Barcode System Starter Kit — SKUs are how Shopify orders get matched to the products you make, so settle your scheme before connecting anything.
- Spreadsheet vs Inventory Software: The Decision Guide — if you answered yes only to question 1 of the decision framework above, this tells you when a spreadsheet stops being enough.
This article is provided for educational purposes only and does not constitute financial, tax, or business advice. Cost structures, pricing examples, and margin figures are illustrative and will vary by your specific circumstances. Consult a qualified accountant or small-business advisor before making financial decisions based on this content. Shopify is a trademark of Shopify Inc.; Ardent Seller uses the Shopify API but is not endorsed or certified by Shopify Inc. Shopify features described here reflect Shopify's help pages and guides as of October 2026.
