A WooCommerce coupon that is not working may be correctly rejecting an ineligible cart. First separate three symptoms: the coupon field is missing, the code produces a refusal, or the discount applies with an unexpected total. Check the matching setting before changing the offer or disabling plugins.
If the problem appeared after a store migration, add a fourth question: was the coupon imported at all? A copied code is not proof that its restrictions or calculation survived the move.
Disclosure: Runner AI publishes this guide. WooCommerce instructions come from its documentation. The Runner migration example below describes inspected source and regression tests, not a completed live migration.
Match the symptom to the first check
Record the exact message, code, products, quantities, billing-email eligibility, and expected saving. Keep personal customer details out of public support reports.
| Symptom | First check |
|---|---|
| No coupon field | Whether coupons are enabled and how this checkout exposes the field |
| Code is rejected | Publication, expiry, restrictions, and usage limits |
| Saving is unexpected | Discount type and eligible items |
| Shipping remains | Free-shipping requirements |
| Code is missing after migration | Import result and unsupported-rule warnings |
For a missing field, WooCommerce’s coupon-management guide starts with WooCommerce > Settings > General > Enable coupons. Enable the use of coupon codes and save changes if coupons are intended for the store. Manage individual coupons under Marketing > Coupons.
If coupons are enabled but the field is still absent, investigate the checkout implementation separately. Do not replace a block-based checkout with an old shortcode solely because a tutorial assumes the classic checkout.
Check eligibility without widening the promotion
Open the affected coupon and compare its settings with the failing cart. WooCommerce documents these restrictions and limits in the same coupon-management guide.
- Publication and expiry. Confirm that the coupon is published rather than scheduled for later. WooCommerce says a coupon cannot be used on its expiry date, so check the actual date rather than assuming the offer lasts through that day.
- Minimum and maximum spend. Check the subtotal used by the store. WooCommerce uses the displayed cart subtotal for minimum spend, including tax when the cart displays prices including tax. Do not substitute the final amount including shipping.
- Products, categories, and sale items. Compare the actual cart items with both inclusion and exclusion rules. An item being visible in the catalog does not make it eligible for every coupon.
- Allowed emails. WooCommerce checks this restriction against the customer’s billing email. A code sent to one address need not work when checkout uses another.
- Usage limits. Distinguish the total limit per coupon, the limit per user, and the number of qualifying items that can receive a discount.
- Other coupons. Check Individual use only and test the affected coupon alone before investigating a combination.
WooCommerce coupon codes are not case-sensitive. Copying the code accurately still matters, but changing SAVE10 to save10 is not a fix for a spend threshold or email restriction.
Do not remove customer restrictions or raise usage limits on the live offer merely to make a test pass. First decide whether the refusal matches the advertised terms. Correct the configuration only when it differs from the approved offer.
Test a qualifying cart and its nearest failure
A passing cart alone cannot show whether the restriction works. Use one expected success and one expected refusal, then change only the condition being investigated.
The following is an illustrative test specification, not an observed checkout result. Assume a published 10% coupon, a $50 minimum, all test products eligible, no other discounts, and no tax or shipping in the example subtotal.
| Test cart | Expected result |
|---|---|
| $49 subtotal | Coupon rejected |
| $50 subtotal | $5 discount; $45 before tax and shipping |
| $60 subtotal | $6 discount; $54 before tax and shipping |
| Eligible cart, disallowed billing email | Coupon rejected when email restrictions apply |
| Eligible cart, another coupon | Result matches the combination settings |
Check the discount type before comparing totals. WooCommerce distinguishes fixed cart, fixed product, and percentage discounts. A $10 fixed-cart coupon removes $10 from an eligible cart; a $10 fixed-product coupon can remove $10 from each eligible item. Those are different offers, not two ways to enter the same value.
Shipping is separate. WooCommerce says ordinary coupons discount cart items, not shipping. For a delivery offer, follow its free-shipping configuration guide and verify the eligible shipping method as well as the coupon.
Investigate checkout conflicts only after the rules match
If an eligible cart still fails, preserve the exact reproduction before changing the environment. Note whether the problem happens in the cart, at checkout, after entering billing details, or only through a campaign link.
Use a staging copy for theme, extension, and cache experiments. Change one factor at a time and repeat the same cart. Disabling every plugin on a trading store can interrupt payments or other integrations and removes the context needed to identify the cause.
A useful support report includes the WooCommerce version, checkout type, relevant extension versions, exact error text, anonymized cart conditions, and the smallest reproduction. Never include API keys or a customer’s private billing information. If the failure belongs to an extension’s automatic or URL-based coupon behavior, use that extension’s documentation rather than assuming WooCommerce core applies the code automatically.
After migration, confirm the coupon exists before testing it
Runner’s migration source illustrates why coupon transfer needs its own check. The wooCommerceCouponRecord function in woocommerce-coupon-records.ts, in the server package’s store-migration service, records unsupported source settings rather than silently dropping their meaning.
The companion WooCommerce coupon adapter tests cover two concrete cases. A coupon restricted to allowed emails is skipped with a reason, and a WooCommerce free-shipping coupon is skipped because its behavior depends on WooCommerce shipping methods. The tests assert that no destination promotion is created in either case.
The same test file checks a supported percentage coupon and a fixed-product coupon with a minimum spend. These are controlled adapter tests. They do not prove that a particular merchant’s migrated checkout has passed.
The practical distinction is important: a skipped import is not a checkout refusal. Check the migration result first. If a rule could not be preserved, do not recreate an unrestricted code under the same name just to remove the error. Review the intended audience, shipping setup, calculation, and equivalent destination controls before approving a replacement.
For configuring a separate Runner promotion, use the Runner Promotions guide. For planning offer terms and reviewable campaign work, see Runner promotion management. Neither replaces the cart tests for your actual store. If the source connection itself fails, use the WooCommerce REST API guide before diagnosing individual imported records.
Related questions
Why does the coupon work for one customer but not another?
Compare billing-email restrictions and per-user usage limits, then compare the carts. A different product, subtotal, or sale-item mix can also change eligibility. One successful customer does not prove the offer is unrestricted.
Why does a coupon apply without removing shipping?
An ordinary WooCommerce coupon discounts items. Free shipping has separate requirements involving the coupon and shipping method. Check those requirements rather than increasing the product discount to compensate.
Should I create a new coupon when the old one fails?
Not before identifying the cause. A new code with the same restrictions can reject the same cart. A new code without them can accidentally widen the offer. Keep the original terms visible while diagnosing the failure.
Does a successful migration mean every coupon works?
No. Inspect each relevant coupon’s import outcome, resolve unsupported settings, and test the destination cart. The code, eligible audience, discounted items, minimum spend, and shipping behavior all need to match the offer you intend to honor.