Aller au contenu

How Discount Stacking Works in Shopify: Why Native Only Applies the Highest, and How to Combine Discounts Correctly

By Stackable TeamPublished on July 15, 2026Discount Strategy#discount-stacking#checkout
How Discount Stacking Works in Shopify: Why Native Only Applies the Highest, and How to Combine Discounts Correctly

Shopify only applies your single highest-value discount by default. To stack discounts you need discounts that live in different classes, which Shopify calls product, order, and shipping, plus a rule on each discount that tells it whether it is allowed to combine with the others. Two discounts in the same class do not add together: Shopify keeps the higher-value one and drops the other. Across different classes, combining is allowed, but only when each discount explicitly opts in. There is no single "stack everything" switch, which is why so many stores show a stacked total on the cart page and then charge a different total at checkout.

This guide explains how Shopify decides what combines, why native discounts pick only the highest, the one-product-discount-per-line rule and its Shopify Plus exception, how codes and automatic discounts interact, the checkout-parity trap that costs merchants money, and a step-by-step setup with a worked example you can follow today.

Can you stack discounts in Shopify?

Yes, but only across classes, and only when you turn combining on. A discount from one class can combine with a discount from a different class, but two discounts from the same class never add up. So a volume discount (product class), a spend-goal discount (order class), and free shipping (shipping class) can all apply to the same order. What you cannot do natively is put two product discounts, two order discounts, or two shipping discounts on top of each other: when two same-class discounts could both apply, Shopify keeps the one worth more and silently ignores the rest.

The catch is that combining is off until you turn it on. Every discount defaults to running alone, so if you want your volume tier and your free shipping offer on the same order, you have to open each one and mark it combinable with the other class. Miss that step and a customer who qualifies for both gets only one.

IMAGE PLACEHOLDER (Image 1): The three Shopify discount classes
Suggested visual: A clean 16:9 diagram on a white background with three labeled columns in violet (product discount), deep gold (order discount), and slate (shipping discount). Arrows between columns show green "can combine" links across different classes and red "keeps the higher value" loops within the same class. Minimal, flat, brand colors violet and gold, sans-serif labels, no photography.

What are Shopify's three discount classes?

Every discount you create in Shopify, whether it is an automatic discount, a discount code, or one generated by an app through Shopify Functions, is assigned a class. The class controls how the discount is calculated and, more importantly, what it is allowed to combine with.

Product discounts

A product discount reduces the price of specific items in the cart. Volume tiers ("buy 3, save 15 percent"), buy X get Y offers, a percentage off a collection, and a flat amount off a single product are all product-class discounts. They attach to individual cart lines, which matters for the per-line rule covered below.

Order discounts

An order discount reduces the order subtotal rather than any one product. A spend goal like "$10 off orders over $100," a flat "$20 off your order," or a storewide percentage off the whole cart are order-class discounts. Because they act on the subtotal, only one can apply at a time. Two order discounts never combine on the same order.

Shipping discounts

A shipping discount reduces or removes the shipping cost. Free shipping over a threshold and a percentage off shipping rates are shipping-class discounts. As with order discounts, only one shipping discount applies per order.

This taxonomy matters because stacking is decided per pair of classes, not per pair of discounts. You are never asking "can these two specific offers combine." You are asking "is a product discount allowed to sit next to an order discount, and has each of them opted in." According to the Shopify Help Center, discounts only combine when they are set as combinable and belong to eligible classes, which is why the default behavior surprises so many merchants.

Why does Shopify only apply the highest discount?

This is the number one frustration merchants raise on the Shopify community forums, and it is not a bug. When two discounts in the same class could both apply to an order, Shopify does not add them. It compares them and keeps whichever gives the customer the bigger reduction, then discards the other with no warning and no line item to explain what happened.

Picture a store running an automatic "buy 6, get 10 percent off" volume discount (product class) while a customer enters a "SAVE15" code that is also product-class. Both are product discounts, so Shopify will not stack them into 25 percent. It applies the 15 percent code because it is worth more, and the 10 percent volume discount quietly disappears. The merchant, who expected the volume deal to always fire, sees inconsistent results depending on what else is in the cart.

