WooCommerce "Coupon Does Not Exist"? Causes & Fix
The coupon is sitting right there in your admin, published, in date — and checkout insists it doesn't exist. That contradiction is the clue: WooCommerce isn't reading your coupon list, it's reading a cached answer about it.
Last updated: 16 Jul 2026 · ~6 min read
If the coupon is published and visible in your admin, the usual cause is a persistent object cache (Redis, Memcached) serving a stale "not found" answer for that code. WooCommerce caches the code-to-coupon lookup, so a cache that wasn't invalidated keeps returning nothing. Flush the object cache and retry. If flushing fixes it instantly, that was it.
What this error actually means
Before WooCommerce checks anything about a coupon — dates, limits, restrictions — it has to turn the typed code into a coupon. It looks for a published coupon whose code matches, and caches that lookup. If it comes back with nothing, you get Coupon "CODE" does not exist! and no other checks ever run.
That's worth knowing, because it narrows things down hard. This error means not found — not expired, not used up, not restricted. An expired coupon says it has expired. A coupon at its usage limit says the limit is reached. So if you're seeing "does not exist" while looking straight at the coupon, only two things can be true: the lookup is being answered by a stale cache, or the coupon isn't in the state you think it's in.
The most common causes (most likely first)
- A persistent object cache is holding a stale "not found" for this codeThe coupon is published and visible in the admin, but checkout denies it. It usually starts right after you create, rename or restore a coupon. The proof is quick: flush the object cache (Redis, Memcached, or your host's object cache panel) and retry — if it works immediately, this was it.
- The coupon isn't actually publishedLook at the status column in
Marketing → Coupons, not just the row. Draft, Pending, Private, Scheduled for a future date, or sitting in the Trash all produce exactly this error — the lookup only matches published coupons. Scheduled is the sneaky one, because it looks finished. - The code doesn't match what's storedIt works when you type it by hand but not when you paste it. A trailing space, a non-breaking space, or a curly quote picked up from a Word doc or an email signature makes it a different string. WooCommerce also normalises coupon codes to lower case when they're saved.
- The coupon exists somewhere elseYou're looking at it in staging, or on a different site in a multisite network, or it didn't survive a partial database restore. Search for the code on the live site specifically, including the Trash, and confirm it's genuinely there.
- A plugin was generating the coupon and no longer isThe code isn't in
Marketing → Couponsat all, yet it used to work. Bulk-generator, subscription and loyalty plugins can register codes on the fly rather than storing them as real coupons — deactivate or break one and every code it supplied vanishes.
Where to look first
- Flush your object cache and retry the code immediately. Redis, Memcached, or whatever your host calls it. Works now? That was cause 1 — and the real question becomes why invalidation isn't firing.
- Open
Marketing → Couponsand read the status, not the name. Draft, Scheduled, Private and Trash all read as "does not exist" to checkout (cause 2). - Retype the code by hand instead of pasting it. If typing works and pasting doesn't, you have an invisible character in the code, not a coupon problem (cause 3).
- Confirm you're looking at the live site, not staging, and not another site in the network — and search the Trash while you're there (cause 4).
- Code not in the coupon list at all? Then it was never a stored coupon — something was generating it. Find which plugin, and check it's active and healthy (cause 5).
Coupon's right there and the store disagrees?
This one wastes time because the evidence lies — you're staring at a published coupon while checkout tells your customer it doesn't exist, and nothing in the admin explains the gap. DiagnosticIQ's free dashboard checks the layer the admin doesn't show you: whether a persistent object cache is sitting between WooCommerce and your coupons, and whether the coupon is really in the state the list makes it look like. Faster than flushing caches and guessing.
Get the free plugin →Made by Prima Digital — the team behind this guide. Free forever; no card to install.
How to know you fixed it
Apply the code in a fresh private window on the live site — it should be accepted and the discount should land on the cart total, with no error.
Frequently asked
Is this the same as an expired coupon?
No, and that's useful. Expired coupons say the coupon has expired, and used-up ones say the usage limit has been reached. "Does not exist" means WooCommerce couldn't find the coupon at all.
My customers are complaining — is it affecting everyone?
If it's a stale cache, usually yes, for that code, until the cache is flushed. If it's only some customers, look at the coupon's usage restrictions instead — but note those give different errors.
Will flushing the object cache break anything?
No. It just forces the store to look things up fresh. The site will be briefly slower while the cache refills, and that's all.
It keeps coming back after a flush. Why?
Then something isn't invalidating the cache when coupons change — often a misconfigured object cache drop-in, or coupons written into the database directly by an import rather than saved through WordPress.