Why Your WooCommerce Coupon Isn’t Applying: A Cause-by-Cause Diagnostic
WooCommerce Troubleshooting
The Coupon Is Valid. So Why Won’t It Apply?
A cause-by-cause diagnostic for every failure mode a WooCommerce coupon can hit — from timezone drift and spend thresholds to stacking rules, caching layers, and plugin conflicts.
A WooCommerce coupon that says it is valid but still refuses to apply is one of the more disorienting problems in day-to-day store management. The code works for one customer and not another. It worked yesterday. It fails silently with a vague error or no error at all. This guide is a companion to the WooCommerce coupon code not working overview — where that post maps the 12 most common causes, this one goes deeper into the mechanics of each, including the edge cases that look like a different problem than they actually are.
Work through the sections that match your symptom. Each one describes exactly what is happening under the hood, how to confirm that cause is yours, and the specific fix.
What this covers — and how to use it
WooCommerce coupon validation runs through a series of checks in sequence. The first check that fails stops the coupon from applying, and WooCommerce reports a deliberately vague error message. “Coupon is not valid” and “coupon is not applicable to your cart contents” are the two most common messages, and neither tells you which check failed.
This guide walks every possible point of failure in that validation sequence. For each one you get: the symptom the customer or you will see, the underlying cause, and the exact steps to confirm and fix it.
Where to start
If a coupon fails for all customers, start with expiry, usage limits, or coupons being disabled globally. If it fails for some customers but not others, go straight to email restrictions, per-customer usage limits, or cart-content differences. If it was working and suddenly stopped, check whether an active campaign plugin is now marking items as “sale items” and tripping the Exclude sale items setting.
Expiry date passed, or a timezone mismatch made it expire early
WooCommerce coupons expire at the end of the date you set in the Expiry date field — but “the end of that date” is determined by your store’s server timezone, not the customer’s local clock. A coupon set to expire on the 15th expires when the 15th ends in your store’s configured timezone. If your store is running on UTC and your promotional email told customers the coupon was “valid through the 15th,” customers in UTC-5 may find it rejected several hours before their midnight arrives.
Where to check
Go to WooCommerce → Coupons, open the coupon, and look at the Usage Restriction tab. Note the Expiry date. Then check WooCommerce → Settings → General → Timezone. That is the timezone the coupon expiry is evaluated against.
The fix
If customers are reporting early expiry due to timezone mismatch, extend the date by one day as a short-term fix. For future campaigns, build in a buffer — set the expiry to the day after you intend the promotion to end. If your audience spans multiple timezones and “valid through the 15th” is a marketing commitment, set expiry to the 16th so every timezone gets a full 15th.
The timezone setting in WooCommerce affects all time-sensitive operations across the plugin, not just coupons. If you are already troubleshooting time-related issues in your store, it is worth reviewing the full timezone configuration rather than adjusting one coupon in isolation.
Global or per-customer usage limit reached
WooCommerce tracks coupon usage and enforces two separate limits: a total cap across all customers, and a per-customer cap tied to the billing email. When either cap is reached, the coupon stops working — and neither WooCommerce nor the error message tells the customer which limit was hit or that any limit exists.
The per-customer limit is the more subtle of the two. It works by matching the billing email entered at checkout against previous orders that used the same code. A customer who checks out under multiple email addresses could use a per-customer-limited coupon multiple times. Conversely, a customer who genuinely checks out under a different email address from the one they used before will not be blocked even if they have technically hit their intended limit.
Where to check
Open the coupon and go to the Usage Limits tab. The Usage count field shows total redemptions to date. Compare that against the Usage limit per coupon field. If they match, the global cap is exhausted. Check Usage limit per user for the per-customer cap. To verify whether a specific customer has hit their personal limit, there is no built-in view — you would need to search orders filtered by that coupon and that billing email.
The fix
Raise or remove the relevant limit. If the global cap is exhausted and you want to extend the promotion, increase it. If a legitimate customer has hit a per-user limit you want to honor as a one-time exception, the only option in WooCommerce core is to temporarily raise the limit, let them checkout, then lower it again — there is no per-customer override in the admin UI.
Minimum spend not met — including after other discounts reduce the subtotal
Minimum spend checks run against the cart subtotal after any other applied discounts, not against the raw product total. This catches many store owners off guard. A customer with $52 of products already has a 10%-off automatic discount applied, bringing their subtotal to $46.80 — and a coupon with a $50 minimum spend will reject them, even though they have more than $50 worth of items in the cart.
The same subtraction applies to any item-level discounts already in place. If a campaign plugin is reducing prices before the coupon check runs, the effective cart subtotal that WooCommerce tests against the minimum could be meaningfully lower than what the customer sees on the product pages.
Where to check
Open the coupon, go to Usage Restriction, and look at the Minimum spend field. Then run a test checkout with the same cart contents the failing customer had. Look at the cart subtotal line — that is the figure WooCommerce compares against the minimum, not the sum of individual product prices.
The fix
If the threshold is correct and the cart simply does not qualify, the coupon is working as intended. If the minimum is inadvertently too high, lower it. If the problem is that a campaign plugin is reducing the subtotal below the threshold before the coupon check runs, you have a few options: lower the minimum to account for the discounted subtotal, exclude the relevant campaign products from the coupon, or adjust the campaign priority so the coupon applies first.
Maximum spend ceiling blocking high-value carts
WooCommerce coupons also have a Maximum spend field — less well-known than the minimum, and more likely to be set accidentally. A coupon configured with a maximum spend of $150 will silently fail for any customer whose cart subtotal exceeds that figure. No warning is shown before checkout. The customer enters their code, it is rejected, and they have no idea why.
Where to check
Open the coupon, go to Usage Restriction, and look at the Maximum spend field. If it contains any value, carts above that threshold will be rejected.
The fix
Clear the field entirely if you do not intend a ceiling. If the maximum spend is deliberate — for example, to protect margins on large orders — make that limit explicit in the promotional copy. Customers who hit an undocumented maximum spend ceiling and can not understand why their code fails will contact support or leave without buying.
Product or category restrictions — qualifying items not in cart
A coupon scoped to specific products or categories will only apply when at least one qualifying item is in the cart. The coupon can be perfectly valid and correctly entered, but if the customer’s cart contains nothing from the allowed product or category list, WooCommerce will reject it with “coupon is not applicable to your cart contents.”
The less obvious variant: a coupon restricted to “Accessories” applies only to products in that category. A customer with two accessories and one non-accessory in their cart will receive the discount only on the accessories — the non-accessory item is unaffected. If the coupon type is “Fixed product discount” and all qualifying items are removed from the cart, the coupon becomes inapplicable entirely.
Where to check
Open the coupon, go to Usage Restriction, and inspect the Products and Product categories fields. Any entries there define what the coupon applies to.
The fix
If the restriction is intentional, confirm the customer has a qualifying product in their cart. If the restriction is too narrow, expand the allowed list or remove it entirely for a storewide discount. If customers are frequently confused about which products qualify, consider making the restriction visible in the promotion copy — “valid on accessories only” prevents the support ticket.
Product or category exclusions blocking everything in the cart
The inverse of restrictions: a coupon that applies broadly across the store can exclude specific products or categories. If every item in the customer’s cart falls into an excluded group, the coupon fails for the whole cart. This is one of the most invisible failure modes because customers have no way of knowing which products are excluded — WooCommerce does not display that information at checkout.
Where to check
Open the coupon, go to Usage Restriction, and scroll down to the Exclude products and Exclude categories fields. If the customer’s cart items all match entries in those fields, the coupon cannot apply.
The fix
Remove the exclusion if it was set in error. If the exclusion is intentional — protecting margin on certain product lines — make that clear in your promotion copy. A short “not valid on [category name] products” note prevents the frustrated support email. WooCommerce will not communicate this automatically to the customer.
The “Exclude sale items” checkbox — the most common silent killer
Of all the ways a WooCommerce coupon can fail silently, the “Exclude sale items” checkbox is the most common. When this is enabled, the coupon will not apply to any product that currently has a sale price set in WooCommerce’s pricing system — regardless of how that sale price got there. If every item in the customer’s cart is currently on sale, the coupon fails entirely.
The trap that catches store owners: “sale item” means any product with a sale price in WooCommerce’s data, not just products you personally marked on sale last week. A campaign discount plugin that applies prices through WooCommerce’s sale price field, a scheduled product sale that started this morning, a bulk edit that set a sale price three months ago and was never cleared — all of those make a product a “sale item” in WooCommerce’s view, and a coupon with “Exclude sale items” enabled will refuse them all.
How discount campaign plugins interact with this setting
Different campaign plugins apply discounts in different ways. Some write a sale price to the product’s stored _sale_price field — in that case, every product in an active campaign is a “sale item” and a coupon with “Exclude sale items” enabled will fail for all of them. Other plugins (including Smart Cycle Discounts) apply discounts at display time through WooCommerce’s price filters rather than writing to the stored sale price field — in that case, the “Exclude sale items” checkbox does not block the coupon from applying to those products. Check how your specific campaign plugin applies discounts before assuming this setting is or isn’t the cause.
Where to check
Open the coupon, go to Usage Restriction, and look for the Exclude sale items checkbox. If it is ticked, also check whether any products currently in the failing cart have a sale price set. On the product edit page, look at Product Data → General — if the Sale price field has a value, that product is a sale item for coupon purposes.
The fix
Uncheck “Exclude sale items” if you want the coupon to work regardless of sale status. If you want to prevent discount stacking on already-reduced items, keep it enabled but be aware of the scope. A more precise approach is to exclude specific products or categories rather than using the blanket sale-item exclusion — it gives you the same margin protection with fewer unintended casualties.
Customer email restriction not matching billing email
WooCommerce coupons can be locked to specific email addresses via the Allowed emails field. When an address is listed there, the coupon only works when the billing email entered at checkout matches. WooCommerce checks against the billing email field at checkout — not the account email on record, not the email the customer originally signed up with.
This produces the “works for some customers but not others” pattern. A customer who was sent a personalized offer but checks out using a secondary email address — a work address, a spouse’s address — will be blocked. The same customer checking out with the correct email will have no problem.
Where to check
Open the coupon, go to Usage Restriction, and look at the Allowed emails field. If there are addresses listed, compare them against the billing email the failing customer used at checkout. You can find the billing email on any order detail page.
The fix
Add the customer’s correct billing email to the allowed list, or ask them to enter the address the coupon was issued to. If you want to remove email restrictions entirely and the coupon is intended for wider use, clear the field — but be aware that removing address restrictions on a privately distributed code effectively makes it a public code anyone can use.
Individual use and stacking rules preventing combination
WooCommerce’s Individual use only checkbox prevents a coupon from being applied alongside other coupons in the same cart. The mechanics are slightly counterintuitive: if coupon A has “Individual use only” enabled and a customer tries to apply coupon B afterward, WooCommerce blocks coupon B. But if the customer applies coupon B first and then tries to apply coupon A, coupon A will remove coupon B and apply itself. The order of application matters.
It is also worth noting that “Individual use only” applies to coupon-on-coupon interactions, not to campaign-level discounts. A campaign discount running through a plugin’s own price filters is generally not blocked by this setting — it depends on whether the campaign goes through WooCommerce’s coupon system or operates independently.
Where to check
Open the coupon, go to the General tab, and look at the Individual use only checkbox. Also check whether the customer already has another coupon applied in their cart — you may be able to see this if they contact support, or you can replicate their cart in a test checkout.
The fix
If coupons should stack, uncheck “Individual use only” on the relevant coupon. WooCommerce also provides an exception field on the “Individual use only” setting — you can list specific coupon codes that are allowed to combine with the individual-use coupon even when the restriction is active. This is useful when you want coupons to generally not stack but have one specific pairing that should be allowed.
For a deeper look at how stacking rules, campaign discounts, and coupon priority interact, the guide on discount stacking and priority in WooCommerce covers the mechanics in detail.
Free shipping coupon with no matching shipping zone method
A WooCommerce coupon set as a “Free shipping” type does not override all shipping costs automatically. It works by enabling the “Free shipping” method in WooCommerce’s shipping configuration — but only if that method exists and is correctly set up in the shipping zone that covers the customer’s delivery address. If the zone for the customer’s address has no “Free shipping” method, the coupon has nothing to activate and appears to do nothing.
Where to check
Go to WooCommerce → Settings → Shipping → Shipping zones. Open the zone covering the customer’s shipping address and look at the shipping methods listed. There needs to be a “Free shipping” method present with its “Requires” field set to either “A valid free shipping coupon” or the combined option. Also check the coupon’s General tab to confirm the Allow free shipping checkbox is ticked on the coupon itself.
The fix
Add a “Free shipping” method to the relevant shipping zone and configure its “Requires” field to recognize free shipping coupon codes. Once that method exists in the zone and the coupon’s “Allow free shipping” checkbox is enabled, the coupon will surface free shipping as an option when applied at checkout.
Coupons disabled globally
WooCommerce has a global toggle that enables or disables the entire coupon system. When disabled, no coupon field appears at checkout and no code can be applied at all — regardless of how individual coupons are configured. This toggle is occasionally switched off intentionally by store owners who do not use coupons, but it can also be silently disabled by a plugin during an update or by a settings reset during site migration.
Where to check
Go to WooCommerce → Settings → General and look for the Enable coupons checkbox (sometimes labeled “Enable the use of coupon codes” in newer WooCommerce versions). If unchecked, no coupon will work anywhere in the store.
The fix
Check the box and save. The coupon input field reappears at checkout immediately. If you are unsure when or why this was disabled, check your site’s activity log — plugins like Jetpack or WP Activity Log track settings changes and can tell you whether a recent update touched this setting.
Caching making a resolved coupon still appear broken
Caching causes a specific kind of confusion: a coupon that has been fixed — expiry extended, usage limit raised, product restriction removed — can still appear to fail for customers whose browsers or your server’s cache is serving a stale version of the page. The fix was applied, but the cache has not caught up.
The symptom that distinguishes a caching issue from a real coupon failure: if you apply the coupon in an incognito window on a different device, it works. The coupon itself is fine — the delivery of the corrected state to the failing browser is the problem.
Object caching (Redis or Memcached) adds an additional layer. A page cache clear may not fix it if WooCommerce pricing data is cached in memory separately. The cart and checkout also have their own transient caching of session state that can occasionally need a flush.
Where to check
Test the coupon in a fresh incognito window after making any configuration change. If it works there but fails in the original browser, caching is the explanation. Check your caching plugin’s WooCommerce integration settings — most major caching plugins (WP Rocket, LiteSpeed Cache, W3 Total Cache) have a dedicated WooCommerce mode that handles cache invalidation when product and coupon data changes.
The fix
Flush your caching plugin’s full page cache. If you run Redis or Memcached, flush the object cache as well. For WooCommerce-specific transient data, go to WooCommerce → Status → Tools and run Clear transients — this is a targeted flush of WooCommerce’s own cached pricing and session data. Instruct affected customers to clear their browser cache or test in a fresh incognito window.
Caching and the “still shows expired” variant
The caching problem also appears in reverse: a coupon that should no longer be active still appears valid on a cached page. If customers are applying a code they found on a coupon site and the code is technically expired but a cached page somewhere suggests it is still valid, the fix is the same — cache flush — but the communication challenge is different. If you are also dealing with stale sale prices that persist after a promotion ends, the guide on sale prices that won’t go away covers the full caching and transient picture for that scenario.
Plugin conflicts overriding or silently blocking the discount
A coupon that appears correctly configured, has none of the above restrictions in play, and still fails at checkout is almost certainly a plugin conflict. Dynamic pricing plugins, discount campaign plugins, checkout customization plugins, and some subscription or membership plugins can all interfere with WooCommerce’s coupon validation pipeline in ways that are not obvious from looking at the coupon settings alone.
The two most common mechanisms: a plugin hooks into WooCommerce’s price calculation and returns a modified price that the coupon discount then applies to zero (because the price is already zero or already-discounted to below the expected base), or a plugin incorrectly overrides the cart validation hook that WooCommerce uses to decide whether a coupon can apply.
How to diagnose
-
Replicate on staging
Create a staging copy of your site. Deactivate all plugins except WooCommerce. Apply the coupon to the same cart that was failing. If the coupon works with only WooCommerce active, a plugin is the conflict. Reactivate plugins one at a time — the coupon will break again when you activate the conflicting plugin.
-
Check your campaign or discount plugin’s stacking settings
If you use a campaign discount plugin, look for settings that control how it interacts with WooCommerce native coupons. Some plugins have a “disable coupons when campaign is active” mode, or a priority system that puts campaign discounts above coupon discounts. The plugin’s documentation should describe its coupon compatibility behavior. If the conflict is coming from Smart Cycle Discounts, check the campaign settings — campaign codes in Smart Cycle Discounts operate through the campaign system, not WooCommerce’s native coupon engine, so the interaction with native coupons is different from what you might expect.
-
Test with the default WooCommerce theme
Occasionally a theme’s checkout customization — particularly custom checkout page builders — interferes with coupon field processing. Switch to Storefront or a default block theme for a test checkout to rule this out. If the coupon works on the default theme, the conflict is theme-side.
-
Check block checkout compatibility
If your store uses WooCommerce’s block-based cart and checkout (the newer Cart and Checkout blocks, not the classic shortcode-based checkout), some older discount plugins may not apply correctly through the block checkout’s price pipeline. These plugins were written for the legacy shortcode checkout and haven’t been updated to register a Store API extension. If the coupon works on the classic checkout but not the block checkout, this is the likely explanation.
When the coupon conditions have simply become too tangled
There is a point at which a coupon configuration becomes genuinely too complex to manage reliably. Minimum and maximum spend, product inclusions, category exclusions, email restrictions, usage limits, and stacking rules all interact. A coupon that made sense when you created it can become unpredictable as your catalog changes, campaigns come and go, and product categories get reorganized. The more conditions in play, the more ways something can trip.
If you find yourself regularly diagnosing coupon failures, running through checklists for every support ticket, and fielding customer complaints about codes that “should work” — it may be worth asking whether coupon codes are the right mechanism for what you are trying to do.
Coupon codes work well for targeted, single-customer offers: loyalty rewards, personalized discounts, referral codes. They are less well-suited to store-wide promotions that involve complex product rules, timing precision, and volume at scale. A customer who encounters a broken coupon at checkout has a worse experience than one who simply sees a lower price without entering any code at all.
Campaign-based discounts — where the discount is applied automatically at product display and cart calculation without requiring a code — remove several of these failure modes entirely. There is no expiry-check failure, no stacking conflict, no email mismatch, no usage limit race condition. The trade-off is that you give up the ability to restrict who can use the discount, which matters for personalized offers. For broad promotions, that trade-off usually makes sense.
Smart Cycle Discounts runs campaign discounts that apply automatically without a coupon code — percentage off, fixed amount, BOGO, tiered pricing, spend thresholds, and bundles are all available free. If you want coupon-code behavior for specific campaigns (influencer codes, email blast codes, single-use gifts), it also supports code-required campaigns where the code goes through its own validation rather than WooCommerce’s coupon engine, with URL auto-apply for sharing codes in emails. Neither mode requires the complex per-coupon restriction setup that native WooCommerce coupons demand.
If you are trying to decide between native coupons and a campaign-based approach for your next promotion, the WooCommerce coupons vs. campaign discounts guide covers when each approach is the right choice.
Frequently asked questions
My coupon works for me but fails for specific customers. What should I check first?
The most common cause of customer-specific failures is an email address restriction — the coupon’s Allowed emails field lists specific addresses, and the failing customer is checking out with a different one. Check the coupon’s Usage Restriction tab for Allowed emails entries. The second most common cause is a per-customer usage limit that the customer has already hit. Check Usage Limits → Usage limit per user and cross-reference against that customer’s order history with this coupon code.
The coupon shows “valid” but the discount doesn’t appear in the cart total. What’s happening?
This specific symptom — coupon accepted but discount is zero — usually means a plugin conflict. Something is either pre-discounting the products to a price that leaves no room for the coupon’s calculation, or a plugin is accepting the coupon through validation and then overriding the cart total in a separate hook. To diagnose, deactivate all plugins except WooCommerce on a staging copy and test the coupon. If the discount appears correctly with only WooCommerce active, reactivate plugins one at a time until the discount disappears again.
Why does WooCommerce say “coupon is not applicable to your cart contents”?
This message covers several different failure modes that WooCommerce groups under one vague error: product or category restrictions (the required items aren’t in the cart), product or category exclusions (all cart items are excluded), the “Exclude sale items” setting (all cart items are currently on sale), and occasionally a minimum or maximum spend mismatch. Work through each in the order listed in this guide — product restrictions and the sale-item exclusion are the two most frequent causes of this specific error message.
Does the “Exclude sale items” setting affect products on sale through a campaign plugin?
It depends on how the campaign plugin applies its discounts. If the plugin writes a sale price to the product’s stored _sale_price database field, WooCommerce treats those products as sale items and the coupon exclusion applies. If the plugin applies discounts through WooCommerce’s price filters at display time — without writing to the stored sale price field — then WooCommerce does not classify those products as sale items, and the “Exclude sale items” setting does not block the coupon for them. Check your campaign plugin’s documentation or the product edit page: if the Sale price field has a value during an active campaign, the plugin is writing to the stored field and this setting will affect your coupons.
Can I see a log of why a specific coupon failed?
Not in WooCommerce core. WooCommerce does not write coupon validation failures to a log by default. The WooCommerce Status → Logs screen captures some events when logging is enabled, but coupon rejections are not among them by default. To get detailed coupon failure logging you would need a plugin specifically built for coupon auditing. For most troubleshooting, the faster path is to replicate the failure conditions in a test checkout and work through the checklist in this guide.
A coupon I just created has never worked. Where do I start?
Start with the global enable setting: go to WooCommerce → Settings → General and confirm “Enable coupons” is checked. Then open the coupon itself and look at the General tab — verify the coupon type (percentage off, fixed cart, fixed product, free shipping), check that the discount amount is set, and confirm “Individual use only” is not creating an unexpected block. Then check Usage Restriction for any minimum spend, product restrictions, or sale-item exclusions that might be tripping for your test cart. Most never-worked coupons have a configuration issue in one of those fields.
Is there a way to apply a WooCommerce coupon automatically without the customer entering it?
Not natively in WooCommerce core. You can get close with URL parameters — some plugins support auto-applying a coupon when a customer visits a URL with the coupon code appended as a query parameter. If you want discounts that apply automatically without any customer action and without a code at all, a campaign-based discount system handles that natively: the discount is part of the product price before the cart is assembled, with no entry step required.
Most WooCommerce coupon failures trace back to a single misconfigured setting that the generic error message doesn’t identify. The “Exclude sale items” checkbox and email address restrictions account for more support tickets than almost anything else. After those, timezone mismatch on expiry and per-customer usage limits are the next most frequent causes of the “works for me but not for them” pattern.
If you have worked through this entire list and the coupon still fails, a staging environment with all plugins disabled is the last diagnostic step — plugin conflicts are the one cause that cannot be resolved by reading the coupon settings alone. Isolate the environment, confirm the coupon works clean, and reactivate until it breaks.
What to take from this
- WooCommerce coupons fail silently by design — the error messages are vague to avoid revealing restriction details to customers. You have to diagnose the cause by checking settings directly.
- The “Exclude sale items” checkbox is the most common silent failure for stores that also run campaign discounts. Whether it affects a campaign plugin’s products depends on whether that plugin writes to the stored
_sale_pricefield or applies discounts through price filters at display time. - The minimum spend check runs against the cart subtotal after other discounts have already been applied — not against the raw product total. A coupon with a $50 minimum can fail on a $55 cart if another discount reduces the effective subtotal below the threshold.
- Email restrictions explain most “works for some customers, fails for others” patterns. The check is against the billing email entered at checkout, not the account email on record.
- Caching can make a resolved coupon appear still broken. Always test in a fresh incognito window after making any configuration change, and flush both page cache and WooCommerce transients after changes.
- If coupon conditions have grown too complex to manage reliably, campaign-based discounts that apply automatically remove most of these failure modes — at the cost of not restricting who can access the discount.