Discount Shows Active but Doesn't Apply at Checkout: A Troubleshooting Checklist
Your discount rule says Active. The checkout says full price. Nine checks to find the gap — ordered from most common to most subtle, with the fix for each.
You saved the rule. The dashboard shows the green "Active" badge. You open your store in an incognito window, add the right products to the cart, and — nothing. Full price. No discount line. No badge on the product page. The rule is clearly on, but the checkout disagrees.
This is one of the most common support scenarios we see, and after helping hundreds of stores through it, the causes turn out to be surprisingly repetitive. There are nine places where a discount can look active in the admin but fail to reach the customer's cart. This checklist walks through each one, starting with the most common.
One disclosure before we begin: we build Markdo, a discount app for Shopify. Most of these checks apply to any Function-based discount app; where a check is specific to Markdo, we note it.
If your rule targets specific customer groups or has usage caps, jump to Check 9 first — those are the silent blockers that don't produce any error message.
Check 1: Has the rule synced to checkout?
This is the number one cause, and it comes from how Function-based discounts actually work.
Your admin dashboard reads from the app's own database. The checkout reads from a completely different place — a Shopify Function that evaluates rules from a metafield configuration stored on the discount node in Shopify. These two data stores are kept in sync, but they are not the same thing, and sync is not instant.
When you activate a rule, the app serializes the rule configuration, writes it to the discount node's metafield, and the Function starts reading that new configuration on the next checkout request. Under normal conditions this takes a few seconds. Under load — or if the metafield write encounters a transient error — it can take longer, or the write can fail silently while the admin still shows the rule as active.
How to check: Go to the rule in your app dashboard. If there's a "last synced" timestamp, check whether it matches when you activated the rule. If the timestamp is older, the sync hasn't completed. The fix: Toggle the rule off, wait five seconds, then toggle it on again. This forces a fresh sync. Then test at checkout with a real product. If the discount appears, the original sync was the bottleneck.If the rule shows as synced but still doesn't apply, move to the next check.
Check 2: Is a discount code overriding the automatic discount?
This one catches merchants off guard, and it comes down to Shopify's discount combination settings.
In Shopify, each discount (including automatic discounts and discount codes) has a combination setting that controls whether it can apply alongside other discounts. By default, automatic discounts and discount codes do not combine. When a customer enters a valid discount code at checkout and the combination setting blocks it, the automatic discount is excluded from the cart — the code takes the slot, and the automatic discount steps aside.
This means: if your store has active discount codes and a customer enters one at checkout, the automatic discount may not apply — not because the rule is broken, but because Shopify's combination rules say the code wins. You can verify this in your Shopify admin under Discounts → the combination settings on each discount.
There's a less obvious variant: some browsers and password managers auto-fill the discount code field from saved entries, and some checkout themes remember the last code a customer entered. The customer never consciously typed anything, but the field isn't empty — and if the code is valid, the combination setting still applies. If you see this pattern in support tickets ("I didn't enter a code!"), ask the customer to check whether the discount field has a value pre-populated.
One more thing to note: an invalid or expired code that the customer types and gets rejected ("Invalid code" or "Code expired") typically does not stay in the cart, so it usually doesn't trigger the combination block. The issue is specifically with valid codes that successfully apply to the cart.
How to check: Open your store in an incognito window. Add the qualifying products. Do not enter anything in the discount code field. Proceed to checkout and see if the automatic discount appears on its own. If it does, enter a valid discount code and check whether the automatic discount disappears. The fix: If the discount applies without a code but disappears when a code is entered, check the combination settings on both the automatic discount and the discount code. If you need them to coexist, enable combination between them — or retire unused discount codes so customers don't accidentally trigger the override. Our guide to the 25 automatic discount limit covers the relationship between codes and automatic discounts in more detail.Check 3: Do the cart items actually match the rule conditions?
This sounds obvious, but it's the third most common cause because the matching logic has more surface area than most merchants realize.
Function-based discount rules can target products by: product tags, collection membership, product type, vendor, specific product IDs, or any combination of these using AND/OR groups. At checkout, the Function evaluates each cart line against these conditions. If even one condition doesn't match, that line is excluded from the discount.
The subtle part: the conditions are evaluated against the cart line data that Shopify sends to the Function, not against your product page. If you recently added a tag to a product, the tag needs to propagate to the Function's input query before the rule picks it up. Same for collection membership — adding a product to a smart collection is instant on the product page, but the Function's next sync cycle is what picks up the change. How to check:1. Open the rule and note every condition: which tags, which collections, which product types.
2. Open the actual product page (not the admin) and verify the product has the exact tag or belongs to the exact collection the rule requires.
3. Add that specific product to the cart in an incognito window.
4. If the rule requires a minimum quantity or minimum amount, make sure the cart meets it.
The fix: If the product looks correct but the discount still doesn't apply, re-save the rule (even without changes) to force a fresh sync of the matching data — the layer that connects your product catalog to the checkout conditions. This is the piece most likely to be stale after bulk product edits.Check 4: Is the rule inside its scheduled time window?
If your rule has start and end dates, the timing has a nuance that's worth understanding.
The Function itself has no clock — it runs in Shopify's sandboxed environment without access to the current time. Time-based filtering is typically handled on the app's server during the sync process: rules outside their scheduled window are excluded from the metafield write, so the Function never sees them. (This is how Markdo handles it; other apps may use a different approach, such as passing the time window to the Function and letting it filter at checkout.)
This creates two edge cases:
- Rule scheduled to start in the future. You create and activate a rule on October 10, set to start on October 15. The rule shows as Active in the dashboard. But the sync that runs on October 10 sees the time window hasn't opened and excludes the rule from the checkout configuration. The discount won't apply until a sync runs after October 15. If no sync is triggered on that date, the gap can last until the next scheduled sync.
- Rule past its end time. A rule whose time window has closed should stop applying. But if no sync has run since the end time, the old configuration is still in the metafield, and the Function keeps applying the discount. The rule appears expired in the dashboard but still works at checkout — the opposite of the usual problem, but equally confusing.
Check 5: Are stacking settings configured correctly?
When you have multiple rules that should all apply to the same cart, the stacking configuration determines whether they combine or compete.
Each rule has a stacking toggle. When stacking is off (the default), only the single best-matching rule applies — even if five rules match the cart, the customer gets one discount. When stacking is on, the rule can combine with other rules, subject to an allow-list (which specifies exactly which other rules it can combine with) and a block-list (which specifies exclusions).
There's also a "best discount only" setting. When enabled, instead of stacking all matching rules, the Function picks the single rule that produces the highest discount amount. This is useful when you want the customer to always get the best deal without manual intervention, but it's the opposite of stacking — it selects one, not many.
How to check: If you expect two or more rules to apply simultaneously:1. Verify that stacking is enabled on both rules (it must be mutual).
2. Check that each rule's allow-list includes the other rule (or that neither rule lists the other in its block-list).
3. If "best discount only" is enabled on any matching rule, understand that it replaces stacking with a best-of-one selection.
The fix: Enable stacking on both rules and configure the allow-lists. If you've enabled "best discount only" and also expecting stacking, you've created a contradiction — choose one strategy. Test with a cart that matches both rules and verify the discount line shows the combined amount.For a deeper look at how different discount types interact at checkout, our guide to Shopify discount types covers the mechanics. If stacking is central to your promotion strategy, the Shopify discount stacking guide walks through the full rule configuration.
Check 6: Are country or POS conditions filtering out the customer?
Two condition types that fail silently — they don't produce an error, they just don't match.
Country conditions. If your rule targets specific countries (e.g., "United States, Canada, United Kingdom"), the Function checks the customer's shipping address country against the allowed list. If the country is empty, unknown, or not in the list, the rule doesn't apply. This happens most often when:- The customer hasn't entered a shipping address yet (some checkout stages don't include country in the cart input).
- The store ships to a country using a name or code that doesn't match the rule's expectation.
- The store uses Shopify Markets with market-specific pricing, and the country mapping differs from what the rule expects.
Check 7: Has a plan change affected which rules are active?
This one only applies if you recently changed your app plan — specifically, if you downgraded from a paid plan to the Free plan.
The Free plan allows a limited number of active rules (in Markdo's case, 3). When a store downgrades, the app disables the lowest-priority rules first, syncs the changes to Shopify, and disables paid-tier widgets. This is a multi-step process, and if the sync step fails — due to a timeout, a rate limit, or a transient error — the admin and the checkout can diverge.
Two scenarios:
- Admin shows fewer active rules than expected, but the old rules still apply at checkout. The database was updated (rules marked inactive) but the Shopify metafield still contains the old configuration. The Function keeps applying discounts that the admin says are off.
- Admin shows rules as active, but they don't apply at checkout. The downgrade disabled the rules, but the UI hasn't refreshed, or the sync succeeded in removing the rules from the metafield while the admin cache still shows them as active.
Check 8: Is the widget showing but the discount isn't (or vice versa)?
The last two checks cover less common but still frequent sources of confusion. First: the discount works at checkout (the discount line appears) but the promotional widget doesn't show on the product page or cart drawer — or the widget shows but no discount applies.
These are two independent systems. The discount applies through the Function at checkout. The widget renders through a Theme Extension block that you add to your theme via the theme editor. If the block isn't installed in your theme, the widget won't show — but the discount still works. And the reverse is also true: a widget can display correctly while the underlying rule has a sync or configuration problem that prevents the discount from applying.
How to check: Test at checkout in an incognito window. If the discount line appears, the rule is working. The missing widget is a theme configuration issue, not a rule issue. The fix: Go to Online Store → Themes → Customize. Add the app's theme block to the desired section (product page, cart drawer, etc.). The block name matches the widget name in your app dashboard.If you've added the block but it still doesn't render, check whether the widget is bound to the correct rule and whether the rule is marked as active. The widget reads the rule's active status to decide whether to show — a rule that's active in the database but hasn't synced its status to the widget will leave the widget hidden.
Check 9: Do customer eligibility, usage limits, or combination settings block the discount?
The previous checks focused on products and rules. This one covers the customer side — three conditions that can silently prevent a discount from applying even when everything else is correct.
Customer eligibility. Many discount rules include customer conditions: specific customer tags (e.g., "VIP", "wholesale"), customer segments, login status (logged-in only), or market/region restrictions. If the customer at checkout doesn't match these conditions, the rule doesn't apply — and there's no error message. This happens most often when:- A rule requires the customer to be logged in, but the customer is checking out as a guest.
- A rule targets a customer tag (e.g., "beta-tester"), but the customer's account doesn't have that tag yet.
- A rule is restricted to a specific market (via Shopify Markets), and the customer is browsing from a different market.
1. Open the rule and check every customer-facing condition: tags, segments, login requirement, market restriction.
2. Check the usage stats: has the rule hit its total use limit or per-customer limit?
3. Check the combination settings on the rule and on any other active discounts in the store.
4. Test with a customer account that matches all conditions, in an incognito window, with no other discounts in the cart.
The fix: If a usage limit has been reached, either increase the limit or create a new rule to replace it. If customer eligibility is the issue, verify the customer's tags and login status. If combination settings are blocking the rule, adjust them to allow the discounts you want to coexist.Quick reference
| Check | Symptom | Fix |
|---|---|---|
| Sync not completed | Rule just activated, checkout unchanged | Toggle rule off/on, wait, retest |
| Discount code override | Discount disappears when valid code is entered | Check combination settings; retire unused codes |
| Conditions don't match | Specific products excluded | Verify tags/collections; re-save rule |
| Time window drift | Future rule not yet active, or expired rule still applies | Re-save at the right time |
| Stacking misconfigured | Only one of several matching rules applies | Enable stacking on both; check allow-lists |
| Country/POS filter | International or POS customers excluded | Broaden conditions or add catch-all rule |
| Plan change divergence | State mismatch after downgrade | Toggle each rule to force resync |
| Widget/discount mismatch | Widget shows but discount doesn't (or vice versa) | Install theme block; check rule active status |
| Eligibility/limits | Rule matches products but not the customer | Check customer tags, login, usage caps, combination |
Most "active but not applying" issues trace back to one of these nine checks. The underlying theme is the same in each case: the admin dashboard and the checkout are two separate systems connected by a sync pipeline, and anything that interrupts that pipeline — timing, errors, configuration gaps — creates the gap you're seeing.
If you've gone through the checklist and the discount still doesn't apply, the most useful thing you can do is test with the simplest possible cart: one product that you know matches the rule, no discount codes, no other promotions, a domestic shipping address, a logged-in customer that meets all eligibility conditions. If that cart gets the discount, the rule works — and the issue is in the conditions or configuration of the more complex carts you were testing. If it doesn't, the sync itself is the problem, and a rule toggle should clear it. If the toggle doesn't help, contact your app's support team with the rule ID, the last sync timestamp, and the test cart details — that gives them everything needed to trace the issue.
Markdo is a discount app for Shopify built on Shopify Functions. It ships with 19 storefront widgets, instant rule sync, and a free plan with 3 active rules and no credit card. See it on the Shopify App Store or read more about how Shopify Functions change the way discount apps work.