A coupon accepted on the cart page can disappear when checkout recalculates prices against the final address, shipping, tax, user and product state. It can also be lost with the WooCommerce session or removed by custom code during an AJAX update.
Record the exact coupon and cart conditions. Repeatedly creating replacement coupons can hide the original rule conflict and introduce unintended discounts.
Confirm whether the coupon is removed or only hidden
Compare the cart total, discount line and checkout total. Inspect the checkout request response and WooCommerce notices after the address loads.
If the total still includes the discount but the line is absent, review the theme or checkout block display. If the total increases and the coupon no longer appears in the cart object, investigate validation or session state.
Use a controlled coupon and test product; do not publish live codes in screenshots.
Reproduce the recalculation trigger
Apply the coupon, then change one factor at a time: billing country, shipping postcode, shipping method, account login or payment method. Note the moment it disappears.
Stable comparison:
coupon code and type
product IDs and quantities
customer/guest state
address region
shipping method
subtotal before tax
This isolates a real eligibility change from a general checkout failure.
Review coupon restrictions
Check minimum and maximum spend, individual-use setting, excluded sale items, products, categories, email restrictions, usage limit and expiry. WooCommerce may evaluate spend before or after particular discounts depending on configuration.
Product variations and parent products can interact differently with inclusion rules. Confirm the actual variation ID in the cart.
If an email restriction applies, a guest may not become eligible until a billing email exists. The checkout should explain the rejection rather than silently removing the code.
Follow the customer session
Inspect whether the same WooCommerce session cookie survives from cart to checkout. A host, HTTPS or cookie-consent transition can create a new session with no applied coupons.
Verify the cart itself remains identical. If products also disappear, repair session continuity rather than coupon configuration.
Do not clear all sessions to test one coupon; preserve the failing browser and active customer carts.
Exclude checkout from shared cache
Cart and checkout totals are customer-specific. Inspect response cache headers and ensure both pages plus WooCommerce AJAX endpoints bypass full-page cache.
A cached checkout can display an earlier total even while the current server session contains the coupon. Test after cache has warmed, not only immediately after purging.
Currency and language caches must also vary correctly if coupon restrictions depend on converted totals.
Inspect custom validation and removal hooks
Discount, membership and checkout plugins may remove coupons during recalculation. Search maintained code for coupon validation filters and calls such as:
WC()->cart->remove_coupon( $coupon_code );
Determine which condition runs during update_order_review. Avoid code with side effects in a filter that WooCommerce may execute several times.
Log the coupon identifier and rule outcome during a controlled test, not customer emails or full cart data.
Repair the rule and customer message
Correct the session, cache, restriction or custom condition demonstrated by the test. If the coupon is genuinely invalid after an address or product change, keep the rule and show a clear reason.
Do not weaken usage limits or excluded-product rules globally to resolve a display problem.
Complete checkout with an eligible coupon and verify the discount appears in the WooCommerce order and provider total. Then test an ineligible case, refunds and tax rounding.
Recurring care should include coupon acceptance tests after pricing, tax, currency, checkout and promotion-plugin changes. The definitive result is the stored order total, not a temporary cart message.