Sooner or later every store needs to say no to a discount code. A code leaks to a coupon site. A sale starts and codes shouldn’t apply on top of the markdowns. Customers start stacking two promotions you never meant to combine. Or you simply want a week where no code works at all.
Shopify is excellent at creating discounts and surprisingly thin at blocking them. This guide covers the whole map: what you can do with Shopify out of the box, where the native tools stop, and how to handle every blocking scenario merchants actually run into.
What Shopify can do natively
Two native tools cover the basics, and it’s worth using them correctly before reaching for anything else:
Deactivate the discount. In your Shopify admin under Discounts, open any discount and deactivate (or delete) it. The code stops working immediately. This is the right answer when a discount of yours has simply run its course.
Combination settings. Every native discount has checkboxes controlling whether it combines with other product, order, or shipping discounts. Setting these strictly on every discount limits stacking. Between the discounts you remembered to configure, anyway.
Where the native tools stop
The gaps show up as soon as your scenario has any nuance:
- There’s no store-wide off switch. To stop all codes for a sale weekend, you’d deactivate every discount one by one (including the ones apps keep generating), then reactivate them all afterwards.
- Blocking is all-or-nothing. Deactivating a code kills it for everyone. There’s no “this code doesn’t work on sale items” (that one gets its own guide) or “codes only work over a $50 subtotal.”
- No blocking by pattern. If a whole family of codes leaked (
SUMMER10,SUMMER15,SUMMER-VIP), each one is a separate trip to the admin. - Combination settings only govern your own discipline. They’re per-discount checkboxes; one forgotten discount (or one minted by an app with looser defaults) reopens the stacking door.
- No custom rejection message. Customers see a generic error with no explanation, and confused customers email support.
Everything below fills those gaps with PromoLock, which adds a control layer inside Shopify’s own checkout. It applies to every code entered there, whether it was created natively, by PromoLock, or by another app, and it never touches your theme.
Scenario 1: block all discount codes
The sale-weekend case: prices are already cut, and codes shouldn’t apply on top.
In PromoLock’s Controller, turn on Discount Lock and set its mode to Block all codes. Every discount code entered at checkout is rejected with a message you write. Something graceful works best, like “Prices are already reduced for the sale, codes resume afterwards.” After the event, one switch turns it back off. No discount was deactivated, so every campaign resumes exactly as it was.
Scenario 2: block one code — or a whole family
The leaked-code case. Same Discount Lock, mode Block only these codes, and list what should die. Code lists accept patterns using # as a wildcard:
| You enter | It blocks |
|---|---|
SUMMER10 |
Exactly that code |
SUMMER# |
Every code starting with SUMMER |
#2026 |
Every code ending in 2026 |
#SAVE# |
Every code containing SAVE |
So the leaked campaign is one entry, not fifteen. And the block takes effect at checkout immediately, faster than editing discounts one by one.
Scenario 3: allow only approved codes
The tight-ship case: your official codes work and nothing else does, including codes you don’t know exist. Mode Block all codes except, then list the codes (or patterns, like VIP#) that stay live. Anything an app mints without your knowledge is rejected by default.
Scenario 4: block code stacking
The Controller’s Discount Stacking Lock enforces one code per order, store-wide, with no per-discount checkbox discipline required. The first code is kept, extras are rejected with your message. A stacking exceptions list handles the combinations you do want: a free-shipping code that may ride along with anything always applies and doesn’t count toward the limit.
Scenario 5: block conditionally — subtotal, customer, products
For everything with an “only when” in it, PromoLock has a rule builder. A rule watches all codes or specific ones, checks conditions (cart subtotal, whether the customer is logged in or new, customer tags, products or collections in the cart, how many codes are on the order), and blocks with a message you write. A few real ones:
- Block all codes when the cart subtotal is under $50.
- Block
WELCOME15for logged-in customers who’ve ordered before. - Block every code when more than one is on the order, except
SHIP#codes. - Allow
VIP20as an exception for customers tagged VIP, even while stricter rules apply to everyone else.
The part most merchants ask about
Does a blocked code break checkout? No. The rejection happens on the discount field, inside Shopify’s own checkout, before the order exists. The customer sees your message on the code box and completes their purchase without it.
Do blocks apply to codes from other apps? Yes. The control layer sits at checkout, so any code entered there is subject to your rules, regardless of where it was created.
What does the customer see? Whatever you wrote. An honest message like “This code can’t be used on sale items” converts better than a mystery error, and every lock and rule carries its own.
Blocking is half the story: knowing what slipped through before you set the rules is the other half. PromoLock’s analytics reads your order history and puts a number on what stacked codes and sale-item discounts actually cost, which tells you exactly which of the scenarios above deserves your attention first. The Stop discount loss from day one playbook walks that order of operations.