WooCommerce coupon not applying at checkout: what I check
Discount code entered but WooCommerce will not apply it at checkout. Here is the checklist I run: expiry, usage limits, product rules, stacking, cart totals, and plugin conflicts.

Customer pastes the code, hits Apply, and nothing happens. Or it flashes an error and the total stays the same. On a busy day that looks like the shop is broken, even when the catalogue and payment gateway are fine.
I treat a coupon that will not apply as a rules problem first, not a theme problem. Below is the order I work through before I start disabling plugins on a live checkout.
Confirm the coupon still exists and is published
In Marketing → Coupons (or WooCommerce → Coupons on older installs), open the code exactly as the customer typed it. Check it is Published, not Draft or Trash. Confirm the coupon code string matches character for character, including case if a plugin enforces that.
I also check whether someone created a near-duplicate code with a trailing space or a different discount type. Two almost-identical codes are a classic support ticket.
Expiry, usage limits, and per-user caps
Open the Usage restriction and Usage limits tabs. Common blockers:
- Expiry date already passed (timezone on the server vs the date you typed in admin)
- Usage limit reached on a launch or newsletter code
- Usage limit per user hit because the email or account already redeemed it
- Minimum or maximum spend the cart does not meet after tax and shipping settings
If the coupon is limited to specific emails, the checkout email must match. Guests who mistype the email fail silently or with a vague message depending on the theme.
Product, category, and excluded sale items
Coupons often only apply to certain products or categories, or they exclude items already on sale. A cart full of sale SKUs with "exclude sale items" ticked will never take the code, even though the code is valid.
I add one eligible full-price product to a test cart, apply the code, then swap back to the customer's mix. If it works on the clean cart, the restriction is doing its job and the messaging on the front end is what needs fixing, not the coupon engine.
Individual use and stacking
"Individual use only" means the coupon refuses to sit next to another discount, automatic coupon, or membership price. Some plugins add a second discount in the background (loyalty points, BOGO, dynamic pricing). The customer sees one field and assumes the shop is broken.
On staging I empty other automatic discounts, apply the code alone, then re-enable stacking plugins one at a time until the conflict shows up.
Tax, shipping, and what the coupon actually discounts
Percentage and fixed cart coupons behave differently once tax-inclusive pricing and shipping are in play. A fixed product coupon will not shave shipping. A coupon set to apply before tax can look "wrong" next to a tax-inclusive catalogue.
I compare the cart totals line by line with tax display settings in WooCommerce → Settings → Tax. If the number moves but the customer expected free shipping instead of 10% off products, that is a expectations and copy problem, not a broken apply button.
Checkout blocks, caching, and JavaScript errors
After a theme or checkout-blocks update, the Apply button can stop talking to Woo even when the coupon rules are fine. Open the browser console on the checkout page, apply the code, and look for failed admin-ajax or Store API calls.
Full-page cache on cart and checkout is another regular cause. Purge cache for those URLs, bypass the CDN for a test, and try again in a private window. If the coupon applies with cache off, fix the cache exclusions before touching coupon settings again.
Plugin conflicts after an update
Coupon, loyalty, and currency plugins all hook the same totals pipeline. After an update they can disagree about whether a code is valid.
On staging:
- Switch to a default theme briefly
- Keep Woo and the payment plugin only
- Create a simple percentage coupon with no restrictions
- Apply it on checkout
- Re-enable marketing and pricing plugins in small batches
If a bare coupon works on a default stack, the rules or a conflict are the issue, not Woo core.
When to stop guessing
If a wide-open test coupon works, the customer's code fails only on their cart mix, and cache plus console are clean, stop shotgun-editing live coupons. At that point you want a staging clone, the exact cart contents, and someone who has seen stacking and Store API checkout conflicts before.
Need this sorted properly? If coupons still will not apply after the checklist, I dig into restrictions, stacking plugins, and checkout conflicts on live Woo stores.
Most "coupon not applying" tickets come down to expiry or usage caps, product or sale exclusions, individual-use stacking, or a cached checkout that never hits Woo. Check the coupon record against a clean cart first, then cache and plugins. Cheers, and get that discount landing.
Need a hand with this?
Get help with a broken order journey, custom store features or ongoing WooCommerce care.
Find the right support
A related project
A custom price history feature for WooCommerceBespoke plugin work to record product price changes and present the history by date, delivered through an agency.
Related Articles
Building a WooCommerce Store Versus Maintaining One -- Why They Are Different Jobs
Building a WooCommerce store and maintaining one that handles complex business logic are completely different types of work. Here is what changes when a store becomes operational infrastructure.
Why WordPress Sites Get Slow and How to Fix Them
A slow WordPress site is almost always caused by one of a handful of fixable problems. Here is how to diagnose what is actually slowing yours down and how to address it properly.
Why WordPress Agencies Should Build Their Own Blocks Plugin
Custom WordPress blocks can save time, reduce messy theme code, and make sites easier to manage. DawsonyWeb builds reusable blocks, plugins and WooCommerce tools for businesses and agencies.