LUCENTCOMMERCEGET A FREE STORE AUDITFREE AUDIT

FUNCTIONS · CHECKOUT · CRO · 7 SEPTEMBER 2026 · 7 MIN READ

Discount stacking and the promotions that lose money

Nothing on Shopify stacks until you tick a box. The promotions that lose money are the ones where somebody ticked every box and nobody did the arithmetic on the worst basket it allows.

A release note pinned beside the storefront it changed

Control it at the point of configuration, not in code. Shopify discounts do not combine by default: each one declares which classes it may combine with, and the platform enforces a documented set of allowed pairings across the product, order and shipping classes, a maximum of 5 product or order discount codes plus 1 shipping code on the same order, and a maximum of 25 active automatic discounts including app-based ones. Before a campaign goes live, build the most discounted basket your configuration permits, work out the margin on it, and decide deliberately whether you are happy for someone to find it. Somebody always finds it.

IN SHORT

  • Shopify discounts do not combine automatically — combinability is declared per discount, so an accidental stack is a configuration choice somebody made.
  • Shopify documents the allowed combinations: order with free shipping, product with free shipping, and product with product on separate items on any plan; product with order and order with order for eligible stores; product with product on the same line item on Shopify Plus only; and never two shipping discounts on one order.
  • Eligibility for the order-class combinations excludes stores with checkout.liquid customisations, which is a migration question disguised as a promotions question.
  • A customer may apply up to 5 product or order discount codes plus 1 shipping discount code to a single order, so your goodwill, affiliate and campaign codes are competing for the same slots.
  • The worst basket your configuration allows is a number you can calculate in an afternoon, and it is the only real test of a promotion plan.
  • Free shipping stacks with both other classes and costs a fixed amount per order, which makes it most expensive precisely on the small baskets a percentage discount barely touches.

Nothing stacks until somebody ticks a box

The useful thing to know before any promotion argument is that Shopify's default position is no. Discounts do not combine unless each one has been configured to combine, and the platform then enforces which pairings are permitted. Every unintended stack you have ever seen was enabled by a person, usually in a hurry, usually because "combines with everything" removed a conversation they did not have time for.

The documented rules are worth reading once properly, because they are not symmetric and the asymmetries are where plans fail. Shopify documents order discounts combining with free shipping discounts, product discounts combining with free shipping discounts, and product discounts combining with other product discounts on separate items. Product with order discounts, and order with other order discounts, are available to eligible merchants — which Shopify defines as excluding stores with checkout.liquid customisations, and stores using the Licensify app. Multiple product discounts on the same line item is documented as Shopify Plus only. Multiple shipping discounts never combine: one per order.

Two ceilings sit on top of that. Shopify documents a maximum of 25 active automatic discounts, app-based discounts included, and a maximum of 5 product or order discount codes plus 1 shipping discount code on the same order. Those numbers decide the shape of a campaign more often than any creative decision does.

Build the worst basket before you build the campaign

Here is the exercise that separates promotions that lose money from promotions that are simply generous. Take your configuration as it will be on the day — every automatic discount, every code in circulation, every combinability tick — and construct by hand the single most discounted order it permits. Not the one in the brief. The one the configuration allows.

Work through the classes in order. Which product discounts can land on the same item, or on separate items in the same basket? Which order-level discount can sit on top of that subtotal? Which shipping discount is still available? How many codes can the customer add, and which of those are in public circulation on a voucher site rather than in your campaign plan?

Then price it. Take a realistic basket of your own products, apply the full stack, and put the cost of goods, the pick and pack, the shipping and the expected return rate next to it. For the arithmetic: a basket where a 20% category discount, a 15% order-level code and free shipping all apply leaves you at roughly 68% of the original subtotal before any fulfilment cost, and free shipping is a cash cost that does not scale down with the basket. On a product carrying a 55% gross margin that is survivable; on one carrying 35% it is not, and the promotion is a way of buying revenue with your own money.

Nobody needs a model for this. It is one afternoon with a spreadsheet, and the output is a single number — the worst margin your configuration permits — that any commercial director can decide about.

Free shipping is the stack that hurts small baskets

Because shipping discounts combine with both other classes on any plan, a free shipping offer is the one that reliably ends up on top of everything else. It is also the only one whose cost is fixed per order rather than proportional to the basket.

That inverts the usual intuition. A percentage discount costs you most on your biggest orders; a shipping discount costs you the same on a £250 basket and a £22 one, which means it is at its most damaging exactly where margin is thinnest. A free-shipping-over-£50 rule combined with a 20% code that brings a £52 basket down to £41.60 is a small order you have now shipped for nothing, and the threshold that was supposed to protect you was measured before the discount rather than after it.

Decide explicitly which subtotal your shipping threshold reads — before or after discounts — and then check it in a real test basket rather than assuming. It is the single most common gap between what a trading plan says and what the store actually does.

The codes you forgot are in circulation

