How To Cap Discount Stacking Between Cart Email Codes And Site-Wide Promos

A tactical playbook for preventing a Klaviyo 15%-off cart-recovery code from stacking on top of a live 20% sitewide promo — using Shopify's Combinable Discounts flag, dynamic coupon suppression, and a checkout-level depth cap.
Quick answer
Set every Klaviyo cart-recovery code to Combinable Discounts = false in Shopify so it cannot stack on an active sitewide promo, then add a Klaviyo suppression tag that skips the discount branch of the flow whenever a store-wide sale is live. Cap total checkout discount depth at your contribution-margin floor (typically 25-30%) using Shopify Functions as a safety net.
Capping Discount Stacking Between Cart Emails And Sitewide Promos
The operational rule that stops a cart-recovery code from combining with a live sitewide sale and pushing an order below its margin floor.
Discount stacking happens when a shopper receives a 15%-off abandoned-cart code from Klaviyo, arrives on a store already running a 20% sitewide promo, and Shopify applies both — landing the order at 32% off (or worse once free shipping is triggered). Capping that stack means enforcing three controls in sequence: a per-code combinability flag on Shopify's Discount API, a suppression rule in the Klaviyo flow that pauses discount branches during scheduled promos, and a checkout-level Shopify Function that rejects any combination exceeding your margin floor.
The damage is silent. A 20% sitewide promo plus a 15% Klaviyo code on an apparel order with a 55% gross margin leaves roughly 8 points of contribution — before pick-pack, card fees, and returns. On BFCM weekend, when both promo volume and abandoned-cart triggers peak, an uncapped stack routinely sells your best AOV orders at a loss.
Why the stack happens
Shopify treats an automatic discount (your sitewide promo) and a code-based discount (the Klaviyo coupon) as two different classes. By default they don't collide — but the moment a merchant flips Combinable Discounts on to allow, say, loyalty-tier codes to stack, every code in the store inherits that permission unless individually restricted.
The second failure mode is the flow itself. A Klaviyo abandoned-cart sequence configured months ago keeps firing its Day 2 "here's 15% off" email even when a 20% store-wide sale went live yesterday. The email doesn't know about the promo calendar, so it hands out a code the shopper immediately stacks.
The BFCM multiplier
During Black Friday / Cyber Monday, abandoned-cart volume roughly triples while your sitewide discount is at its deepest. A stacking bug that costs you €600/week in October costs closer to €12,000 across the BFCM weekend. Audit before the calendar push, not after.
How to detect it before checkout does
Pull a Shopify order export filtered to the promo window and add a computed column: (line_item_subtotal - order_total_before_tax) / line_item_subtotal. Anything above your intended promo depth (0.20 for a 20% sale) is a stacked order. Sort descending and you'll see the codes doing the damage in the first ten rows.
The second signal lives in Klaviyo. Filter the abandoned-cart flow for placed-order events during the promo window and check the applied_discount_codes property. If codes from a specific email step appear on orders that also carry the automatic sitewide discount, that step is the leak.
How to fix it
Layer one: at code creation, set the Combinable Discounts flag to false for every cart-recovery code. This alone prevents 80% of stacks. Shopify's Discount API exposes combinesWith.orderDiscounts and combinesWith.productDiscounts — flip both to false for recovery codes and true only for loyalty-tier codes that legitimately should stack.
Layer two: in Klaviyo, add a conditional split at the top of the abandoned-cart flow that checks a custom profile property or a global "active_sitewide_promo" tag pushed from Shopify via webhook. When the tag is true, route recipients to a no-discount branch — the email still recovers the cart with urgency copy, just without the code. This is the pattern the dynamic-coupon-suppression playbook is built on.
Layer three: the safety net
Deploy a Shopify Function on the checkout that reads the total applied discount and rejects the cart if it exceeds your contribution-margin floor. Even if a code slips through layers one and two, the function refuses to let the order settle below (say) 30% off. Requires Shopify Plus, but it's the only truly deterministic guardrail.
Experiment ideas
Test a no-code cart-recovery variant during your next sitewide promo: urgency copy plus a free-shipping threshold reminder against the standard 15% code. On stores running 20%+ sitewide sales, the no-code variant typically holds recovery rate within 2 points while restoring 12-15 points of margin per recovered order.
For legitimate stack cases — VIP tiers, referral codes — run the opposite test: allow the stack but cap total depth via Shopify Functions at your margin floor. Compare LTV of shoppers who hit the cap against unrestricted stackers over 90 days. If LTV is flat, the cap costs you nothing and saves margin per order.
Frequently asked questions
Only partially. Automatic discounts and code-based discounts don't stack by default, but once you enable the Combinable Discounts feature to allow any stacking (e.g. for loyalty tiers), you have to opt out per-code for everything you don't want combined. The default is safer than most merchants realise, but any customisation flips the burden onto you.
When Klaviyo creates the code via the Shopify integration, it uses whatever combinability defaults you've set at the discount type level in Shopify Admin. Set your abandoned-cart code template to non-combinable in Shopify first, then Klaviyo-generated codes inherit that setting. Existing codes need to be updated via the Discount API or bulk-edited.
Yes — combinability is a per-code property, not a global setting. Mark VIP and loyalty-tier codes as combinable with product and order discounts, and mark cart-recovery codes as non-combinable. Segmenting the code catalogue this way is the standard approach and the foundation of most legitimate-stacking policies.
It depends on your contribution margin. For most apparel and beauty brands with 55-65% gross margins, total stacked discount above 30-35% starts eating into contribution once you factor in fulfilment, payment fees, and returns. Model your specific margin floor rather than using a generic threshold.
Effectively, yes. If your average order absorbs €6 of shipping and the promo pushes AOV over your free-shipping threshold, that's another 3-5 percentage points of margin gone silently. Include shipping subsidy in your total-discount-depth calculation, not just the visible percentage codes.
You push a signal into Klaviyo. The cleanest pattern is a Shopify webhook that fires when you activate or deactivate an automatic discount, updating a global "active_sitewide_promo" property or list-level tag. Your abandoned-cart flow reads that tag in a conditional split and routes accordingly.
Less than you'd expect. When a sitewide sale is already live, the shopper's cart price has dropped 20% since they abandoned — the sale itself is the incentive to return. Recovery rates typically hold within 1-2 points on a no-code variant during active promos, and margin per recovered order improves substantially.
For a hard cap enforced at checkout, yes — Shopify Functions require Plus. On non-Plus plans you can approximate it by using the Discount API's fixed-amount modifiers and by aggressively controlling combinability, but you lose the deterministic guardrail. Non-Plus stores rely more heavily on layers one and two.
Export orders for the last promo window, compute effective discount depth per order, and flag anything exceeding your intended promo percentage. Sum the excess discount across flagged orders — that's the recoverable margin. Agency teams typically run this audit before every promo calendar push.
First-order codes are the highest-risk stacker because they target new customers, whose LTV:CAC hasn't been proven yet. Treat them as strictly non-combinable during sitewide promos. First-order discount depth should be governed by its own LTV:CAC-protective policy, not left to combine with whatever promo happens to be live.
Get an AI expert review of your site
Paste your URL — Metricuno's AI runs the same heuristic checks a senior CRO consultant would, scoring your page and prioritising the fixes that'll move conversion fastest.