When a discount not applying at checkout trips you up, the cause is almost never mysterious. It’s one of three things, and they fail in this order of likelihood: the cart doesn’t meet an eligibility condition the discount requires, the discount can’t combine with another one already on the cart, or an app is applying or blocking a discount of its own. Work through those three in order and you’ll find it. Random codes, currency edge cases, and subscriptions are real but rarer. Start with the conditions, because that’s where roughly nine out of ten of these tickets end.
Diagnose before you change anything
Reproduce the failure first. Build the exact cart the discount is supposed to reward — the right products, the right quantities, the right subtotal — with the same customer state (logged in or guest) you’ll ship to shoppers. Then open the discount in Discounts and read its conditions line by line against that cart. Most “broken” discounts are working exactly as configured; the cart simply doesn’t qualify. Only once the qualifying cart still fails should you move on to combinations and apps.
The likely causes, in order
Go down this checklist top to bottom. Stop at the first one that matches — don’t change five things at once.
- Minimum requirements not met. A minimum purchase amount or minimum quantity is the single most common culprit. Shopify checks the subtotal after other line-item discounts, so a cart that looks like it clears the threshold on the product page can fall under it at checkout.
- Eligible products or collections. If the discount is scoped to specific products or a collection, only those items get the discount — and if none are in the cart, nothing applies. Watch for products that were removed from the collection after the discount was created.
- Customer eligibility. A discount limited to specific customers or customer segments won’t apply to a guest or to a shopper outside that segment. This one bites when you test as an admin but ship to logged-out traffic.
- Active dates and time zone. Discounts have a start (and optional end) date evaluated in your store’s time zone. A discount scheduled to start “today” may not be live yet in the shopper’s region.
- Usage limits. A per-code total-uses cap or a one-per-customer limit silently stops the discount once it’s hit. Reused test codes are a classic false alarm here.
- Combination rules. Shopify sorts discounts into three classes — product, order, and shipping — and two discounts of the same class don’t stack. A code won’t apply on top of an automatic discount unless both are explicitly marked combinable across their classes. This is covered in depth in how to run multiple discounts on Shopify.
- Markets and currency. Fixed-amount discounts are set in a specific currency. Under Shopify Markets, a shopper checking out in another currency may see the amount behave unexpectedly, and market-specific pricing or price adjustments can interact with the discount’s threshold.
- Subscriptions. Subscription line items follow their own discount handling. A discount that works on a one-time purchase may not attach to a subscription line, or may only apply to the first order versus recurring ones.
- App conflicts. Cart, bundle, or discount apps that rewrite line items or apply their own discount can block a native one — especially storefront-JavaScript apps whose cart-page total doesn’t survive server-side re-evaluation at checkout.
Causes and fixes at a glance
| Cause | What you’ll see | Fix |
|---|---|---|
| Minimum spend/quantity | Discount vanishes below the threshold | Recheck the post-discount subtotal; lower or clarify the minimum |
| Wrong products/collection | Applies to some carts, not others | Confirm cart items are in the eligible collection; refresh stale collection membership |
| Customer eligibility | Works as admin, fails for shoppers | Test logged-out; widen the segment or remove the customer restriction |
| Inactive dates/time zone | Nothing applies “yet” | Verify start date and store time zone; set it live |
| Usage limit reached | Code stops working after a while | Check total-uses and one-per-customer caps; issue a fresh code |
| Same-class combination | Second discount never stacks | Enable combinations across classes, or run one offer per class |
| Markets/currency | Fixed amount behaves oddly abroad | Use percentage discounts for multi-currency, or set per-market values |
| Subscriptions | Applies to one-time, not recurring | Configure the discount for subscription lines explicitly |
| App conflict | Cart total right, checkout wrong | Disable the app’s discount and retest; move logic to a Function |
How to isolate it fast
Once you have a qualifying cart that still fails, run three quick tests. One: temporarily disable any discount, cart, or bundle app and retry — if the native discount suddenly applies, you’ve found an app conflict. Two: if you run automatic discounts, confirm you’re not colliding with a code of the same class; the interplay is explained in how to create automatic discounts on Shopify. Three: if you sell internationally, repeat checkout in a second currency to expose a Markets or fixed-amount issue. Each test changes exactly one variable, so the result actually tells you something.
When custom logic is the right answer
Native discounts are fine for simple rules. But once your offer depends on combinations native combinations can’t express — “the best of three overlapping promotions,” tiered thresholds, per-customer logic, or a free gift that must survive cart edits — you’ll keep fighting the platform’s guardrails. That’s the point to move the logic into a Shopify Function: server-side discount code that Shopify evaluates at checkout, so the qualifying offer always applies and an unqualified one never leaks through. Unlike a storefront script that only decorates the cart page, a Function re-validates the real order at payment time. We compare the two approaches directly in Shopify Functions vs discount apps. When the rules outgrow the native UI, our Custom Apps & Shopify Functions service is built for exactly this — checkout-enforced discount logic that does what you meant, not what the settings allow.
Common mistakes
- Testing as the store owner. Admin sessions and staff accounts can mask customer-eligibility and segment rules. Always confirm with a logged-out, real-world cart.
- Assuming “combinable” means “stacks.” Combinable is across classes (product + shipping), not two of the same class. Two product discounts still won’t add together.
- Reading the cart-page total as truth. A JavaScript app can show a discount in the cart that the checkout never honours. The checkout total is the only one that counts.
- Changing several settings at once. You lose the ability to tell which change fixed it. Move one variable at a time.
- Ignoring the post-discount subtotal. Minimums are checked after other line-item discounts, which quietly pushes carts under the threshold.
Fix the eligibility conditions first, then combinations, then apps — and you resolve the large majority of these without touching code. When the offer genuinely needs rules native discounts can’t hold, enforce it at checkout rather than hoping the cart page is right.
Discount still not applying at checkout? If the rules are more complex than native discounts allow, we build checkout-safe discount logic with Shopify Functions so the right offer always applies. See our Custom Apps & Shopify Functions service or get a free profit audit.