The same happens with two order discounts or two shipping discounts: highest value wins, everything else is dropped. This is Shopify's safety default, so stores do not accidentally give away margin by piling same-class discounts on top of each other. It is sensible, but it is invisible, and invisibility is the problem. Merchants find out their discounts are not stacking only when they read a test receipt line by line, or worse, when a customer asks why they were charged more than the cart showed.

What is the one-product-discount-per-line rule?

Here is the nuance that trips up even experienced merchants. The "highest value wins" rule for product discounts is not applied to the whole cart. It is applied per cart line.

A cart line is a single product-and-variant row in the cart. Shopify allows only one product discount per cart line by default, so if two product-class discounts target the same line, that line keeps the better of the two. But two product discounts targeting different lines can both apply to the same order, because they are not fighting over the same line.

That is why a store can run "20 percent off hats" and "buy 2 t-shirts, get 1 free" at the same time: the hat discount lands on the hat lines, the t-shirt offer lands on the t-shirt lines, and both apply. What you cannot do on a standard plan is put two product discounts on the same t-shirt line.

The Shopify Plus exception

Stacking two product discounts on the same cart line is possible, but only on Shopify Plus, and only with a tag-based mechanism Shopify calls same-line stacking. According to Shopify's developer documentation, same-line product-on-product stacking uses a tag match and is a Shopify Plus feature. If you are not on Plus, treat "two product discounts on the exact same item" as off the table, and design your offers so competing product discounts target different products.

This is worth saying plainly because a lot of marketing copy implies you can freely stack any two product deals. You cannot. Cross-class stacking (product plus order plus shipping) works on every Shopify plan. Same-class product stacking on one line does not, unless you are on Plus.

How do discount codes and automatic discounts interact?

Codes and automatic discounts follow the same class rules, with a few extra limits at checkout.

An automatic discount and a code can combine if they are in eligible classes and both are set as combinable, exactly like any other pair. A product-class code and an order-class automatic discount can stack. Two product-class discounts, one a code and one automatic, cannot stack on the same line: highest value wins.

At checkout, Shopify caps how many codes a customer can enter at up to 5 product or order discount codes plus 1 shipping discount code per order. Automatic discounts do not count against that limit, but they still follow the class-combination rules, so a customer only ever sees the codes actually allowed to combine given their classes and settings. Everything that conflicts is resolved by the highest-value rule.

The practical takeaway: codes are not a shortcut around stacking rules. A code is just another discount with a class. If you want a code to combine with your automatic volume tier, the two must be in different classes and both must be marked combinable.

Why does the discount show in the cart but not at checkout?

This is the trap that costs stores real money, and it is the most common complaint about discount apps in general. The cart page and the checkout are, in many apps, two different systems calculating discounts two different ways.

Many discount apps compute the stacked total using JavaScript on the cart page or a theme widget. That preview looks perfect. Then the customer clicks checkout, and Shopify's checkout, which does not run that theme JavaScript, recalculates with its own rules. If the two disagree, the customer sees one number in the cart and a different number at checkout. Undercharging costs the merchant margin; overcharging costs the sale. It gets worse with accelerated checkouts: Shop Pay, Apple Pay, and Google Pay skip the cart page entirely, so theme-based discount logic never runs for those buyers and the discount silently fails.

The only reliable fix is to compute discounts server-side, inside Shopify's own checkout pipeline, so there is one source of truth. That is what Shopify Functions are for. A discount built on Shopify Functions runs the same calculation whether the buyer is on the cart page, the checkout page, or an accelerated checkout, because a single engine does the math. The cart preview and the final charge cannot drift apart, because they are the same computation.

IMAGE PLACEHOLDER (Image 2): Cart total versus checkout total
Suggested visual: A 16:9 split-panel illustration. Left panel labeled "Theme JavaScript" shows a cart with a stacked total of $92 and a small red warning. Right panel labeled "Shopify checkout" shows the same cart charging $110 with a red mismatch badge. A center divider with a broken chain icon. Below, a green banner reads "Server-side Functions: one total, everywhere." Brand colors violet and gold, flat vector style, no photography.

Worked example: stacking a volume tier, an order discount, and free shipping

Let us make this concrete. A customer builds this cart:

  • 3 wireless earbuds at $40 each, subtotal $120
  • Standard shipping normally costs $8

