The two kinds of bundle
A store owner messages me: "We sold a bundle, but the books inside it still show the same stock." The first thing I check is not the stock. It's what kind of bundle they have, because on Shopify there are two very different things both called a bundle.
Kind A: the real items go in the cart
The customer picks the bundle, but the cart holds the actual products, one line each, with a discount applied. At checkout Shopify sees three books, so it takes three books out of stock. Nothing extra to build, nothing to keep in sync. Frequently-bought-together offers and "complete the set" discounts usually work this way.
Kind B: a separate bundle product
The bundle is its own product with its own SKU, price, photos and stock count. The items inside are only listed in the description or linked in the background. At checkout the order has one line: the bundle. Shopify reduces the bundle's stock, if it tracks any, and the items inside don't move at all.
How to tell which one you have
Open a recent order that contains a bundle. If you see each item as its own line, it's kind A. If you see a single line with the bundle's name, it's kind B, and the rest of this article is about you.
Why a bundle product oversells
With kind B, the bundle's stock is just a number someone typed in. It doesn't know about the items it contains. So two things go wrong, often at the same time:
- The items sell elsewhere. A book sells on its own, or inside another bundle, or in a shop. Its stock drops. The bundle's number doesn't, so the storefront still says "in stock".
- The bundle sells and the items don't drop. You now have fewer books on the shelf than Shopify thinks, and the next single-book order is promised from stock that's already gone.
Merchants describe exactly this in the Shopify Community: it's worst when an item also sells on its own or sits in several bundles, and it ends in orders nobody can fulfil.
A bundle product's stock is a snapshot. It goes stale the moment anything inside it sells somewhere else.
The two settings Shopify needs
Even before you fix the sync, there's a simpler question: will Shopify stop selling the bundle at all? It only does when both of these are right on the bundle's variant:
Setting 1
Track quantity: on
Shopify keeps a count. Off means there's no number to run out of.
Setting 2
Continue selling when out of stock: off
On means customers can buy after the count reaches zero.
Shopify's own help page describes the second one plainly: it lets customers purchase products even after inventory reaches zero. That's useful for pre-orders and made-to-order items. On a bundle of physical stock, it means there is no ceiling.
The trap
Most stores fix one setting and assume they're covered. Tracking on with selling at zero still on: the count goes negative and checkout keeps working. Selling at zero off with tracking off: there's no count to hit. You need both.
The safe number for any bundle
Once both settings are right, Shopify will stop at the bundle's stock. So that number has to be one you can actually fill:
The formula
Bundle stock ≤ the lowest of (item stock ÷ qty of that item per bundle), rounded down.
Example: a set with 1 × Book A (stock 9) and 2 × Book B (stock 10). Book A fills 9 sets, Book B fills 5. The bundle's stock should be 5 at most.
The same check was suggested in the community thread as a way to spot drift: bundle availability should never be higher than the scarcest item's stock divided by the quantity per bundle. If you ship from more than one location, run it per location. A total across warehouses can show a full set that no single warehouse can pack.
Is my bundle safe?
Enter one of your bundles: the items inside, their stock, how many of each go in one bundle, and the bundle product's own settings.
Bundle checker · runs in your browser
Start from an example, then enter one of your own bundles.
Items inside the bundle
- Scarcest
The bundle product's own settings
Track quantity
Continue selling when out of stock
You can actually fill
1
Shopify will sell
No limit
Not protected. Shopify will keep selling this bundle.
Selling at zero is on, so the count can go negative. Your real stock fills 1 bundle, limited by Book A.
What to fix
- 1Turn off Continue selling when out of stock.
- 2Lower the bundle's stock from 30 to 1.
Safe number = the lowest of (item stock ÷ qty per bundle), rounded down. Uses total stock; if you ship from several locations, check each location on its own.
A 20-minute audit
This is the check I run on a store before touching anything.
- List every bundle product. Filter your products by a bundle tag, type or collection, or search for "bundle", "set" and "pack". Don't forget bundles that are hidden from collections but still live.
- Check both settings on every variant. A bundle with three variants has three sets of settings. The product export includes the inventory tracker and inventory policy for each variant, which is quicker than clicking through.
- Compare stock to the safe number. For each bundle, work out the formula above from the items inside. Any bundle above it can sell what you don't have.
- Test like a customer. Open the bundle in a private window, set the quantity to 100 and add it to the cart. A protected bundle is capped at what's available. If all 100 go in, it isn't protected. Empty the cart after; no order is placed.
- Look at the last month's orders. Any bundle orders you had to cancel, delay or substitute? That's the real cost, and it tells you which bundles to fix first.
The real fixes, ranked
Setting both switches and lowering the stock stops the bleeding. These are the fixes that keep it stopped.
1. Switch to a cart-based bundle
If the bundle can be the real items in the cart with a discount, do that. Shopify then reduces each item's stock at checkout, refunds and partial returns work on real lines, and there's nothing to keep in sync. This is my first choice whenever the bundle doesn't need its own SKU for a warehouse or a marketplace.
2. A sync that moves the items when the bundle sells
If the bundle has to stay a separate product, the items' stock needs to follow it: when an order is paid, take the right quantity of each item out; when it's refunded or cancelled, put them back. The bundle's own stock should be recalculated from the items whenever any of them changes, not typed in once. It's a small piece of code, but it has to handle edits, partial refunds and every channel you sell on.
3. A bundle app with real item sync
Many apps do this. Before you trust one, ask how it handles a refund of one item from a bundle, an order edited after checkout, stock in more than one location, and sales from other channels. Then test it with the 100-unit cart. Merchants have reported bundles in Shopify's own Bundles app whose stock didn't sync, so test even well-known tools.
Not sure which applies? Tick what's true for your bundles.
You're likely on cart-based bundles.
Shopify handles the stock. Still run the 100-unit cart test once to be sure.
What I found on 45 bundles
A multi-store book retailer in the UK, Pakistan and Saudi Arabia sold bundle products of their own: one SKU per set, with the books listed inside. A bundle whose books had one copy left still let a customer put 100 bundles in the cart. The storefront said in stock.
I checked every bundle across the three stores. 45 products were either not tracked at all, or tracked but set to keep selling at zero. Only one of the two settings had ever been set, so Shopify had nothing stopping it.
The fix: tracking on, each bundle's stock set to its scarcest book, and selling at zero turned off, on all 45. Then I tested a real 100-unit add to cart on every store, and Shopify now caps it. The stock number is still a snapshot, which is why a live item sync is the long-term fix.
Problem Clinic · Case 01
Bundles were selling stock that didn't exist
45 bundles across three stores, two settings, one real cart test per store.
See the full case and othersCustom systems
An inventory dashboard that watches stock across stores
When stock lives in several stores and channels, a dashboard that shows it in one place catches drift before customers do.
See the systems I buildField Notes
Custom Shopify app or another monthly app?
If you're weighing a bundle app against a small custom sync, this is how I compare the costs.
Read the 2-year mathWant me to look at yours? Send me a bundle link on WhatsApp and I'll tell you which kind it is and whether it can oversell.
Questions
Why didn't my component stock go down when a bundle sold?
Because the order contained one line: the bundle product. Shopify reduces stock for the variants that are on the order. If the books or items inside the bundle aren't on the order as their own lines, and nothing else updates them, their stock stays where it was.
I turned on Track quantity. Why can customers still buy at zero?
Tracking only counts the stock. Whether Shopify allows a sale at zero is a separate setting, 'Continue selling when out of stock'. If that is on, the count can go negative and checkout keeps working. You need tracking on and that setting off.
Is setting the bundle's stock to my scarcest item enough?
It stops the immediate problem, but it's a snapshot. The moment one of those items sells on its own, in another bundle, in a shop or through a manual adjustment, the bundle's number is out of date. For a lasting fix you need cart-based bundles or a sync that updates both sides.
Do bundle apps handle this for me?
Some do, by selling the components as real line items or by syncing stock. Test it rather than assume. Merchants in the Shopify Community have reported bundles whose stock didn't sync. Check what the app does on refunds, order edits, multiple locations and sales from other channels.
How do I test whether a bundle is protected without placing an order?
Open the bundle in a private window, set the quantity to 100 (or any number above your real stock) and add it to the cart. A protected bundle is capped at what's available. If the cart accepts all 100, you're exposed. Empty the cart afterwards; no order is created.
Send me one bundle link.
I'll tell you which kind of bundle it is, whether it can oversell today, and the simplest fix.