One checkout, 2–10 products, one payment. Buyers tick what they want, every item delivers on its own, and the price is worked out on the server rather than in their browser. This page covers what a buyer sees, the two bundle discount rules and how they differ, how to build one, and when a cart is the wrong shape.
Two names, one thing. In the dashboard this offer type is labelled Bundle. This page calls it a cart, and keeps the word bundle for one of the two pricing rules a cart can carry — the fixed bundle, one price for the complete set. So a cart may or may not have a bundle price on it. Where you see “Bundle” in the dashboard, read “cart”. Selling one thing with add-ons? See bumps & upsells.
01 — The idea
What a cart is
A cart offer is one checkout page carrying several products. The buyer ticks the ones they want, and pays once. They get one receipt, one invoice with a line per item, and each item delivers on its own.
It is the right shape when someone should be able to choose — a course plus optional workbooks, a set of templates people buy in different combinations, a launch where three things go out together.
Products
2–10each listed once
Quantities
1–99per item, if you allow it
Discount rules
Oneper cart, two kinds
Payment
Card & PayPalone charge for the basket
02 — Their side
What the buyer sees
One page, one decision at a time, one payment. Nothing is charged for an item they did not tick, and nothing is delivered for one either.
Two items ticked and one left alone. The untouched item is never charged and never delivered — there is no partial state to reconcile later, because the basket the buyer sees is the basket the server prices.
03 — The part that matters
The price is not in the browser
When a buyer ticks a box, their browser tells us which products they picked — never what those products cost. The total is worked out on the server, from your prices, every time.
That is testable rather than reassuring. Send the quote endpoint a selection with a total of one cent attached and a fabricated discount of NZ$999, and the correct total comes back: the amounts in the request are ignored because they are never read. Ask for more of something than you allowed, or for a product that is not in the cart, and it refuses and says which.
A cart quote request carrying a fabricated total, discount and unit price meets three separate fates: the amounts are dropped because they are not on the endpoint's validation allowlist, the impossible selections are refused with a stated reason, and only the buyer's choices — which products, how many, a coupon code and the tax fields — survive. From those choices CartPricer rebuilds the total in a fixed order, lines then bundle rule then coupon then tax, reading the price from the merchant's own product rows; that figure is written to the order and is the amount Stripe is asked to charge. The one thing the buyer still controls is the tax jurisdiction: country, postal code and tax id are self-declared and nothing verifies them.
Why this is worth a section. A checkout that trusts the browser can be edited by anyone who opens developer tools. Every cart total, every quantity limit and every discount is decided server-side, so the worst a determined buyer can do is get a correct price.
04 — Bundle pricing
The two discount rules
A cart carries one discount rule, and there are two kinds. They sound similar and they count completely differently — this is the thing to get right.
Same basket, two rules, two answers. "% off when they buy several" counts units, so three copies of one product qualifies. "One price for the whole set" needs one of every product, so three copies of one does not.
"Take any three, save 15%"
A percent threshold: pick a minimum number of items and a percentage. It counts units, so three copies of one product hits a three-item threshold. Use it when you want the basket to get bigger — it rewards quantity without caring which things.
"All five for NZ$199"
A fixed bundle: one price for the complete set. It needs one of every product in the cart, so it is an all-or-nothing decision rather than something a buyer edges towards. Use it when the set is the product and you want to anchor against the separate total.
The server refuses a bundle price that is not a discount. Set a fixed bundle at or above what the items cost separately and it will not save — because it would not be a bundle, it would be a surcharge with a friendly name. The message tells you both numbers.
Nothing can take a charge below NZ$0.50, which is Stripe's minimum rather than a GoCushy opinion. It sits underneath both rules.
05 — Doing it
Building one
Two ways in, and neither is the lesser one. Both write the same offer and both are held to the same server-side rules.
The dashboard wizard and a sentence to your agent produce the same offer. Use whichever suits the moment — the wizard when you are thinking in a list, the sentence when you already know what you want.
Say this to your agent
Make a cart called "Creator Bundle" with my Joinery Course at NZ$49, the Measured Drawings pack at NZ$19, and the Bench Review call at NZ$99. Let people buy up to three drawings packs. If they take three or more items, take 15% off.
Ask it to read the cart back afterwards if you want to check what it built, or open the offer in your dashboard and look at the items there.
06 — After the sale
Delivery, per item
Each product in a cart delivers on its own. The course link goes to the people who bought the course; the drawings link to the people who bought the drawings. Nobody receives something they did not pay for, and nobody misses something they did.
That is also why every item needs its own delivery — a link, an on-screen access note, or webhook delivery — before the cart can go live. A cart with one undelivered item is the same failure as a single offer that takes money and delivers nothing, just harder to spot.
In gocushy's New offer wizard, choosing the Bundle type replaces the single Delivery link and Access note fields with one delivery block per product, and step 1 will not advance until each block has a link or a note: the third item here, with both fields blank, is refused with "Add a delivery link or an access note — every cart item delivers on its own." Had it shipped blank, the Offers row would carry a "⚠ set delivery" chip warning that "buyers who select it receive nothing", and a buyer who ticked all three would be charged once and receive only two. The same rule answers an AI: POST /v1/offers/{id}/resume returns 422 delivery_required with "Setting this offer live would take money and deliver nothing". The one exception is an account with an active order.paid webhook, which makes every one of these fields optional.
One receipt, one invoice, a line per item. Sequential invoice numbering, your business details, tax broken out per line — the things an accountant expects, from a single payment.
07 — The rules
Limits
Rule
Why
2–10 products
Below two it is a single offer; above ten the page stops being a checkout and becomes a catalogue.
Each product appears once
Use a quantity allowance (up to 99) to sell multiples of one thing.
One discount rule per cart
Two rules on one basket means the buyer cannot tell which applied, and neither can you.
One-time products only
Carts do not carry subscriptions yet.
No order bumps on a cart
A cart already is a page of tick-boxes; add the product as another item.
Card and PayPal
PayPal takes a cart as a single order for the total. Airwallex, the currency menu and the crypto rail stay off a cart for now.
Every item must deliver
Checked before the cart can go live, and named item by item if something is missing.
A cart can carry a post-purchase upsell chain — see bumps and upsells — it just cannot carry bumps on the page itself.
08 — Restraint
When not to
When there is really one thing you want them to buy. A cart asks the buyer to make several decisions. If you know which one you want them to make, a single offer with a bump asks for one and gets out of the way.
When the extras are afterthoughts. Ten half-finished products on one page do not add up to a bundle. They add up to a page a buyer leaves.
09 — When it looks wrong
If something looks wrong
The cart will not go live
Almost always an item without delivery. The refusal names the item — give it a link, an access note, or webhook delivery.
The bundle price will not save
A fixed bundle has to be cheaper than the items bought separately. The message shows both numbers so you can see the gap.
A buyer says the discount did not apply
Check which rule you set. A percent threshold counts units; a fixed bundle needs one of every product. That distinction is the most common surprise.
The Airwallex or currency options are missing
Expected on a cart — a cart has no presentment currency to offer, so the Airwallex element and the currency menu stay off it. Card and PayPal are always there, and USDC on Base appears once the crypto rail is enabled for your account. A single offer still has the full set of rails.