When a WooCommerce coupon doesn’t work, the error message usually tells you why: the code doesn’t exist (it was never created, is still a draft or is spelled differently), it has expired, it has reached its usage limit, or the cart doesn’t meet its rules. If there is no message at all and the page just reloads with the same total, the coupon request is not reaching WooCommerce: a cache, a CDN or another plugin is getting in the way.

Why it happens

  • The code doesn’t exist. The coupon was never created, is saved as a draft, is scheduled for later or is in the trash. Or the ad says SUMMER20 and the coupon is SUMMER-20. The shopper sees Coupon “summer20” cannot be applied because it does not exist.
  • It expired a day early. WooCommerce coupons can’t be used on the expiry date itself. If the sale ends on the 31st and you set the 31st, the coupon stops working on the 31st.
  • It ran out of uses. The Usage limit per coupon or Usage limit per user was reached. Orders left in Pending payment or On hold also count as a use until they are cancelled or fail.
  • It’s held by an unfinished checkout. When a coupon is close to its limit, WooCommerce reserves a use while someone is paying. Other shoppers see “Usage limit for coupon … has been reached. Please try again after some time”. The hold lasts as long as the Hold stock (minutes) setting.
  • The cart doesn’t fit the rules. Minimum or maximum spend, products or categories it doesn’t cover, Exclude sale items, Individual use only, or an Allowed emails list that doesn’t include the shopper’s email.
  • Coupons are turned off. The option that enables coupon codes is unchecked, so there is no coupon field at all.
  • Cache or a plugin conflict. A page cache or CDN caches the cart or the coupon request, or a plugin changes the checkout. This is what happened in an October 2026 thread on the WooCommerce forum: the page reloaded, the total didn’t change, and the cause turned out to be a plugin the owner needed.
  • A plugin creates its own coupons. Discount and pricing plugins sometimes add coupons automatically. If the plugin is misconfigured, the shopper gets “does not exist” for a code they never typed, with a long code like wcpd_bacs_….

How to check it yourself

  1. Try the exact code. Open your store in a private window, as a guest, add a normal product (not on sale) and type the code exactly as it appears in the ad. Write down the message you get. Upper or lower case doesn’t matter: WooCommerce treats SAVE10 and save10 as the same code.
  2. Find the coupon. Go to Marketing > Coupons and search for the code. Check that its status is Published, not Draft, Pending or Scheduled, and that it isn’t in the trash.
  3. Check the dates. Open the coupon and look at General > Coupon expiry date. If it’s today or earlier, that’s the problem.
  4. Check the uses. The coupon list shows how many times each coupon has been used against its limit. Then open Usage limits in the coupon. If the limit is close, look in WooCommerce > Orders for unpaid orders with that coupon.
  5. Check the rules. In Usage restriction, read every field: minimum and maximum spend, products, categories, exclusions, sale items and allowed emails. Try again with a cart that meets all of them.
  6. Check the setting. Go to WooCommerce > Settings > General and make sure Enable the use of coupon codes is checked.
  7. If there’s no message. Open the browser’s developer tools (F12), go to the Network tab and apply the coupon. In the classic checkout you’ll see a request with wc-ajax=apply_coupon; in the block checkout, a request to /wp-json/wc/store/. If it fails, returns an error or doesn’t appear at all, the problem is cache, a firewall or a plugin, not the coupon.
  8. Look at the logs. WooCommerce > Status > Logs may show a fatal error from the plugin that breaks the checkout.

How to fix it

If the code doesn’t exist: create it in Marketing > Coupons > Add coupon with exactly the code the campaign is sharing. If you already have a coupon with a different spelling, the quickest fix is to create a second coupon with the spelling people are using.

If it expired: set the expiry date to the day after the sale ends. If the campaign is still being shared after the sale, decide whether to extend it or let it fail on purpose.

If it ran out of uses: raise the Usage limit per coupon. To get back uses held by unpaid orders, cancel the old Pending payment orders: WooCommerce gives back the use when an order is cancelled or fails. If you see the “try again after some time” message often, check WooCommerce > Settings > Products > Inventory > Hold stock (minutes); a very long hold keeps coupons reserved for longer.

If the cart doesn’t fit: relax the rule that’s blocking it, or say it in the ad (“from 50 USD”, “not valid on sale items”). A rule the shopper doesn’t know about looks like a broken coupon.

If the page just reloads:

  1. In your cache plugin, CDN or host cache, exclude the cart, checkout and My Account pages, and every request with ?wc-ajax=. Most cache plugins do this for WooCommerce on their own, but check it, especially in a CDN like Cloudflare.
  2. Clear all caches and try again in a private window.
  3. If it still fails, do a conflict test. Install the free Health Check & Troubleshooting plugin, turn on troubleshooting mode (it only affects your session, not your shoppers), switch to the Storefront theme and leave only WooCommerce active. Turn plugins back on one at a time until the coupon breaks.
  4. If the culprit is a plugin you need, ask in that plugin’s support forum. Send them what you found in the Network tab.

If a plugin creates the coupons: open that plugin’s settings and look for the rule linked to the payment method or the cart (in the Spanish thread, the code had bacs, which is bank transfer). Turn it off or fix it, and ask the plugin’s support.

How to stop it from happening again

The worst part of a broken coupon is that you don’t see it: the shopper reads “does not exist”, leaves, and there’s no order to look at. Melopo Radar counts, through its plugin, the codes your store rejects at checkout. When the same code fails 3 or more times in a week (you can change that number), it tells you which code it is, why it fails (doesn’t exist, expired, out of uses, or not valid for the cart) and how many tries it had. It doesn’t warn you about minimum spend or coupons for another customer’s email, because that’s the coupon working as you set it up. It only saves the code and the reason, never who tried it. Two honest limits: it doesn’t fix the coupon for you (you do it in Marketing > Coupons), and it can’t see the cache or plugin problems above, because there the request never reaches WooCommerce. This check is part of the Sales at Risk add-on (9 USD a month), comes with the Agency plan and is unlocked during the 14-day free trial. For a quick general look at your store, there’s also the free scanner.

FAQ

Are WooCommerce coupon codes case-sensitive? No. SAVE10, save10 and Save10 are the same coupon. Spaces and hyphens do count.

Why does my coupon say it has expired when the date is today? Because WooCommerce coupons can’t be used on their expiry date. Set the day after the last day of the sale.

Why is the usage limit reached if hardly anyone used the coupon? Unpaid orders in Pending payment or On hold count as a use until they’re cancelled. When the coupon is close to its limit, an open checkout can also hold a use for a few minutes.

The coupon works for me but not for my customers. Why? Usually you’re logged in as admin and they aren’t. Try as a guest in a private window, check that the coupon is published, and check the Allowed emails and Usage limit per user fields.

Do coupons work with the block checkout? Yes. The coupon field is in the order summary. If it fails only there, check for plugins that aren’t compatible with the Cart and Checkout blocks.