Why your Shopify discounts won't combine (and how to fix it)
Published August 9, 2026 · 7 min read
It’s the most common discount “bug” on Shopify, and it isn’t a bug: two discounts that each work perfectly on their own refuse to apply together. No error, no warning — the cart just shows one discount where you expected two. This guide explains the actual rules Shopify uses to decide whether discounts combine, the five situations that look like failures but are defaults, and how to fix each one.
The 30-second version
- Discounts don’t combine by default. Combining is opt-in, per discount, in each discount’s Combinations settings.
- Opt-in must be mutual. Discount A allowing product discounts does nothing unless discount B also allows A’s class. One-sided settings are the top cause of “I enabled combinations and it still doesn’t stack”.
- When discounts can’t combine, Shopify applies the best one for the customer and silently drops the rest. A discount “disappearing” usually means it lost this comparison.
- Shipping discounts never combine with other shipping discounts. Every other class pairing is possible.
- Discounts created by apps follow the same rules — through the API, all three
combinesWithflags default to off unless the app sets them.
How Shopify decides: classes plus mutual opt-in
Every discount — native or app-created, code or automatic — belongs to one or more discount classes: product, order, or shipping. Whether two discounts can apply to the same checkout depends on their classes and on each discount’s combination settings:
| Combination | Possible? |
|---|---|
| Product + product (different items) | Yes |
| Product + product (same item) | Shopify Plus only |
| Product + order | Yes |
| Product + shipping | Yes |
| Order + order | Yes |
| Order + shipping | Yes |
| Shipping + shipping | Never |
The part that trips everyone: a pairing being possible doesn’t make it happen. Both discounts have to declare, in their own settings, that they combine with the other one’s class. Think of it as a handshake — either side declining quietly vetoes the pair.
Five “bugs” that are actually defaults
1. The second automatic discount never shows up
You run “10% off orders over $100” and add “15% off sneakers”. Carts with sneakers only ever show one of them. Neither discount opted into combining, so Shopify picks whichever is worth more to that specific cart and drops the other — that’s the best-discount rule, and it’s silent by design. Fix: open both discounts and tick the matching boxes under Combinations.
2. A discount code “stops working”
A shopper enters a valid code while an automatic discount is on the cart, and the code appears to do nothing. Same rule: the code and the automatic discount weren’t set to combine, so only the better of the two survives. The shopper, who can’t see any of this, reports the code as broken. For what it’s worth, the ceiling is generous once combining is configured: up to 5 product or order discount codes plus 1 shipping code on a single order.
3. An app’s discount refuses to stack with anything
Discounts created through the API carry a combinesWith object with three flags — orderDiscounts, productDiscounts, shippingDiscounts — and all three default to false. If the app never exposes them, its discounts are permanent loners no matter what you configure on your other discounts (remember: mutual). When evaluating a discount app, ask where its combination settings live. If the answer is “it doesn’t have any”, this paragraph is your future support ticket.
4. Free shipping plus a shipping discount
A free-shipping-over-$75 promotion and a $5-off-shipping code will never apply together — shipping + shipping is the one pairing Shopify never allows, with no setting to change it. Design shipping promotions so only one is meant to win at a time.
5. It combined yesterday, but not today
Combination eligibility is evaluated per cart, at checkout time. A pair that stacked on yesterday’s cart can fall back to best-discount-wins on today’s because the contents changed, a discount’s conditions stopped matching, or a scheduled discount started or ended. If stacking behavior seems flaky, diff the carts before blaming the configuration.
Fixing it, step by step
- List every discount that could touch the same cart — automatic and codes, native and app-created. (A store can run up to 25 active automatic discounts, app-created ones included, so this list is longer than most people expect.)
- Decide which pairs should stack. “Everything combines with everything” is rarely the intent — it usually double-discounts the same items.
- Open each discount in the pair and enable the other’s class under Combinations. Both sides, every time. For app-created discounts, do it in the app’s own settings.
- Test with a cart that qualifies for both before shoppers do. Check the checkout total, not just the cart page.
combinesWith flags, the rules list shows a plain-language warning banner when two active rules can’t stack (“Some active rules won’t stack” instead of a silently different total), and the built-in simulator shows which rule fires on a sample cart — and why a discount didn’t apply — before anything goes live.FAQ
Why is my automatic discount not working at all?
If it’s not a combination loss, check in this order: the discount’s active dates (scheduled discounts show as Active only inside their window), its minimum requirements against the actual cart, whether the cart’s currency changes a threshold’s real value on a multi-currency store, and whether another discount is simply worth more — the best-discount rule again.
Can two order discounts stack?
Yes — order + order combinations are supported (with eligibility requirements), as long as both discounts opt in. The only pairing with no opt-in at all is shipping + shipping.
Do discount codes stack with automatic discounts?
They can, if the code and the automatic discount both allow each other’s class. By default they don’t, and the better deal wins.
Does this apply to Shopify Functions discounts?
Yes. Discounts created by Functions-based apps are real discounts with classes and combinesWith flags, and follow exactly the rules above. If you’re migrating old Script logic, this is the area where checkout totals change most often — see our Scripts-to-Functions migration guide.
See the conflict before your shoppers do
DiscountForge builds tiered, BOGO, customer-tag, and free-shipping rules on Shopify Functions, flags stacking conflicts between active rules in plain language, and lets you run any sample cart through the simulator to see exactly which discount applies and why. The Free plan runs one active rule on a live store — enough to test your whole combination setup.