A WooCommerce coupon can look correct in the dashboard and still fail when a customer applies it. The usual cause is not the code itself, but a mismatch between the coupon rules and the cart: an expired date, an unmet spending threshold, an excluded category, or a usage limit that has already been reached.
Start with a controlled test instead of changing several settings at once. The steps below cover coupon restrictions, dates, usage limits, product categories, taxes, caching, themes, plugins, and custom code.
Begin with a simple test coupon
Create a temporary coupon at Marketing > Coupons using deliberately simple settings:
- Use a short code such as
TEST10. - Choose a fixed-cart or percentage discount.
- Leave minimum and maximum spend blank.
- Do not select products, categories, or exclusions.
- Leave usage limits and customer email restrictions blank.
Test the coupon in a private browser window with a published product that has a standard price. If it works, the original coupon probably has a restrictive setting. If it fails too, look beyond the coupon itself and investigate the cart, checkout, cache, theme, or plugin environment.
Review the coupon restriction settings
Minimum and maximum spend
Open the couponās Usage restriction tab and compare its minimum or maximum spend with the eligible cart subtotal. The subtotal is not always the same as the order total: shipping, taxes, and other discounts may be calculated separately.
For example, a coupon requiring a $100 subtotal may fail if another discount reduces the eligible product total below $100. Test with a predictable cart containing only full-price products before changing the coupon.
Individual use and coupon combinations
When Individual use only is enabled, WooCommerce may reject the coupon if another coupon is already in the cart. Remove all other coupons and try again.
Do not assume that two valid coupons can be combined. If your promotion depends on stacking discounts, check each couponās individual-use setting and any custom rules that control coupon combinations.
Products and categories
Check the Products, Exclude products, Product categories, and Exclude categories fields. A coupon may be limited to one category while the customer is testing with a similar-looking product from another category.
Test with a product you know is included and not excluded. Variable products can require extra care because the parent product, variation, and assigned categories may not correspond to the selections made in the coupon settings.
Check expiration dates and usage limits
Inspect the Coupon expiry date and confirm the WordPress timezone under Settings > General. Date boundaries can produce confusing results when the storeās timezone differs from the customerās local time.
Then review these usage settings:
- Usage limit per coupon: The total number of times the coupon can be used.
- Usage limit per user: The number of uses allowed for one customer or account.
- Limit usage to X items: The number of eligible items that can receive the discount.
Check the couponās current usage count and test both while logged in and logged out. Guest and registered customers may be identified differently depending on the storeās checkout configuration and extensions.
Check sale items, tax, and free-shipping rules
The Exclude sale items option prevents a coupon from applying to discounted products. If it is enabled, test with a full-price product.
For a free-shipping coupon, confirm that a free-shipping method is available in the customerās shipping zone. The coupon cannot create a shipping method that the zone or product setup does not provide. For related troubleshooting, see how to fix WooCommerce shipping not showing at checkout.
Tax display and calculation settings can also make a minimum-spend rule appear inconsistent. Compare the coupon requirement with the storeās tax configuration and repeat the test using a product with a clear, predictable price.
Clear caches and refresh the cart
WooCommerce coupon validation depends on the current cart session. A cached cart or checkout response can show an old total or an outdated coupon message.
Clear the browser cache, page-cache plugin, server cache, and CDN cache. Then test in a private window. Cart, checkout, and account pages should be excluded from full-page caching, and requests containing changing cart data should not be cached. If the site uses object caching, purge it according to the cache plugin or hosting providerās instructions.
You can also remove the coupon, update the cart, and apply it again. This refreshes the cart state and helps distinguish an outdated notice from a genuine validation failure.
Test for plugin and theme conflicts
Membership, subscription, bundle, dynamic-pricing, checkout-editor, and payment plugins can change how coupons are validated or how cart totals are calculated. A conflict is especially likely when a coupon works with a simple product but fails with a subscription, bundle, variation, or membership product.
Use a staging site if possible. Temporarily switch to a default WooCommerce-compatible theme and deactivate nonessential plugins. Test after each change instead of disabling everything and changing several variables at once. Keep WooCommerce and its extensions updated, but back up the site and check compatibility before updating a production store.
Review WooCommerce system status and enable logging only for as long as necessary. Never expose debug output or customer information on a live site. If the issue involves PHP errors or custom checkout code, a WordPress backend developer can trace the failure more efficiently than repeatedly changing coupon settings.
Inspect custom coupon code and hooks
Custom snippets may intentionally reject coupons or alter cart totals. Search the active themeās functions.php, custom plugins, and code-snippet plugins for coupon-related logic and hooks such as woocommerce_coupon_is_valid, woocommerce_coupon_error, and cart-total filters.
Do not delete a snippet without understanding its purpose. It may enforce a business rule based on user role, product type, shipping country, cart contents, or payment method. Test changes on staging and compare the behavior with the custom code enabled and disabled.
add_filter( 'woocommerce_coupon_is_valid', function ( $valid, $coupon ) {
// Add logging or a temporary condition only on a staging site.
return $valid;
}, 10, 2 );
This example does not repair a coupon by itself. It illustrates the validation hook a developer might inspect. Avoid logging coupon codes, customer data, or payment details on a public production site.
When to hire a WooCommerce developer
Consider hiring a WooCommerce developer when a coupon works in a clean test but fails in the real checkout, when it interacts with subscriptions or bundles, or when custom pricing code is involved. A developer can reproduce the issue on staging, inspect notices and logs, test plugin combinations, and make a focused change without weakening every coupon rule.
Frequently asked questions
Why does WooCommerce say a coupon is invalid?
The code may be expired, mistyped, below its minimum spend, restricted by product or category, already at its usage limit, blocked by another coupon, or rejected by custom validation code.
Why does a coupon work in the cart but not at checkout?
Checkout can recalculate shipping, taxes, customer eligibility, and other rules. Caching or checkout customization plugins may also cause the cart and checkout to display different results.
Can caching stop WooCommerce coupons from working?
Yes. Cached cart or checkout responses can display stale totals or validation messages. Exclude dynamic WooCommerce pages from page caching, purge the relevant caches, and retest in a private window.
Should I disable every plugin to find the conflict?
Use a staging site when possible. Deactivate nonessential plugins temporarily and reactivate them one at a time. This identifies the conflict while limiting risk to the live store.
Conclusion
Fix WooCommerce coupon codes methodically: test a simple coupon, review restrictions and dates, check usage limits and product categories, clear caches, and isolate theme or plugin conflicts. When advanced product types or custom PHP are involved, professional debugging can identify the validation problem while preserving the promotion rules your store needs.
