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.
Jump to a section
In short
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.
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:
- 17 December 2025: functions can reject codes. Discount Functions can reject codes a shopper enters, with a message at checkout, from API version 2026-01. The function reference sets the condition: rejection works only when the function backs an automatic discount. Public apps with functions run on any plan; custom apps containing functions need Plus.
- 7 May 2026: discounts by market. Any code or automatic discount can be assigned to markets, on Basic and above with the new version of Markets.
- 23 June 2026: B2B discounts on by default. Where they're newly switched on, discounts open to all customers, specific customers or segments reach B2B buyers too unless you assign markets to the discount (a Region market keeps it to non-B2B buyers), and they apply on top of B2B catalogue prices.
- 30 June 2026: Scripts stopped running. Editing ended on 15 April and execution on 30 June; scripts still published were deactivated. Scripts discounts used to ignore combination settings. If a Ruby script enforced a stacking rule on your Plus store, that rule is gone unless someone rebuilt it as a function.
- 15 July 2026: several product discounts on one item. Shopify's changelog announced that multiple product discounts can apply to the same item, codes included, grouped by the discount tags added on 1 April. Its example is a winter collection sale plus an affiliate partner's boot discount on the same boots. The changelog names no plan. The help centre and the GraphQL reference do: it's Shopify Plus only, needs product combinations on, and works only when two discounts' tags match in both directions. The API came first, in version 2026-04.
- 2 October 2026: discounts in Rollouts. On Basic and above you can launch a discount to a share of online store traffic, and on Grow and above run it as an experiment that compares its conversion with your current offer. Once a discount is in a rollout, its dates alone no longer say when it's live.
- 9 October 2026: compare-at prices for AI agents. Shopify now shares compare-at prices with AI shopping agents through Shopify Catalog, with a toggle in the Compare-at section. An agent sees the sale reduction itself, before any code.
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 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 discount | Product discounts | Order discounts | Shipping discounts |
|---|---|---|---|
| The sale (automatic, product) | No | No | Yes |
| Creator codes (order) | No | No | Yes |
| Welcome code (order) | No | No | Yes |
| Free shipping (automatic, shipping) | Yes | Yes | One 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.
#
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.
- WooCommerce. A coupon marked Individual use only can't be used with other coupons, and core has an "Exclude sale items" checkbox.
- BigCommerce. Shoppers can apply several coupons in cart and checkout since 5 January 2026. The API's number allowed per order runs from 1 to 5, defaults to 1 and is editable only on Enterprise accounts. Promotions stack unless you turn that off, the opposite of Shopify's default.
- Adobe Commerce. Shoppers can apply multiple coupons from version 2.4.7, and a cart price rule set to Discard Subsequent Rules stops lower-priority rules stacking on the same product.
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.
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.
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#
- Shopify Help Center: Combining discounts (Oct 2026)
- Shopify Help Center: Managing and editing your discounts
- Shopify developer changelog: Increased limits for automatic function-based discounts (Nov 2024)
- Shopify Help Center: Amount off discounts
- Shopify Help Center: Discount codes FAQ
- Shopify Help Center: Setting sale prices for products
- Shopify developer changelog: Discount Function support for rejecting discount codes (Dec 2025)
- Shopify developer docs: Discount Function API
- Shopify developer docs: Shopify Functions
- Shopify changelog: Assign discounts to specific markets (May 2026)
- Shopify changelog: B2B discounts are now enabled by default (Jun 2026)
- Shopify Help Center: Setting up B2B discounts
- Shopify developer changelog: Shopify Scripts will be deprecated on June 30, 2026 (Apr 2026)
- Shopify Help Center: Shopify Scripts and the Script Editor app
- Shopify changelog: Multiple product discounts on the same item (Jul 2026)
- Shopify changelog: Add tags to your discounts (Apr 2026)
- Shopify developer docs: DiscountCombinesWith (GraphQL Admin API)
- Shopify developer changelog: Multiple product discounts can apply on a single cart line (Apr 2026)
- Shopify changelog: Schedule and test discounts with Rollouts (Oct 2026)
- Shopify Help Center: Rollouts requirements and considerations
- Shopify developer changelog: Discounts can now be included in Rollouts (Oct 2026)
- Shopify changelog: Compare-at prices now shared to agentic channels (Oct 2026)
- Signifyd: Record-breaking Cyber Five shopping points to promising finish to a compressed holiday season (Dec 2024)
- Adobe: US holiday shopping season to hit record $275.1 billion online (Sep 2026)
- Aswath Damodaran, NYU Stern: Operating and net margins by sector, US (Jan 2026)
- Shopify developer docs: DiscountCombinesWithInput (API 2026-10)
- Shopify developer docs: discountCodeBasicCreate
- Shopify developer docs: Build a Discount Function that rejects invalid codes
- WooCommerce: Managing coupons
- BigCommerce: Introducing multi-coupon support in cart and checkout (Jan 2026)
- BigCommerce developer docs: Update global promotion settings
- BigCommerce developer docs: Create promotion
- Adobe Experience League: Coupon codes
- Adobe Experience League: Create a cart price rule
- Shopify Community: Before you set BFCM discounts, check where your break-even actually sits (Sep 2026)
- Shopify Community: Looking for a sales app that prevents already distributed codes and vouchers being used when a sale is on
- Shopify Community: Change discount codes to auto combine?
- Shopify Community: Combining the free shipping code with a welcome offer
- Shopify Community: How to stop discount codes stacking on items already on sale?
- Benson guide: How much should you discount, and who should get it?
- Benson guide: Should your creators get a discount code, an affiliate link or both?
- Benson guide: Where should you set your free shipping threshold and spend-and-save tiers?
- Benson guide: Is your first-order discount reaching new customers, or everyone?
- Benson guide: Your Black Friday code freeze starts soon
- Benson playbook: Peak season






