How Shopify discount combinations work, and where stacking costs you margin

Shopify stacks discounts only when each allows the other's class, and two percentage order codes add up. The rules, the maths and what changed in 2026.

Author:Benson
DiscountingUpdated 12 October 202617 min read
Jump to a section

In short

Every Shopify discount is a product, order or shipping discount, applied by code or automatically. Two discounts apply together only if each one's Combinations settings allow the other's class, and by default none do. A shopper can enter five product or order codes plus one shipping code. Product discounts apply first, and two percentage order discounts are both taken from the same subtotal, so they add up.

It's the Monday after your autumn sale weekend. Finance has sent a short list of orders that went out below cost, with one question: how?

You open the first. The winter collection was on sale, as planned. On top of the sale price sits a creator's code, and the order shipped free because it cleared your threshold. The next order carries all three plus a welcome code, from a sign-up list this customer was never on.

Nobody set those discounts to combine for the sale. The creator codes were set to combine months ago, for a multi-buy offer. Someone set the welcome code to combine with everything in the spring. Shopify did exactly what the settings allowed.

This guide is about those settings: how Shopify decides which discounts apply together, the arithmetic, what changed in 2025 and 2026, and how to set combinations so a sale weekend doesn't ship orders below cost. How deep to discount, and for whom, is the subject of the discount strategy guide.

How does Shopify decide which discounts apply together?#

Two discounts apply to the same order only when each one allows the other's class in its Combinations settings. Discounts don't combine by default, so every stack on an order is one somebody switched on.

Every Shopify discount has a class and a method. The class says what it reduces: specific products, the order subtotal, or shipping. The method says how it arrives: as a code (typed, or applied by a shareable link) or automatically. Combinations work by class, so a creator's order code and your free-shipping discount stack only if the code allows shipping discounts and the shipping discount allows order discounts.

When discounts can't combine, Shopify applies whichever gives the customer the best price, and a product or order discount beats a shipping discount. The shopper sees "Discount couldn't be used with your existing discounts", or "You already have a better combination" when shipping loses.

The limits, from the same help page unless linked:

  • Codes per order. Up to five product or order codes plus one shipping code, and only one shipping discount applies to an order. Codes from shareable links count toward the five.
  • Automatic discounts. Up to 25 active at once, app-based ones included. Shopify raised the app-based cap from 5 in November 2024.
  • Channels. Combinations work through the Online Store, the Storefront API and Shopify POS, not on Facebook, Instagram, Google or other external checkouts.
  • Eligibility. Product with order, and order with order, need a store with no checkout.liquid customisations that isn't using the Licensify app. Stacking product discounts on the same line item needs Shopify Plus, and without Plus, items in a Buy X get Y discount take no further product discounts.
  • Exceptions. Custom discounts applied by hand, on a draft order or in the POS cart, ignore combination settings. App discounts combine only if the app supports Shopify's combinations API.

5 + 1

product or order codes, plus one shipping code, that a shopper can enter on one Shopify order when your combination settings allow it.

Shopify Help Center, Oct 2026(opens the source)

How does Shopify do the arithmetic when discounts stack?#

In a fixed order: product discounts first, then order discounts on the subtotal that's left, then shipping. Two percentage order discounts are both worked out on the same subtotal, so they add rather than compound: Shopify's own example is 10% and 20% off a $100 subtotal, which comes to $70, or 30% off [Shopify Help Center, Oct 2026] (opens the source).

So the class decides the total. A 10% product discount followed by a 10% order discount is 19% off, because the order discount starts from the reduced subtotal: $100, then $90, then $81. Two 10% order codes are 20% off [Shopify Help Center, Oct 2026] (opens the source).

A percentage order discount also applies before a fixed-amount one: 10% and then $20 off a $350 order leaves $295. On Plus, where two product discounts can share a line, the same order holds: 10% and then $20 off a $100 item leaves $70 [Shopify Help Center, Oct 2026] (opens the source).

