Keep codes off sale items
An item selling below its compare-at price is already discounted. A code on top of that is a discount on a discount — margin you never planned to give. This guide blocks it shop-wide.
-
Open Controller → Discount Code tab → Lock Discount Usage On Sale Items, and turn the switch on.
-
Pick your Trigger:
- Block if cart has any sale item — one marked-down item anywhere in the cart blocks all codes. Maximum protection, but a customer buying one sale sock plus $200 of regular stock also loses their code.
- Block when sale items exceed % of cart total — codes are blocked only once sale items pass your Threshold (%) of the cart’s value. This is the setting most stores want.
-
If you chose the percentage trigger, set the Threshold (%). A threshold of 50 means: mostly-regular carts keep their codes, carts that are mostly sale items don’t.
-
Optional — set the Error message. Default: “Discounts can’t be used on sale items.”
-
Save.
Choosing a threshold
Section titled “Choosing a threshold”The threshold measures money, not item count. At threshold 50, a cart with $60 regular + $40 sale items still takes codes (40% on sale); flip those numbers and it doesn’t. Guidance:
- 0–20 — strict; effectively “codes are for full-price shopping.”
- around 50 — balanced; bundle shoppers keep their codes, sale-haulers don’t.
- 70+ — lenient; only blocks carts that are nearly all sale items.
What counts as a sale item
Section titled “What counts as a sale item”A product whose current price is below its compare-at price. A compare-at equal to (or below) the price doesn’t count — the item has to actually be marked down.
Check it worked
Section titled “Check it worked”Add a marked-down product to a cart until sale items exceed your threshold, then try a code at checkout — it should be rejected with your message. Then check the sale-item discounts report over the following weeks: this lock attacks exactly the number in Lost on sale items.
Related
Section titled “Related”- PromoLock-created discounts skip sale items by default via SafeGuards — this lock extends the same protection to every code, including other apps’.
