SHOPIFY BUNDLES · NO APP · NO SUBSCRIPTION
Bundles that keep your stock counts accurate.
Every bundle sold deducts the real SKUs — so your stock counts stay true, your subscriptions keep working, and the bundle price applies to a complete set.
Built as theme code and a Shopify Function you own. No monthly per-store app fee, and no third party sitting between your customer and your checkout.
garusin-bundle.myshopify.com Password: garusin
WHAT TO CHECK
Three things worth checking in any bundle setup.
-
A synthetic SKU carries its own stock
A "Starter Kit" product with an inventory number of its own, sitting alongside the boards and wax it represents. Sell six kits and the components' counts have moved apart from the kit's — until someone reconciles them by hand, or an app reconciles them and drifts.
-
Subscriptions lose their native path
Shopify's Subscriptions APIs attach selling plans to real variants. A synthetic bundle product is not one, so subscriptions on bundles either sit outside the feature, or move onto the app's own billing and away from Shopify's.
-
The discount can outlive the bundle
Where a bundle is three line items with a discount attached, removing one can leave the discount on the other two. The usual guard is JavaScript, which holds as far as the browser and no further.
HOW THIS WORKS INSTEAD
The bundle page is a display shell.
It has no inventory of its own, and it is never what enters the cart.
-
01
Customer picks “Starter Kit”
One choice on one page, from however many kits you have published.
-
02
The cart receives real SKUs
- 1× Complete Snowboard
- stock −1
- 1× Ski Wax
- stock −1
-
03
Checkout applies the bundle price
But only if both components are still there.
Your warehouse sees two real items. Shopify sees two real variants. Subscriptions attach to them the way they always have. And the bundle price is decided at checkout by a Shopify Function reading server-side configuration — not by anything the browser can be talked into.
WHAT THAT BUYS YOU
Pricing that holds at checkout.
The bundle price is decided server-side, so it holds whatever the browser does. Measured on a live store:
| What the customer does | They pay |
|---|---|
| Buys the bundle | $679.00 |
| Deletes a component from the cart | $699.95 full price, no discount |
| Posts a crafted request skipping the UI entirely | $724.90 full price, no discount |
| Adds extra of one component | Bundle price + full price on the extras |
-
Stock counts that are simply correct
No reconciliation job, no drift, and no overselling a component because a bundle claimed inventory of its own.
-
Native subscriptions on bundles
Subscribe to a kit and every component lands on the same Shopify selling plan, in a normal Shopify subscription contract.
-
Bundles your team creates without a developer
New bundle, new pricing, seasonal swap — all of it in Shopify Admin, using native Metaobjects. No deploy, no ticket.
-
Code you own
It lives in your theme and your Shopify app. No recurring per-store licence, and nothing to migrate off if you change agencies.
WHAT IT NEEDS
Worth being straight about.
These are real constraints.
- An OS 2.0 theme, Dawn-based. The cart integration is written against Dawn's components, and vintage themes cannot do this at all.
- A Shopify Function, which means a Shopify app in your organisation. It needs no hosting — the function runs on Shopify's own infrastructure — but it does need deploying once.
- Components must be real, published products with tracked inventory.
- Subscriptions, if you want them on bundles, need every component on the same selling plan group.
WHAT'S OUT OF SCOPE
Where the scope ends.
Clear from the start, so you can plan around it.
- The cart lists each component on its own line. Customers see the board and the wax separately, with the bundle price applied at checkout. Merging them into a single line is possible via Shopify's Cart Transform API — a further piece of work, available separately.
- Bundles are curated sets you define. A "pick any 3" mix-and-match builder is a different build, and we can scope one.
QUESTIONS WE GET
Before you ask.
- Will it slow the store down?
- No. The bundle options are rendered server-side with the page. The pricing runs inside Shopify's checkout, not as a call to anything of ours.
- What happens if a component sells out?
- That bundle greys out automatically, with the missing item marked. It cannot be bought as a partial set.
- Can we run several bundles on one page?
- Yes — that is the normal case. One page, several kits, and the customer picks one.
- What if we already use a bundle app?
- The two cannot share the same products. Migration means moving bundle definitions across and retiring the app's synthetic SKUs; we would scope that first.
- Who owns it afterwards?
- You do. It is your theme and your app.
LOOK BEFORE YOU TALK TO US
The code is public. So is the reasoning behind it.
Theme code, the pricing function, 152 tests, and a written record of every decision — including the places Shopify's own documentation is wrong and the bugs we hit getting there. There is a live store to click through as well. Have your developer look at both. That is the point of publishing them.
Demo store Password: garusin
| If you want to check | Read |
|---|---|
| That the pricing really can't be gamed |
discount-app/…/bundle-logic.js and its tests
|
| How much work integration is |
docs/02-theme-integration.md
|
| What your team's day-to-day looks like |
site/instructions.md
|
| Whether we understood the tradeoffs |
docs/05-decision-log.md
|
That last one is the honest one. It records where the original design was wrong and what it cost to find out — including a bug that would have quietly sold incomplete bundles at full bundle price.
Talk to us
Tell us what you're selling and how your bundles are put together today, and we'll tell you honestly whether this is the right shape for it — including when it isn't.