Shopify discount stacking in 2026: what combines and what doesn’t
Most confusion about stacking comes from one idea being missing. Shopify does not decide whether two discounts combine by comparing the two discounts. Each discount declares, in advance, which classes of discount it is willing to sit alongside — and both have to agree.
The three classes
Every discount on Shopify is exactly one of these, and the class is what the combination rules operate on:
- Product discounts — money off specific items, collections, or a quantity of them.
- Order discounts — money off the cart subtotal.
- Shipping discounts — money off delivery.
A discount carries three switches, one per class, and all three default to off. That default is the single most common reason a discount someone expected to stack didn’t: nobody turned anything on.
The combination matrix
| Combination | Allowed? | Condition |
|---|---|---|
| Product + Product | Yes | On different items. Same item is the special case below. |
| Product + Order | Yes | Both must allow the other’s class. |
| Product + Shipping | Yes | Both must allow the other’s class. |
| Order + Order | Yes | Both must allow the order class. |
| Order + Shipping | Yes | Both must allow the other’s class. |
| Shipping + Shipping | No | Only one shipping discount applies per order. No setting changes this. |
Shipping discounts are also applied last, after product and order discounts have been worked out. If free shipping is conditional on a subtotal, the subtotal it sees is the discounted one.
The same-item rule, which is where Plus differs
Two product discounts landing on the same line item is the one case with a genuine plan difference, and it is the thing most articles on this subject get wrong.
On Basic, Shopify and Advanced: one product discount per line item. Two product discounts can both be active, both be correctly configured, and only one will apply to any given item. There is no error and no warning.
On Shopify Plus: they can share a line — but only when the tags are reciprocal. Each discount has to list a tag that the other one carries. If discount A lists SEASONAL and B is tagged SEASONAL, that is half of it; B must also list a tag that A carries.
Why this trips people up: a one-directional tag setup looks finished. It behaves exactly like the non-Plus case — one discount applies, silently — so the natural conclusion is that the feature doesn’t work, rather than that it is half configured.
Buy X Get Y excludes more than people expect
On non-Plus plans, every product in a Buy X Get Y discount is ineligible for further product discounts — the ones the customer buys as well as the ones they get.
On Plus it is narrower: the “customer gets” product can take another product discount, the “customer buys” product cannot.
This is worth knowing because a Buy X Get Y offer is often older than whatever problem prompted the search, has been running without complaint, and is rarely the first thing anyone suspects.
The limits
- 25 active automatic discounts per store — and app-created ones count toward it.
- 5 product or order discount codes per customer, per order.
- 1 shipping discount code per order.
The 25 is the one that catches growing stores. Apps create automatic discounts on your behalf, so the count includes things you did not make by hand and will not find by scrolling your own campaigns.
Codes and automatic discounts do combine
A persistent myth says they cannot. They can — when a customer applies a code while automatic discounts are running, Shopify works out the best applicable discount or combination and applies it. The usual per-class rules still govern what is eligible, so each discount must allow the other’s class.
What actually changed recently
Two things, and conflating them is how the wrong version of this topic spreads.
- April 2026: the Admin API gained support for multiple product discounts on a single cart line. This is the reciprocal-tag mechanism above, and it is Plus-gated — not a general change. Articles reporting it as a platform-wide unlock are describing something that does not apply to most stores.
- 30 June 2026: Shopify Scripts sunset. Stores that ran stacking logic through Scripts had to move it to Functions, and some of the “stacking suddenly broke” reports around that date are migrations rather than bugs.
Deciding your own stacking policy
The technical rules tell you what is possible. They do not tell you what you should allow, and that decision is worth making deliberately rather than discovering in a monthly margin report.
- Write down the worst basket a customer could assemble — every discount you run, combined, on your highest-discount item.
- Work out its margin after shipping and payment fees. If that number is unacceptable, the fix is a combination setting, not hope.
- Turn combination on deliberately, one pair at a time. Off is the safe default and it is the default for a reason.
- Put that worst basket through a real checkout and read the total. Not the cart — the checkout.
One structural note while you are deciding: a quantity break is a product discount, so it competes for the same line item as every other product discount and combines freely with order and shipping ones. That is usually an argument for using it instead of a sitewide percentage on the same products rather than alongside it — which is how ours, TierUp, is designed to be used, and equally true of any quantity-break app. Quantity breaks vs bundles vs discount codes covers that choice properly.
Keep reading
If something is not applying right now, why your discount isn’t applying at checkout works through the causes in order. Why some discount apps break Shop Pay and your analytics explains the two ways an app can change a price, and BFCM pricing that protects your margin covers the margin arithmetic behind step 2 above.