Some advice compounds everything. In September 2026 an app developer, disclosing that they build a discount-rules app, posted break-even advice on the Shopify Community that put a 25% code on top of a 20% automatic discount at 40% off. That holds when one is a product discount and the other an order discount. If both are order discounts, the shopper gets 45% off [Shopify Help Center, Oct 2026] (opens the source).

Order discounts are also spread across the lines in proportion, so product margin reports carry a share of every order code, and finance may spot a stack there first.

Sale prices are a separate system. The FAQ says discounts are different from sale pricing with compare-at prices, and checkout shows only the sale price. Nothing in a discount's settings excludes items with a compare-at price, and Shopify lists "Prevent double discounting on sale prices" among the uses for a function that rejects codes.

What changed in 2025 and 2026?#

Shopify moved custom discount logic from Scripts to Functions, let Plus stores stack product discounts on one item, and added new ways to scope and test discounts. In date order:

Why does stacking cost the most at peak?#

Because that's when the most discounts are live at once, the most codes are in circulation, and the most shoppers arrive looking for one more.

35%

of orders in Signifyd's network over Cyber Five 2024 included a discount code, and the average discount rose to 28.8%, from 26.5%.

Signifyd, Dec 2024(opens the source)

Signifyd sells checkout risk and policy-abuse protection, and the sample is its own merchant network. Adobe expects US discounts of up to 30% off listed price during Cyber Week 2026 [Adobe Digital Insights, Sep 2026] (opens the source). Every code that stacks on prices like those comes off a margin the sale has already cut.

Codes you never handed out matter most. A coupon extension can try codes in the discount field at checkout, and Shopify takes up to five. Your settings decide what happens to each one it finds: if it can't combine with your sale, Shopify keeps the better of the two for the customer; if it can, it stacks. And codes created by apps follow the app's defaults, not your plan.

The second-order costs land on other people. When a creator's code loses to a better sale discount, the order may carry no trace of the creator, which matters if you pay on codes rather than links (the creator codes guide covers that choice). When a welcome code can't combine with free shipping, a new customer pays delivery on an order over your threshold.

A code can also pull a cart under your free-shipping line, which the free shipping threshold guide works through, and a welcome code reaches well beyond new customers once it's public.

What can you do with Shopify's own tools?#

Set every combination on purpose before peak, test it with real carts, and use a function for the rules the settings can't express. Each step has a catch.

1. Write a combinations matrix before the freeze. List every discount live on the sale weekend, including codes apps create, and decide each pair. Whoever owns promotions writes it; finance signs it off against the deepest stack it allows. For example:

This discountProduct discountsOrder discountsShipping discounts
The sale (automatic, product)NoNoYes
Creator codes (order)NoNoYes
Welcome code (order)NoNoYes
Free shipping (automatic, shipping)YesYesOne per order

Then set each discount's Combinations section to match. The catch: codes generated by apps (reviews, referrals, email, affiliates) arrive with the app's settings, and some apps don't expose combinations at all. Check one fresh code from every generator.

A developer can set the same flags through the Admin GraphQL API. This is the combinesWith field in the input to discountCodeBasicCreate, shared by the other discount inputs; every flag defaults to false:

"combinesWith": {
  "productDiscounts": false,
  "orderDiscounts": false,
  "shippingDiscounts": true
}

2. Build a test cart for every live discount. The code freeze guide makes this a pre-freeze step: one cart that hits every discount you'll run, on mobile, priced against your cost. Then try your codes on top, several at once. The catch: it covers the codes you know about, not old codes still live or the ones an extension finds.

3. Give every code an end date. A code without one never expires. The catch: reactivating an expired discount removes its end date, so a code switched back on for one customer quietly becomes permanent.

4. Use a function for the rules settings can't express. "No codes on sale items" or "one creator code per order" need a Discount Function that rejects codes; Shopify's tutorial keeps the last influencer code and rejects the rest. The catch: someone has to build it, a custom app needs Plus, rejection only works from an automatic discount (one of your 25 slots), and a function sees the cart and its codes, not what's running in the shopper's browser.

5. Watch which codes are applied during the sale. An unfamiliar code on the first morning is a setting you can still change. The catch: by then it has been used, and the order doesn't say whether the shopper typed it or an extension did.