The store is running three offers:

  1. A volume discount: buy 3 or more earbuds, get 15 percent off (product class)
  2. A spend goal: $10 off orders over $100 (order class)
  3. Free shipping on orders over $75 (shipping class)

All three are in different classes, so they are eligible to combine, provided each one is set to combine with the others. Here is how the math plays out compared with Shopify's default behavior.

With stacking configured correctly, the customer pays $92.00 and gets free shipping. With Shopify's out-of-the-box default, where combining is off, only the single highest-value discount applies. That is the $18 volume discount, so the customer pays $102 and still pays $8 shipping, for a total of $110.00. The order discount and the free shipping never fire.

The $18 gap between $110 and $92 is the difference between "I turned on stacking" and "I assumed Shopify would just do it." Multiply that by a BFCM weekend and the stakes are obvious.

How to set up stackable discounts in Shopify, step by step

You can do a lot of this with native Shopify discounts if you are careful. Here is the reliable sequence.

1. Decide the class of each offer

Write down every offer and tag it product, order, or shipping. This tells you instantly which offers can combine (different classes) and which will fight (same class). Two product deals targeting the same items will never stack on a standard plan, so plan around that now, not at checkout.

2. Keep competing discounts in different classes

If you want two things to add together, make sure they are not the same class. Want a percentage off products plus a dollar amount off the order? Good, those are product and order, they can combine. Want two percentages off the same product? That is two product discounts on one line, which needs Shopify Plus. Restructure one of them, for example turn the second into an order discount, so they live in different classes.

3. Turn on combining for each discount

In the Shopify admin, each automatic discount and code has a "Combinations" section where you check which other discount types it can combine with. This is off by default. Open every offer that should stack and explicitly allow it to combine with the relevant classes. If you skip this on even one offer, that offer runs alone.

4. Mind the per-line and per-order limits

Remember: one product discount per cart line, one order discount per order, one shipping discount per order, and a maximum of 25 active automatic function-based discounts per shop. Do not design a promotion that needs two order discounts to stack, because it cannot.

5. Test both a should-apply and a should-not-apply cart

Build a real test cart that qualifies for all your offers, place a draft or test order, and read the checkout summary line by line to confirm every expected discount is there. Then build a cart that should get only some of them and confirm the others correctly stay off. Silent failures are the enemy: a discount that never fires also never errors.

6. Verify the accelerated checkouts

Run the same test cart through Shop Pay. Native or Functions-based discounts apply identically; discounts that rely on theme scripts are where you catch the cart-versus-checkout mismatch before your customers do.

IMAGE PLACEHOLDER (Image 3): The three combine switches on an offer
Suggested visual: A 16:9 product screenshot mockup of the Stackable campaign editor Stacking step. Show an offer with three labeled toggle switches, "Combine with product discounts," "Combine with order discounts," and "Combine with shipping discounts," two switched on and one off, with a plain-English summary line beneath reading "This offer stacks with order and shipping discounts." Clean Shopify Polaris admin styling, brand accent in violet. Reference the docs/screenshot-manifest.md slot discount-stacking-step-1 to capture the real screen later.

Run this reliably with Stackable

If you would rather not hand-audit combinable checkboxes across dozens of offers and test-order every permutation, this is exactly the problem Stackable was built to solve, and it does it honestly within Shopify's real rules.

  • Every offer has three combine switches, one each for product, order, and shipping discounts. They map one to one to how Shopify decides combinations, so what you set is what checkout does. There are no hidden defaults to discover with a test order.
  • A cart simulator runs a sample cart through every active offer before you go live and shows the exact line-by-line total, plus which offers fired and which did not and why.
  • The math runs inside a Shopify Function, so the cart page, the checkout page, and accelerated checkouts like Shop Pay all compute the identical total from one engine. There is no theme-versus-checkout drift to chase.
  • Stackable never changes your product prices. Discounts exist only as checkout adjustments, so uninstalling leaves your catalog exactly as it was.

Install Stackable free and see cart, checkout, and Shop Pay agree to the cent at usestackable.com/pricing. 🚀

