Skip to content

Controller

The Controller is your store’s rulebook for what codes and gift cards are allowed to do at checkout. It applies to everything — codes you created in PromoLock, codes made in the Shopify admin, and codes generated by other apps. If a code is typed into your checkout, the Controller has a say.

It has three layers, top to bottom on the page: Quick controls for the common cases, Rule variables (the tags and collections your rules can reference), and Custom rules for everything else.

Nothing takes effect while you’re editing — a save bar appears as soon as you change something, and your changes go live the moment you hit Save.

Quick controls are one-switch locks. Each one is a card with a switch — turn it on, adjust its options, save. They’re split into two tabs: Discount Code and Gift Card.

Blocks discount codes at checkout. The Mode select decides how strict:

ModeWhat it doesUse it when
Block all codesNo discount code works at all.Sale events where codes shouldn’t apply, or an emergency shut-off.
Block all codes exceptOnly the codes you list under Allowed codes still work.You run a tight ship — a few official codes, nothing else.
Block only these codesEverything works except the codes you list under Blocked codes.A code leaked to a coupon site and needs to die today.

The code lists accept patterns, so “block everything that starts with SUMMER” is one entry, not fifty.

Stops customers from combining multiple discount codes on one order. When two or more codes land in a checkout, the first one is kept and the extras are rejected with your message.

Stacking exceptions is a list of codes that live outside the limit: an exception code always applies, and it doesn’t count toward the limit — so a customer can use your free-shipping code alongside a regular discount if that’s the combination you actually want.

Stops discount codes from being used on carts that contain marked-down products — the classic double-dip. A product counts as “on sale” when its current price is below its compare-at price.

The Trigger select has two modes:

TriggerWhat it does
Block if cart has any sale itemOne sale item anywhere in the cart blocks all codes. The strictest option.
Block when sale items exceed % of cart totalCodes are blocked only once sale items make up more than your Threshold (%) of the cart’s value.

The threshold is measured in money, not item count: with a threshold of 50, a customer whose cart is $60 regular-priced and $40 sale items can still use a code (40% of cart value is on sale); tip the balance past half and codes stop working. This mode lets bundled carts through while still blocking pure sale-hauls.

LockWhat it does
Gift Card LockBlocks gift cards as a payment method entirely.
Gift Card Stacking Lock (Shopify Plus)Only one gift card can be applied per order.
Gift Card & Discount Stacking LockA discount code and a gift card can’t be used on the same order — closes the “discounted purchase paid with a discounted-purchase gift card” loop.

Every code list in PromoLock — allowed, blocked, exceptions, rule triggers — accepts patterns, not just exact codes. The # symbol is the wildcard:

You typeIt matches
WELCOME10Exactly WELCOME10, nothing else.
VIP#Any code starting with VIP — VIP2026 ✓, VIPGOLD ✓, MYVIP ✗
#2026Any code ending with 2026 — SALE2026 ✓, 2026SALE ✗
#SAVE#Any code containing SAVE — BIGSAVE50 ✓, WEEKLYSAVE ✓

Matching ignores upper/lowercase. Inside any code field, the expand button opens a bigger editor that labels each entry (“Starts with:”, “Contains:”) so you can see how it will be read.

Every lock and every block rule can carry its own error message (up to 75 characters) — this is what the customer sees on the discount field when their code is rejected. Leave it blank and a sensible default is used, like “This code is not valid at this time.”

If your store sells in multiple languages, the translate button next to the field opens a Localization editor — one message per language, with your default language used as the fallback.

Before custom rules can reference your tags or collections, you register them here — three tiles: Customer tags, Product tags, and Collections, each holding up to 10 values. Rules then pick from these lists rather than free-typing, which keeps typos from silently breaking a rule.

If a condition like “Customer tag” shows no options, this is why — add the tag as a variable first.

When a quick lock is too blunt, write a rule. Rules live in a list — each with an on/off switch, a Block/Allow badge, and a one-line summary — and you can keep a rule in the list but disabled while you think it over.

A rule has four parts, in the order the editor shows them:

Name. Optional, for your own sanity in the list.

Trigger — which codes the rule watches.

  • All codes — optionally minus an Except list.
  • Specific codes — only the codes/patterns you list.

Action. Block (with your custom error message) or Allow. Allow rules are exceptions — they punch holes through your other rules (see which rule wins). A block rule with no message of its own shows the default, “This code is not valid at this time.”

Conditions — when the rule applies. Add as many as you need; all of them must be true for the rule to fire. A rule with no conditions always applies to its triggered codes.

ConditionChecksOperators
Cart subtotalThe cart’s subtotalGreater than / Less than / Equals
Product in cartSpecific products (picked from your catalog)Has any of / Has all of / Has none of
Product from collectionProducts from a Collections variableHas any of / Has all of / Has none of
Product with tagProducts carrying a Product tags variableHas any of / Has all of / Has none of
Cart has sale itemWhether any cart item is marked downIs true / Is false
Customer is logged inGuest vs. signed-in checkoutIs true / Is false
Customer is newThe signed-in customer has zero past ordersIs true / Is false
Customer tagTags on the customer (from a Customer tags variable)Has any of / Has all of / Has none of
Discount code in cartWhich other codes are in the cart, as exact codes or patterns. Checked against every code entered, including ones already appliedHas any of / Has all of / Has none of
Discount code countHow many codes are on the order, with an optional “don’t count these” listGreater than / Equals / Less than

Every other condition looks at the cart or the customer. Discount code in cart is the one that looks at the other codes, so one code’s fate can depend on another’s presence. The classic use: trigger All codes except SAVE10, condition Discount code in cart has any of SAVE10, action Block. Now SAVE10 can be in the cart, but nothing else can join it.

Three things to remember about ordering:

  1. Rules run top to bottom, and a later rule wins. If rule 1 blocks VIP# and rule 3 allows VIPGOLD, VIPGOLD gets through. Put your exceptions below the broad rules they carve out of.
  2. Quick controls always have the last word. They run after all custom rules — an Allow rule can’t override Discount Lock, the stacking lock, or the sale-items lock. Exceptions to a quick control go in that control’s own exception/allowed list.
  3. A disabled rule does nothing — it’s saved, but skipped.