A customer types the code from your email or flyer and the cart says Coupon "SAVE10" is not valid, Coupon "SAVE10" does not exist!, Sorry, this coupon is not applicable to selected products, or it says applied but the discount is $0.00. Or there is no coupon box at checkout at all. Every one of those customers was ready to pay and many leave. Two checks tell you whether WooCommerce is refusing the coupon on purpose or something else is getting in the way.
Go to WooCommerce > Settings > General and find Enable the use of coupon codes. If it is unticked there is no coupon box on the cart or checkout and every code fails. Then open Marketing > Coupons and find the code. It must be Published, not Draft, Pending or in the Trash, and the code the customer types must match it letter for letter (spaces count; WooCommerce ignores upper and lower case). A coupon you cannot find there is the "does not exist" message.
Open the coupon and read three tabs. General: the discount type and amount, and the Coupon expiry date. Usage restriction: minimum and maximum spend, Individual use only, Exclude sale items, the products and categories it applies to or excludes, and Allowed emails. Usage limits: limit per coupon and per user, and how many times it has already been used. Now compare with the cart that failed: one expired date, one sale item, one product outside the listed categories or one customer email that is not on the allowed list is enough. WooCommerce's message usually names which rule it was, so write the exact message down before you change anything.
| What you see | Cause | Fix |
|---|---|---|
| No coupon box on the cart or checkout | Coupons are switched off, or the theme or a checkout plugin hides the field | Tick Enable the use of coupon codes; if it is ticked, switch to a default theme for one test to see whether the theme removed it |
| "Coupon does not exist" | A typo, a space at the end of the code, the coupon is in Draft or Trash, or it was made on a staging copy of the site and never on the live shop | Publish the coupon on the live site and send customers the exact code; avoid codes with O and 0 or I and 1 that are easy to mistype |
| "This coupon has expired" | The expiry date has passed; the date runs on the site's time zone, so a coupon can expire hours early or late | Move the date, and check Settings > General time zone is your own city, not UTC |
| "The minimum spend for this coupon is..." | Minimum spend counts the cart before tax and shipping | Lower the minimum or say "over $50 before shipping" in the promotion |
| "Not applicable to selected products" or a $0.00 discount | Exclude sale items is ticked and the cart is all sale items, the products or categories list leaves these out, or a variation's parent product is listed instead of the variation (or the reverse) | Untick Exclude sale items if you meant to allow it, add the missing categories, and test with the exact product the customer had |
| "Usage limit has been reached" or "not valid for you" | Limit per coupon or per user is used up (failed and cancelled orders can count too), or Allowed emails does not include the customer's billing email | Raise or clear the limit, and clear Allowed emails unless the coupon really is for named people |
| "Sorry, coupon has already been applied and cannot be used in conjunction with other coupons" | Individual use only is ticked on one of the two coupons | Remove the other coupon first, or untick Individual use only if stacking is fine |
| Works when you test, fails for customers; or the cart shows the old total | A page cache or CDN serves a saved copy of the cart or checkout, so the discount never shows | Exclude cart, checkout and my-account from the cache plugin and the host's cache, then purge it |
| Fails only with one payment method or one plugin on | A dynamic pricing, subscriptions or checkout plugin changes the cart totals after the coupon applies | Turn plugins off one at a time on a staging copy to find it, then use that plugin's own coupon setting or update it |
Log out (or use a private window), add the same product the customer had, and apply the code at the cart. The line under the subtotal should read the coupon name and the discount, and the order total should drop by that amount. Then go to checkout and check the discount is still there on the order review before you pay. Repeat once with a product on sale if the promotion should include sale items.
If you would rather someone else finds why the coupon is refused and fixes it, that is what the box below is for. Related: WooCommerce checkout not working, add to cart not working, changes not showing (cache).