New stores: 14 days of Protector freeFirst 25 stores.Uptime, daily scans, Slack and Telegram alerts. No card.See what’s included

Ecommerce

Stacking discount codes gone wrong: how combinable coupons quietly give away free products

Richard K.

Richard K. · October 17, 2026 · 9 min read

Stacking discount codes gone wrong: how combinable coupons quietly give away free products

A customer finds two discount codes online, a 20% off code from an influencer post and a 15% off welcome code from a popup they closed too fast. Both work at checkout. Separately, each is a reasonable discount. Combined, with a free-shipping code layered on top, the order totals $1.40 on a $140 product. Nobody approved that price. No one on the team even knew the codes could be used together. The order just shipped, at a loss, and it kept happening for three weeks before anyone noticed the pattern in a margin report.

Why stacking happens even when you didn't plan for it

Most discount engines default to a simple question: is this code valid? They check expiration dates, minimum order values, and usage limits, but many don't check whether another discount is already applied. Shopify's native discount combinations have to be explicitly configured (product, order, and shipping discounts each have their own combination settings), and it's easy to leave a combination toggle in its default state when you're focused on launching a promotion, not auditing how it interacts with every other active code.

WooCommerce compounds this because coupon stacking behavior often depends on which coupon plugin you're running, not just WooCommerce core. A pricing rule plugin bug Shopify merchants rarely think about until it bites them is this: two apps can each apply their own discount logic without knowing the other exists, because neither was built with the other in mind.

BigCommerce's cart-level rules have similar blind spots. A "stacking" promotion designed to let a loyalty discount combine with a seasonal sale can quietly combine with an abandoned-cart recovery code too, because the system has no concept of "this code family already touched this order."

The math that makes this worse than it looks

The dangerous part of a discount code stacking bug isn't that discounts add up, it's that they multiply. A single 20% off code takes a price from $100 to $80. Add a 15% code on top of that discounted price, not the original, and you're at $68, not $65. Add a 10% code after that and you're at $61.20. The sequence matters, and most pricing engines apply codes in the order they were entered or in a fixed priority order that nobody reviewed.

Now put a fixed-dollar code into that same stack. A $20-off code applied after two percentage discounts on a $100 item can take a sale price of $68 down to $48, and if a free-shipping code removes another chunk of perceived value, the actual margin on that order can go negative once payment processing fees and fulfillment costs are counted. None of this requires a sophisticated exploit. It requires a customer finding two valid codes and a checkout that doesn't ask whether they should work together.

This is also how deliberate discount abuse happens. Coupon code forums and browser extensions exist specifically to surface every active code for a store, and once a stacking bug is public, it spreads fast because it costs the abuser nothing to try.

A 20% discount and a 15% discount stacked together isn't a 35% discount. It's closer to 32%, and the gap between what you think you're giving away and what you're actually giving away grows with every code added.

Where the bug actually lives

Three places tend to cause this, and they're worth checking in order.

First, the native discount combination settings. On Shopify, each discount type (product, order, shipping) has its own combination rules, and a merchant adding a new promotion often doesn't revisit the combination settings on older, still-active codes. An old "VIP10" code from eighteen months ago might still be marked as combinable with everything, because combinable was the easiest option when it was created for a one-time email campaign.

Second, third-party discount or loyalty apps. These often apply their own discount logic at a different point in the checkout flow than native platform discounts, which means a native combination setting doesn't govern them at all. A points-redemption app and a native sitewide sale code can each believe they're the only discount in play.

Third, automated discounts triggered by cart abandonment, SMS marketing, or birthday emails. These are frequently "set and forget" codes generated by marketing automation tools, and they're rarely included in the same review process as manually created promo codes, even though they carry the same stacking risk. This is a similar blind spot to the one we cover in the abandoned cart email that never sends: automation flows run quietly in the background, and nobody checks their output until a number looks wrong.

The testing routine that catches it before customers do

Catching a coupon stacking error doesn't require engineering resources, but it does require treating discount codes as a system to test, not a marketing task to set and forget.

Start with a combination matrix. List every currently active discount code, including ones generated by apps and automation flows, and test them two at a time in a real cart (use a test product you can refund). You're looking for any combination that isn't explicitly blocked. This takes under an hour for most small stores and should be repeated whenever a new code or app is added, not just once a year.

Next, set a floor price rule where your platform supports it. Many discount apps let you define a minimum margin or minimum price below which a discount simply won't apply, regardless of what's stacked on top. This is the single most effective backstop against a pricing rule bug Shopify or any platform might introduce, because it doesn't rely on catching every combination in advance.

Third, audit combination settings whenever a promotion ends. An expired code that's still technically active in the system, just not advertised, is a common source of silent stacking, because "expired" in marketing terms and "disabled" in system terms aren't always the same thing.

Finally, watch your average order value and discount-as-percent-of-revenue numbers daily during any promotional period, not just at month end. A sudden dip in AOV alongside a spike in discount usage is often the first visible signal of a stacking bug, long before a customer screenshots a $1.40 order and posts it somewhere public. This is the same logic behind tracking cart abandonment spikes as a signal rather than noise: a number moving in an unexpected direction is worth a five-minute look before it's worth a theory.

Continuous monitoring helps here because stacking bugs rarely trip an alarm on their own. Cassian™'s Pricing Pulse checks catch price anomalies against expected ranges, which is useful as a second layer behind your own testing routine, particularly for stores running frequent promotions where manual review can't keep pace with every new code.

Frequently asked questions

How do I know if my discount codes can be combined with each other?
Check the combination settings on each individual discount in your platform's admin panel, since combinability is usually set per-code rather than store-wide. On Shopify, open each discount and look at the "combinations" section, which shows whether it can be used alongside product, order, or shipping discounts. On WooCommerce and BigCommerce, the setting location depends on whether you're using native coupons or a third-party plugin, so check both layers separately.
Can a discount stacking bug actually make a product free?
Yes, because percentage discounts compound against the already-discounted price rather than adding together, and a fixed-dollar code applied after several percentage codes can push the remaining total close to zero or below the cost of goods. A $100 product run through three stacked 20% codes drops to roughly $51, and adding a $20-off or free-shipping code on top can erase most of what's left. This is most common when native platform discounts interact with a separate loyalty or automation app that has no visibility into other active codes.
What's the fastest way to prevent discount abuse from stacking bugs?
Set a minimum price or minimum margin floor on your discount rules so that no combination of codes can push an order below a threshold you define, regardless of how many codes are applied. Pair that with a combination matrix test, where you manually try pairs of active codes in a test cart after launching any new promotion. Neither step requires custom development on Shopify, WooCommerce, or BigCommerce, since most discount apps and native settings support at least basic floor pricing.

The discipline that keeps promotions safe

Discount codes are one of the few parts of a store where a single misconfigured toggle can directly cost money on every order it touches, not just degrade an experience. The fix isn't to stop running promotions, it's to treat combination settings with the same seriousness as a checkout flow: test it before launch, re-test after changes, and keep a floor price as a backstop for the combination nobody thought to test. The store that catches a coupon stacking error in a ten-minute manual check is in a much better position than the one that finds out from a margin report three weeks later.

Keep reading