Can't a hidden collection keep codes off sale items?#

Often, for product discounts. Build an automated collection of products with no compare-at price, keep it out of your navigation, and scope your codes to it instead of to the whole order.

The catches, from that thread and from how collections work. An order discount can't be scoped to a collection, so your codes have to become product discounts. The condition works on products, not variants: Shopify includes a product when any of its variants has no compare-at price, so its sale variants take the code too. Every new code needs scoping, including ones apps generate. And a sale run as an automatic discount isn't "on sale" to the collection at all. It suits a store with a few code types and sales set by compare-at price; past that, a function is the sturdier rule.

The opposite objection is that locking combinations down breaks stacks you want, such as a welcome code with a multi-buy. The matrix is per discount, so allow those pairs and price them in the test cart.

How do other platforms handle stacking?#

The defaults differ, which matters if you run more than one platform.

How Benson helps with stacked codes at peak#

Your combination settings cover the discounts you created and the codes you handed out. Benson covers the codes that arrive with a coupon extension.

See which codes extensions apply. Benson records the codes applied in each session and whether a coupon extension was there. Checkout rules lists the codes used most in extension sessions, and whether your policy lets them through, so a staff or welcome code on sale-weekend orders shows up on the first morning, not in January's reconciliation.

Decide which codes work in those sessions. With checkout code policies, on Stop and above, the strict policy means only the codes on your allowlist work in coupon-extension sessions; anything else is refused with a friendly message instead of stacking on your sale. On Shopify, no app can change what an extension shows inside checkout, so Benson's protection there works at the code level, as a Shopify discount function in the Benson app. It runs as one automatic discount, so it uses one of the 25 slots. Allow your sale code, your public codes and the codes of creators and partners you pay, keep staff and apology codes off, and decide welcome codes one by one: when extensions account for most of a code's use, Benson suggests taking it off. Shoppers without an extension still get every code you gave them.

Sample store
The strict code policy in a coupon-extension session: a code that isn't on the allowlist is refused with a message. Sample data.

Check your sale codes before the weekend. Open the readiness report: it checks your protection, compares the same moment last year and lists sale codes extension users could apply, so you can decide which stay public before your freeze.

Show your own offer first. On Own and above, the widget shows shoppers your code, verified and applied in one tap, with targeting and a stretch goal that says how much more to spend for the next reward. It's a code you created, so its combinations are the ones in your matrix, and a shopper who sees your sale code first has less reason to hunt for another.

Get protection in place before your biggest sales week, and measure it afterwards.

The peak season playbook walks through each step. Or see Benson on your store and find out which codes turn up in your extension sessions before the sale starts.

Questions merchants ask

Can you stack discount codes on Shopify?
Yes. A shopper can enter up to five product or order codes plus one shipping code on one order, but only if each discount's Combinations settings allow the other discounts' classes. Discounts don't combine by default.
Why won't my Shopify discounts combine?
Usually one side of the pair doesn't allow the other's class: both discounts have to agree. Codes generated by apps can arrive with combinations switched off. Combinations also only work on the Online Store, the Storefront API and Shopify POS, and product with order or order with order needs a store without checkout.liquid customisations.
Do two percentage discounts add up or compound on Shopify?
Two percentage order discounts add up, because Shopify works both out on the same subtotal. A product discount followed by an order discount compounds, because order discounts start from the subtotal left after product discounts.
Can I stop discount codes applying to items already on sale?
Not with a single setting. You can scope product discounts to an automated collection of full-price products, or use a Discount Function that rejects codes when sale items are in the cart. A function needs an app, and a custom app needs Shopify Plus.
Do I need Shopify Plus to stack discounts?
Not for most combinations. Plus is needed to stack several product discounts on the same line item, which Shopify added in 2026 using discount tags, and to run custom apps that contain functions.
What happened to discounts built with Shopify Scripts?
Scripts stopped running on 30 June 2026 and any that were still published were deactivated. Stacking rules that lived in a script need rebuilding as a Shopify Function.

Sources#

Find out what's leaking. 14 days of Own, no card.