The five-code allowance sounds generous until you count what is actually out there. The welcome popup code. The abandoned cart code. The influencer codes from a campaign in March. The goodwill codes customer service issues daily, which are frequently created as combinable so that they work when a customer complains. The loyalty tier discount. The staff code.

Each of those is a live commercial instrument, and any of them marked combinable is available to be added on top of your seasonal campaign by anyone who finds it. They do get found: codes end up on voucher aggregators within hours, and a browser extension that tries fifty codes at checkout will discover a combination your team never modelled faster than your team can.

Three habits keep this contained. Put an expiry date on every code at the moment of creation, without exception. Set usage limits — one per customer, and a total cap on anything issued outside a planned campaign. And make goodwill codes non-combinable by default, so the compensation for a late delivery cannot be laid on top of a 30% site-wide sale.

Controls, cheapest first

You rarely need code to fix this. In rough order of effort:

  • Leave combinability off. It is the default for a reason. Turn it on for a specific pairing you have modelled, not as a general policy.
  • Use the thresholds you already have. Minimum spend on the order-level discount, and a shipping threshold you have verified applies to the subtotal you think it does.
  • Exclude what cannot be discounted. Full-price new season, gift cards, third-party brands under a pricing agreement — keep an exclusion collection and keep it current, because it is the thing that drifts.
  • Cap the outcome. If your discounts run through a Shopify Function, a maximum total discount percentage enforced inside it is a few lines and covers every combination you did not predict, including the ones created after you wrote it.
  • Keep the audit trail on. Expiry dates and usage limits on every code, so a promotion ends when the campaign does rather than when somebody notices.
  • Review the active list after every campaign. The 25-discount ceiling is reached by accumulation, and the store that hits it in November spends peak week rewriting a campaign structure instead of trading.

The reconciliation nobody does

After the campaign, two questions are worth an hour. Which combinations were actually used, and what did the discounted orders earn?

The first is answered from order data: group orders by the set of discounts applied and count them. It is usually revealing. A stacking route the team agonised over frequently turns out to have been used by a handful of people, while one nobody discussed accounts for a meaningful share of the discount spend. That tells you what to simplify next time.

The second is the one that changes behaviour. Take gross margin after discount, after shipping cost, after the return rate on discounted goods — which tends to be higher than on full price, so use your own figure rather than the site-wide average — and compare it with an ordinary trading week. A promotion that raised revenue and lowered margin pounds is not a success; it is a way of converting stock into work. You need the number to say so, because "revenue was up" will otherwise win the meeting.

What we would talk you out of

A promotion that cannot be explained in one sentence. If a customer has to work out whether their basket qualifies, some of them will conclude they were cheated, and those tickets arrive during the week you have the least capacity to answer them. Complexity in a discount is not sophistication; it is a support cost with a marketing budget attached.

And stacking as a substitute for a decision. Marking everything combinable usually means two teams wanted different offers and nobody chose, so the customer gets both. Choose the offer. A single clear discount, well targeted, will out-earn a stack that needs a diagram — and it is the one you can still reason about at 9pm on the Friday when somebody asks whether the basket on screen is correct.

Questions this raises

How do you control discount stacking on Shopify?

Through the combinability setting on each discount, because nothing combines by default. Decide per discount which classes it may combine with, use minimum spend and exclusion collections to bound it, and if your logic runs through a Shopify Function, enforce a maximum total discount inside it. Then build the most discounted basket your configuration allows and check you are happy with its margin.

Which Shopify discounts can be combined?

Shopify documents order with free shipping, product with free shipping, and product with product on separate items as available on any plan. Product with order, and order with order, are available to eligible merchants — which excludes stores with checkout.liquid customisations and stores using the Licensify app. Product with product on the same line item is documented as Shopify Plus only, and multiple shipping discounts never combine.

How many discount codes can one customer use?

Shopify documents a maximum of 5 product or order discount codes plus 1 shipping discount code on the same order, and only among discounts configured to combine. Remember that goodwill, affiliate and welcome codes compete for the same allowance as your campaign codes.

Why did our promotion lose money even though revenue rose?

Usually because a shipping discount stacked onto small baskets, a discounted subtotal dropped below a threshold that was meant to protect margin, or the return rate on discounted goods was higher than the figure used in the plan. Reconcile gross margin in pounds after discount, shipping and returns against an ordinary week — revenue alone will always flatter a promotion.

Should a free shipping threshold be checked before or after discounts?

That is your decision to make deliberately, and then to verify in a real test basket. Checking after discounts means a code can pull an order under the threshold you set to make shipping affordable. Checking before means some customers see free shipping on an order that no longer qualifies on the amount they actually paid. Either is defensible; assuming without testing is not.

How many active discounts can a Shopify store have?

Shopify documents a maximum of 25 active automatic discounts, including app-based ones. Stores reach it by accumulation rather than by design, so audit the active list after each campaign and deactivate what has ended. Consolidating several identically shaped discounts into one data-driven rule is the usual way to free up room.

NEXT STEP

Free store audit

A senior Shopify engineer reviews your storefront, theme performance and checkout, then sends a prioritised list of fixes.