The bottom line

  • Shopify applies only your single highest-value discount by default. Stacking is not automatic; it is a setting you turn on per offer.
  • There are three discount classes: product, order, and shipping. Discounts combine across classes, never within the same class, where highest value wins.
  • Product discounts follow a one-per-cart-line rule. Two product discounts on the same item stack only on Shopify Plus, using tag-based same-line stacking.
  • Discount codes obey the same class rules, with a checkout cap of 5 product or order codes plus 1 shipping code per order.
  • The cart-versus-checkout mismatch happens when discounts are calculated in the theme instead of server-side. Shopify Functions keep one total everywhere, including Shop Pay.
  • Always test both a cart that should get every discount and one that should not, and read the checkout summary line by line. Silent failures never throw errors.
  • Tools like Stackable expose the three per-class combine switches directly and preview the exact total before you go live, so what you configure is what checkout charges.

Questions fréquentes

Trouvez les réponses aux questions courantes

  • Yes, but only across the three discount classes (product, order, and shipping), and only when each discount is set to combine. A volume discount, an order discount, and free shipping can all apply to one order. Two discounts in the same class do not stack: Shopify keeps the higher-value one and drops the other. Combining is off by default, so you must turn it on for every offer that should stack.

  • When two discounts in the same class could both apply, Shopify does not add them together. It compares them and keeps whichever reduces the price more, then silently discards the rest. This is a deliberate safety default so stores do not give away margin by piling same-class discounts on one order. The fix is to put competing offers in different classes and mark each one combinable.

  • Not on the same cart line on a standard Shopify plan. Only one product discount applies per line, so two product-class percentages on the same item resolve to the higher one. Two product discounts targeting different items can both apply. Same-line product-on-product stacking is a Shopify Plus feature that uses tag matching.

  • They do if the discounts are native or built on Shopify Functions, because the math runs server-side and applies identically across every checkout path. If your discounts rely on theme JavaScript, accelerated checkouts often skip that code and the discount silently fails. Always test a real cart through Shop Pay to confirm.

  • Shopify's checkout accepts up to 5 product or order discount codes plus 1 shipping discount code per order. Codes still follow the class-combination rules, so entering multiple codes does not override the highest-value logic. Codes in the same class will not stack; only eligible, combinable codes across different classes apply.

  • Most likely your cart total is calculated by theme JavaScript while checkout recalculates with Shopify's own rules, and the two disagree. Accelerated checkouts skip the cart page entirely, so theme-based discounts never run for those buyers. Computing discounts server-side with Shopify Functions removes the mismatch because one engine calculates every total.

  • A class is the category Shopify assigns to every discount: product, order, or shipping. Product discounts reduce specific items, order discounts reduce the subtotal, and shipping discounts reduce shipping cost. The class controls what a discount can combine with. Stacking is decided per pair of classes, not per pair of individual offers.

  • Yes, if they are in eligible classes and both set as combinable. For example, an automatic order discount can combine with a product-class code. But an automatic product discount and a product-class code on the same line will not stack; the higher-value one wins. Turn on the combinations setting on both discounts.

  • Leave the combine settings off, which is the default. In native Shopify, do not check the other discount types in the Combinations section. In Stackable, leave the three combine switches off, so the offer runs alone. If you want two same-class offers to never both apply, that is automatic, since same-class discounts never stack anyway.

  • Yes. Shopify allows a maximum of 25 active automatic function-based discounts per shop. At checkout, one product discount applies per cart line, one order discount per order, and one shipping discount per order. Plan promotions within these limits, because a design that needs two order discounts to stack cannot work.

  • Not necessarily. Native Shopify discounts let you set combinations without code, and apps built on Shopify Functions handle the class rules for you. You need a developer only if you are writing custom Shopify Functions from scratch. With native discounts or a Functions-based app, the setup is checkboxes and testing, not code.

  • Stacking itself does not, as long as the math is server-side so cart and checkout agree. Problems come from apps that mutate product prices or render discount text as heading tags. Look for a solution that computes discounts as checkout adjustments only, never rewrites catalog prices, and renders storefront widgets without injecting extra H1 tags.

Stackable Team

The team building Stackable, the reliability-first bulk and volume discount app for Shopify. We write about discount stacking, Shopify Functions, and how to run promotions that hold up at checkout.

Nous utilisons des cookies essentiels pour faire fonctionner ce site et, uniquement avec votre autorisation, des cookies d'analyse pour comprendre le trafic. Consultez notre Politique de cookies.