Can you stack discounts on Shopify? What stacks, what does not
Shopify discount stacking explained: product vs order vs shipping discounts, automatic plus code, combination flags, BXGY limits, app conflicts, and a test plan.
InventoryX is in development and not available today. ClearStock is the live Shopify app.
Yes, Shopify discounts can stack — but only when both discounts explicitly permit it, and only within the rules of their discount class. Stacking is not a global setting; it's a per-discount permission that has to agree on both sides of every pair. That's why two discounts can work perfectly in isolation and produce nothing when combined, and why a customer who expected 30% off walks away with 20%.
The structure below is the part worth internalising: Shopify sorts every discount into a class, resolves each class in a fixed order, and only lets two discounts touch the same cart if each one's combination settings allow it.
The three classes
| Class | What it discounts | Typical example | Resolves |
|---|---|---|---|
| Product | Specific line items | 20% off all knitwear | First, against line prices |
| Order | The cart subtotal | $15 off orders over $100 | After product discounts reduce lines |
| Shipping | The delivery charge | Free shipping over $75 | Last, against the shipping line |
The order of resolution is what makes stacked percentages smaller than they look. A product discount reduces line prices first; the order discount then computes its percentage against the already-reduced subtotal. So 20% off products plus 15% off the order is not 35% off:
Cart $120. Product discount 20% → $96.00. Order discount 15% of $96.00 → $14.40 off. Total: $81.60. That's 32% off the original — three points less than the sum of the two percentages, and roughly $3.60 per $120 that the customer assumed they were getting.
The gap grows with depth and with cart size. On small carts it's noise; on a $400 cart with deep discounts it's a support ticket.
Automatic plus code: the pair everyone asks about
An automatic discount and a discount code are two separate objects and can both apply to one order — if both are configured to combine. The permission has to be set on both: the automatic discount's Combinations section and the code's Combinations section must each allow the other's class.
At the time of writing, the checkout accepts one discount code, so the reachable combinations are: one automatic plus one code, two automatic discounts, or one automatic plus a shipping discount. Two codes on one order is not a thing you can configure your way into.
The practical consequence for campaign design: if you want a code to work alongside your site-wide automatic sale, tick the combination boxes on both before launch. Doing it after the emails go out means a morning of refunds.
The combination matrix
Read it as: can these two apply to the same order? "Yes" means both must permit the pairing, not just one.
| Automatic product | Automatic order | Automatic shipping | Code (product) | Code (order) | |
|---|---|---|---|---|---|
| Automatic product | No — one code field at checkout product combining | Yes, if both allow each other's class | Yes | Yes, if both allow | Yes, if both allow |
| Automatic order | Yes, if both allow each other's class | Yes, if both allow order combining | Yes | Yes, if both allow | Yes, if both allow |
| Automatic shipping | Yes | Yes | Usually one shipping discount wins | Yes | Yes |
| Code (product) | Yes | Yes | Yes | Yes, if both allow | Yes, if both allow |
| Code (order) | Yes | Yes | Yes | Yes | One code field, at the time of writing |
Two rows deserve a warning. Two shipping discounts don't usefully double — the cheaper outcome for the customer wins, and you shouldn't build a promotion that assumes otherwise. Two codes can't be entered, so any promotion requiring a second code needs to be rebuilt as an automatic discount or as a single code with a deeper value.
What doesn't stack, and why
- Gift cards. Discounts generally don't apply to gift card products. A cart that is 90% gift card won't behave the way a spend-threshold promotion assumes.
- Discounts and price edits are cumulative, not "stacked". If you drop the price and leave an automatic discount running, the customer gets both. Nothing checks whether that was intended. This is the most expensive stacking mistake in small stores, because the two mechanisms were configured a week apart by different people.
- Draft orders ignore automatic discounts. At the time of writing, automatic discounts don't apply to draft orders; the merchant enters a discount on the draft manually. Wholesale orders built as drafts therefore bypass your stacking entirely.
- BXGY has a trigger. A buy-X-get-Y discount requires both halves to be in the cart. It can combine with other discounts if permitted, but the "free" item is discounted by its own value at the time it applies — stacked with a product discount, the free item may already be cheaper, which changes what the free unit is worth.
- Some app discounts bypass the native system. Apps that apply discounts by editing line items, creating draft orders, or rewriting the cart with a cart transform are not bound by Shopify's combination flags. Two app discounts, or an app discount plus a native one, can produce a total neither was designed for.
App conflicts: the invisible stack
If you've ever seen a cart total that no visible combination explains, suspect an app. The patterns:
- Line-item rewriting. The app changes line prices directly, so the cart shows a manual discount rather than a discount object, and your combination rules never evaluated it.
- Cart transform. Bundle apps can replace cart lines before discounts settle. The discount was computed against products that no longer exist as separate lines, so the result can be partial or absent.
- Draft-order-based checkout. Some flows build a draft order and send the customer to it — automatic discounts don't follow.
- Subscription apps. Recurring orders apply the discount from the subscription contract, not from the cart, so store-wide promotions may not reach renewals.
The only reliable way to know is to test the actual configuration in the actual checkout. Reading settings tells you intent; the checkout tells you outcome.
The test plan
Run this once per promotion, in a private window, as a guest, in your main market. Fifteen minutes.
- Each discount alone. Add a qualifying cart, apply discount A only, note the total. Repeat for discount B only.
- Both together. Same cart, both live. Compare against the arithmetic you expect — not against "should be more."
- Threshold edge. Cart at exactly the minimum, then one cent under. Both must behave as designed.
- Ineligible item in cart. Add an excluded product. Confirm the discount touches only the eligible lines and the badge still makes sense.
- Shipping discount alone and stacked. Confirm which shipping outcome wins.
- BXGY with a stacked discount. Confirm the free item's value is what you expected after the other discount applies.
- With each app in play. Disable the bundle app; retest. If the result changes, you've found the conflict.
- Each market. Same cart in each currency. Fixed-amount stacking is where currency rounding bites.
- Record the totals. A table of expected vs actual for the nine scenarios is the only artifact that survives staff turnover.
Row 9 matters more than it looks. Stacking rules are configuration, and configuration has no memory. The table in your promotion doc is the only place that says what this combination was supposed to produce.
Designing promotions that don't over-stack
Three rules that prevent the expensive surprises:
- One discount class per campaign. If the campaign is a product-level markdown, don't also run an order-level threshold. Two classes stack multiplicatively and the depth compounds past what the margin supports.
- Set the margin floor first, then the discount. The deepest permitted combination should still clear your clearance floor; if it doesn't, the combination is wrong regardless of how the campaign reads.
- Audit live discounts monthly. Stale automatic discounts are the most common cause of unintended stacking, because they're invisible unless you open the Discounts list. A discount that ended in March but was never set to expire will still be combining with your November code.
Common questions
Can you stack two discounts on Shopify? Yes, when both discounts permit it in their combination settings. Each discount carries its own permissions for product, order, and shipping discounts, and a pairing only applies if both sides allow it.
Can I combine an automatic discount with a discount code? Yes, if both are configured to combine. The checkout takes one code at the time of writing, so the pairing to design for is one automatic plus one code — and both need the combination boxes ticked before launch.
Do two discount codes stack? Not at the checkout level, at the time of writing — there's a single code field. If a promotion needs the effect of two codes, rebuild it as one automatic discount plus one code, or as a single code at the combined value.
Do stacked discounts apply to the original price or the discounted price? Sequentially: product discounts reduce line prices first, then an order discount computes on the reduced subtotal. That's why 20% plus 15% lands at roughly 32% off, not 35%.
Why do my discounts stack in the cart but not at checkout? Usually a cart-drawer or bundle app displaying its own arithmetic, or a cart transform rewriting lines between cart and checkout. Test with the app disabled to confirm the source, then follow the ordered causes in why a discount isn't showing.
Next step: open Discounts, sort by status, and list every active automatic discount. Then write, beside each one, the class it belongs to and whether it's allowed to combine. Any discount you can't classify is one you can't predict — and that's the one that will stack with something in December. The mechanics behind each object are in how automatic discounts work.