
Overview
Coupon stacking in Magento is what happens when more than one price reduction lands on the same order. Customers hunt for it, finance worries about it, and most stores never establish which combinations their own setup allows until an order arrives with a margin that does not make sense.
Magento surprises people in both directions here. Some things you assume will stack cannot. Some things you assume are mutually exclusive combine quietly on every single order.
The key point: In standard Magento Open Source a cart holds exactly one coupon code. Entering a second code replaces the first.
That one fact removes an entire category of worry, and creates a different one, because the discounts that genuinely do stack are the ones with no coupon attached at all.
Where Discounts Come From
Magento reduces prices in two separate places, and knowing which is which resolves most stacking confusion before you touch a setting.
Catalog price rules and special prices change the price of a product before it ever reaches the cart. By the time an item is in the basket, that reduction is already part of its price.
Cart price rules then act on the cart as a whole. These live in Marketing > Cart Price Rules, and they are the only ones that can carry a coupon code.
Stacking questions are nearly always about the second group, or about the second group compounding on the first.
Only One Coupon Code Per Cart
A Magento cart stores a single coupon code. Not a list. One value.
Enter a second code and it replaces the first. The customer sees the new discount applied and loses the previous one, usually with nothing on screen that explains the swap.
The consequences are worth stating plainly:
- Two coupon-based cart price rules can never both discount the same order
- No amount of Priority tuning changes that
- Discard Subsequent Rules is irrelevant to it, because the second coupon rule was never in play to begin with
If you have been designing rules to stop two codes combining, you have been solving a problem Magento already solved. The effort is better spent on the section below.
This describes standard Magento Open Source. Third-party multi-coupon extensions exist and deliberately change this behaviour, so if one is installed on your store its rules apply instead of these.
What Genuinely Does Stack
Automatic Cart Rules Combined With a Coupon
A cart price rule can be set to require no coupon at all. It applies whenever a cart meets its conditions.
When a customer then redeems a coupon, Magento does not evaluate that coupon on its own. It assembles one combined list containing every automatic rule the cart qualifies for plus the rule attached to the code, and works through that single list in Priority order.
So the coupon does not replace your automatic promotions. It joins them. A customer redeeming a 10% code on a cart that already qualifies for an automatic promotion receives both, and this is the real exposure behind the usual "how did that order get so cheap" investigation.
Catalog Discounts Combined With a Cart Coupon
This combination always compounds, and there is no setting that switches it off by default.
A catalog price rule or a special price has already lowered the item's price by the time the cart runs. A percentage coupon then discounts the lowered figure. A product cut by a quarter in the catalog and then given a 20% coupon does not sell at 55% of list price. It sells at 60%, because the second reduction applies to the first result rather than to the original.
The direction of the error is mild on one product and material across a sale event.
Two Coupon Codes
No. See above. One code per cart.
How Priority Really Works
The Priority field on a cart price rule is a sort order, and this catches people out constantly:
A lower Priority number runs first. Priority 0 is evaluated before Priority 10.
It reads like a ranking where "priority 1" means "most important", and in a sense it is, but only because it goes first. Every automatic rule and the redeemed coupon rule are sorted into one list by this number, ascending, and processed in that sequence.
On its own, Priority does not stop anything stacking. It only decides the order in which discounts are calculated, which matters when percentages apply to a running remainder. It becomes powerful only in combination with the next setting.
Discard Subsequent Rules Does Not Care About Coupons
Discard subsequent rules sits in the Actions section of a cart price rule. Set it to Yes and Magento stops processing further rules once this one has applied.
The near-universal misconception is that this only affects coupon rules, or only fires when a coupon is entered. It does not check anything of the sort. It never inspects whether a rule uses a coupon, on either the rule that carries the flag or the rules it suppresses.
An automatic no-coupon rule with Discard set to Yes will absolutely stop later rules from running.
The setting also behaves differently depending on what is being discounted:
- On cart items, the affected item is taken out of the pool once a discard rule has applied to it. Rules at higher Priority numbers skip that item, but can still apply to other items in the same cart
- On shipping, processing stops outright. Magento breaks out of the rule loop entirely and nothing further is evaluated
That second behaviour is what makes the following trap so damaging.
The Free Shipping Trap
This is the most expensive stacking mistake in Magento, and it is close to invisible in testing.
Picture a normal setup. You run free shipping over a spend threshold as a cart price rule. Separately, you issue a discount coupon, and because you want that coupon to be the final word on the order, you set Discard subsequent rules to Yes. You give it Priority 0 so it is clearly the dominant rule.
Now a customer builds a cart that qualifies for free shipping and enters the coupon.
Magento sorts the qualifying rules by Priority ascending, reaches your coupon rule at 0, applies it, sees Discard set to Yes, and stops. The free shipping rule sits at a higher number, so it is never reached. Free shipping is applied by exactly the same priority-ordered loop, and it breaks on the same flag.
The customer qualified for free shipping and does not get it. They are charged for delivery, and the only visible evidence is a shipping line they were not expecting.
What makes this so easy to ship into production:
- The coupon appears to work perfectly, because it does
- The free shipping rule is not broken, and tests fine on carts with no coupon
- Nobody tests the specific combination of a qualifying cart and a redeemed code
- Customers who notice usually assume the free shipping threshold is higher than advertised, and abandon rather than complain
The reverse arrangement causes the same class of problem in the other direction. A free shipping rule at a lower Priority number with Discard set to Yes will suppress the coupon the customer entered.
The check takes two minutes. Open Marketing > Cart Price Rules, sort by Priority ascending, and read down the list. For every rule with Discard set to Yes, everything below it in that list is a benefit a customer can silently lose. If free shipping is anywhere below such a rule, you have this problem now.
How to Control Coupon Stacking
Ranked from most appropriate to bluntest. Work down this list, not up it.
1. Rule Conditions
Precise, predictable, and free of side effects on other rules. Restrict a rule with a minimum subtotal, specific categories, or specific products, so it only ever applies where you intend.
If the concern is a coupon being used on something it was not meant for, this is almost always the correct answer, and it is the only option here that cannot damage an unrelated promotion.
2. Discard Subsequent Rules
Effective and dangerous in equal measure. It is only safe when you know exactly what sits at higher Priority numbers, because that is precisely what you are switching off.
Before enabling it anywhere, list every active rule ordered by Priority ascending and confirm that suppressing everything below the rule you are editing is genuinely what you want. Free shipping and loyalty promotions are the usual casualties.
3. Priority Reshuffling
Only meaningful in combination with Discard. By itself it changes the order discounts are calculated in, which affects percentage-of-remainder arithmetic but stops nothing from stacking.
Leave deliberate gaps between numbers, such as 10, 20, 30, so you can insert a rule later without renumbering the whole set.
4. Exclude Already Discounted Items
This is the control for coupons compounding on catalog price rules and special prices.
The Actions section of a cart price rule can restrict which items the rule touches. Out of the box you can build conditions on Quantity in cart, Price in cart, Row total in cart, and Category.
To exclude items on sale you need a product attribute that identifies them, and that attribute has to be made available to promotions first. In Stores > Attributes > Product, open the attribute and set Use for Promo Rule Conditions to Yes on the Storefront Properties tab. It then appears in the Actions condition list, where you can exclude matching items from the rule.
Only certain attribute types can be used in rule conditions: yes/no, dropdown, multiple select, text field, text area, price, date, date and time, and weight. An attribute of any other type will not appear in the list however it is configured, and the attribute must also be visible on the storefront.
Check This First
When a discount behaves unexpectedly, work through these in order.
A customer says their second code removed the first. Working as designed. One coupon code per cart in Magento Open Source.
A discount is larger than expected. Look for automatic no-coupon rules the cart also qualifies for, and for catalog price rules or special prices on the products involved. Both stack with a coupon.
Free shipping stopped applying, but only sometimes. Almost certainly a coupon rule at a lower Priority number with Discard subsequent rules set to Yes. Sort your rules by Priority ascending and read down from the top.
A rule never applies at all. Check whether an earlier rule in the Priority order has Discard set to Yes, then check the rule's own conditions, dates, websites and customer groups.
A coupon still works after the date it was supposed to expire. In Magento Open Source the expiry date set on an individual generated coupon is not enforced at redemption. The End Date on the cart price rule itself is enforced. If a deadline genuinely matters, set it on the rule.
A per-customer usage limit is being exceeded. Per-customer limits are only checked when the cart belongs to a logged-in customer, so they do not restrain guest checkout. The overall usage limit on a generated code is enforced for everyone, guests included, so a single-use code does genuinely stop working after one redemption.
FAQs
Can a customer use two coupon codes in Magento?
A customer cannot use two coupon codes on one cart in standard Magento Open Source, because the cart stores a single code and entering a second replaces the first. Third-party multi-coupon extensions change this behaviour.
Do automatic cart rules stack with a coupon?
Automatic no-coupon cart rules do stack with a redeemed coupon. Magento processes the qualifying automatic rules and the coupon rule as one combined list, so both apply to the same order.
Does a coupon stack with a special price or catalog price rule?
A coupon stacks with a special price or catalog price rule, and the two compound. The catalog reduction is already part of the item price, so a percentage coupon discounts the reduced figure rather than the original.
In Magento, does Priority 1 run before Priority 10?
Priority 1 runs before Priority 10, because a lower Priority number is evaluated first. Every qualifying rule, automatic or coupon-based, is sorted into one list by this number, ascending.
Does Discard subsequent rules only affect coupon rules?
Discard subsequent rules affects every later rule, not only coupon rules. It never checks whether a rule uses a coupon, so an automatic rule with the setting enabled will stop later rules just as readily.
Why did free shipping disappear when a customer entered a coupon?
Free shipping disappears when a coupon rule sits at a lower Priority number with Discard subsequent rules set to Yes, because processing stops before the free shipping rule is reached. Sort your rules by Priority ascending to confirm.
How do I stop a coupon applying to sale items?
Use the Actions conditions on the cart price rule to exclude sale items from it. The attribute that identifies a sale item must have Use for Promo Rule Conditions set to Yes before it appears in that condition list.
What is the safest way to control coupon stacking in Magento?
Rule conditions are the safest control, because they limit one rule without affecting any other. Reach for Discard subsequent rules only when you have checked what sits below it in the Priority order.
Next Steps
To get discount behaviour under control:
- Accept that one coupon per cart is not configurable, and stop building rules to enforce it
- List every active rule sorted by Priority ascending, and keep that list to hand
- Audit every rule with Discard subsequent rules set to Yes, and confirm what it suppresses
- Test one qualifying cart with a coupon and without, and compare the shipping line
- Prefer rule conditions over Discard whenever conditions can express the same intent
The two minute Priority audit is the highest value thing on that list. It finds the free shipping trap before your customers do.
Related reading: the reducing cart abandonment guide covers when discount incentives help recovery and when they train customers to wait for the next code.
