A fixed bundle is two to six different products sold together at one price: the skincare routine, the starter kit, the gift box. The buying experience should be one product, one price, one line in the cart. The inventory should behave as three products. Getting both at once is the whole difficulty, and the method you choose decides it before you set a single price.
The three methods and what they do to stock
| Method | What the customer sees | Inventory | Risk |
|---|---|---|---|
| New product called "Starter kit", stock typed by hand | One product, its own page | Not linked to the components; you reconcile by hand | Overselling; components missing from sales reports |
| Shopify Bundles app (free) or an app using Shopify's Cart Transform (MixMaxer) | One product or one merged cart line, components listed | Deducted per component at the time of the order | None on stock; check the merged line in the cart |
| "Virtual product" apps that create a placeholder and adjust prices with a script | One product | Depends on the app's own sync; often delayed or broken | Overselling when the sync lags; leftovers after uninstall |
The question to ask any bundle app before installing: "When the kit sells, does Shopify itself deduct each component, or does your app adjust inventory afterwards?" The first is Shopify's bundle model (Cart Transform plus a parent product with components); the second is a workaround.
How Shopify's bundle model works
Since Shopify introduced product bundles in the platform, a bundle is a parent product whose single variant "requires components". It is not sold on its own. When the components are in the cart, a Cart Transform Function merges them into one line priced as the bundle; the order records the bundle line with its components, and inventory is deducted from each component. The free Shopify Bundles app uses this model, and so do third-party apps built on Cart Transform.
What this gives you for free:
- One cart line named after the bundle, expandable to show the components.
- Per-component inventory, tax and fulfilment data kept on the merged line.
- Correct behaviour when a component is sold out: the bundle cannot be assembled, so it should disappear from the product page and the merge does not happen.
- Reports that show the components as sold.
What it requires: Shopify's standard checkout (stores still on checkout.liquid customisations are excluded) and components with inventory tracking turned on.
Setting it up in MixMaxer
- Offers › Create offer › Fixed bundle, or the "Bundle & save 10%" template.
- Add two to six products and the quantity of each inside one kit.
- For a product with several variants, pin one (the blue mug) or leave "Any variant (customer picks)". In that case the widget shows a size or colour selector under the component, the price follows the chosen variant, sold-out variants are greyed out, and the merge uses exactly the variant chosen.
- Bundle price: a fixed price for the set, a percentage off the regular total, or an amount off. The saving is shown next to it.
- Test at checkout: put the components in the sample cart in the right quantities; the note explains the merged line and its price.
- Publish.
On publish MixMaxer creates a hidden parent product (vendor MixMaxer, tag mixmaxer-parent, one variant with "requires components"; not listed in collections, published to the Online Store channel because checkout only merges lines whose parent is available there) and registers a Cart Transform once per store. Inventory is deducted from each component, never from the parent, whose inventory policy is "continue" so it never blocks a sale by itself. If a component sells out, the bundle disappears from the product page and the merge stops. Deleting the offer deletes the hidden parent; pausing keeps it so the offer can be reactivated instantly. Help article: Fixed bundles.
Questions to settle before you publish
Should the bundle be a page of its own or a widget on the components' pages? Both, usually. The widget on each component's page ("Complete the routine, save 15%") catches the shopper who arrived for one product; a dedicated page is for ads and email. In MixMaxer the parent product is a real catalog product, so it can be linked from anywhere, and the Featured offer block can show the bundle on the home page or a landing page.
Fixed price or percentage? A fixed price ("$49 instead of $62") reads better for a set under about $80; a percentage reads better when the components' prices vary by variant. Either way, keep the saving above about 10% or it does not register, and below a third of the blended gross margin.
Which variants? Pin variants where the choice does not matter to the customer (the 50 ml not the 100 ml) and leave size and colour open. Open variants need every size in stock or the bundle shows as partly unavailable.
What happens with the extra unit? If the customer adds a second cleanser, it stays a separate line at regular price. That is correct; make sure your app does not price the extra as part of a second, incomplete bundle.
Problems and their causes
- The cart shows the components as separate lines, not one bundle. The merge needs every component in the required quantity and variant. Check pinned variants. In MixMaxer, press Re-sync on the dashboard to rewrite the transform metafield and recreate a missing Cart Transform.
- A product named after my bundle appeared in the product list. That is the hidden parent. Leave it; do not publish it to other channels or edit its variant.
- The bundle price is $0 in the widget. The fixed price is empty or the amount off exceeds the regular total.
- A discount code does not apply to the bundle. Shopify treats the merged line as one product; product-level codes aimed at a component will not match. Order-level codes apply. Per offer you choose whether the bundle combines with order and shipping codes (combining with discount codes).
- Components from different vendors or tax rates. Fine; Shopify keeps each component's tax and fulfilment data on the merged line.
FAQ
Does Shopify deduct inventory from bundle components?
Yes when the bundle is built on Shopify's bundle model: the Shopify Bundles app or an app using Cart Transform with a parent product that requires components. A manually created "bundle product" has its own stock and nothing is deducted from the components.
Can customers choose a size or colour inside a fixed bundle?
With MixMaxer yes: leave the component as "Any variant (customer picks)"; the selector appears in the widget, the price follows the choice, and the merged cart line uses that variant.
What happens when one component is sold out?
The bundle cannot be assembled: it should disappear from the product page and no merge happens at checkout. MixMaxer's widget checks availability for exactly this reason.
Does the bundle show as one line in the cart?
Yes with Cart Transform: one line named after the bundle, with the components listed under it; inventory, tax and fulfilment data stay per component.
Do I need an app, or is the free Shopify Bundles app enough?
For a simple kit at a fixed price, the free app is enough. You need an app when the set price must follow a customer-chosen variant in the widget, when you want the bundle offered on each component's page and in the cart, when you want profit per bundle in analytics, or when you also need volume tiers, gifts and mix & match in the same store.
MixMaxer: fixed bundles on Shopify's own bundle model, per-component inventory, open variants, one cart line, plus five other offer types, from $0. Install from the Shopify App Store · Fixed bundles help article. Last checked 1 November 2026.