Work through these first
Each of these produces the same symptom: the code is accepted or the automatic discount exists, and the total does not change.
- 01Combinations. The most common cause. A discount only stacks with another if you have allowed that combination. Two discounts that each work alone can leave one silently ignored when both apply.
- 02Minimum requirements. A minimum purchase amount is checked against the subtotal after other discounts, so a cart that looks like it qualifies can fall under the line.
- 03Customer eligibility. If the discount is limited to a segment, a buyer who is not in that segment gets nothing and no explanation. Segments update on their own schedule, so a customer can drop out without anyone touching the discount.
- 04Active dates. An end date that has passed leaves the discount visible in your admin and inert at checkout.
- 05Usage limits. A total usage cap, or one use per customer, will stop a code that worked yesterday.
- 06What it applies to. A discount scoped to a collection does nothing for a product that is not in it. Products get added to a store far more often than collections get updated.
- 07Currency and market. A fixed-amount discount behaves differently across markets to a percentage. Check the market the order came from, not your own.
Something changed, and it was probably not the discount. Look at what else moved: a new app that owns pricing, a collection that was edited, a Script that was retired on 30 June 2026, or a customer segment that refreshed. The discount is often the thing that reports the problem rather than the thing that caused it.
Check it against a real order
Settings tell you what should happen. An order tells you what did. Pick an order that qualified and put the two side by side.
Do this for a handful of orders across a couple of weeks. One order proves nothing. A rule that fires on none of the orders that qualified is broken, whatever the settings page says.
The part that costs money
A discount that fails at checkout is usually caught within a day, because the customer is standing there and they complain.
A discount that fails after checkout is not. The order completes, the customer pays more than they expected and says nothing, and the next hundred orders do the same. By the time someone notices, the money is spread across a month of orders and there is nothing to refund against without going back through all of them.
The same is true in the other direction. A discount applying more widely than intended is a margin leak that no customer will ever report to you.
Where ShopCanary fits
ShopCanary is a monitoring app for Shopify stores, built by HJB CodeForge. You declare the rules that should always hold, in plain terms. It checks every order against them as the order arrives.
When a rule does not fire, the alert names the order and the rule, with expected against actual. That is the comparison in the table above, done for you, on the first order rather than the fiftieth.
It keeps a timeline of discount changes alongside the findings, so a rule that stops firing two hours after someone edited a discount reads as exactly that.
It reads your orders, products and discounts. It has no write access, so it cannot change a discount or a price.