How to Add Coupons to WordPress Products
A coupon field that actually works at checkout is one of the highest-leverage features in a WooCommerce store, and it ships in core. No plugin required for the basics. Where most tutorials stop short is the part that actually matters once you have more than a handful of codes running: restrictions, usage limits, expiry automation, and the abuse patterns that turn a generous discount into a margin problem. This guide covers setup start to finish, then goes into the parts that separate a coupon that quietly loses you money from one that does its job.
What a WooCommerce Coupon Actually Is
Under the hood, a coupon in WooCommerce is a custom post type, shop_coupon, with a set of meta fields controlling discount type, amount, restrictions, and usage tracking. That matters practically for two reasons. First, coupons can be queried, exported, and bulk-edited the same way products can, which opens up CSV import for large coupon batches. Second, because each coupon is its own post, WooCommerce logs a full usage count and a list of order IDs that redeemed it, which is the data you will lean on later when deciding whether a promotion actually worked.
Four discount types exist out of the box, and each behaves differently in edge cases worth knowing before you pick one.
| Discount Type | Applies To | Best For | Watch Out For |
|---|---|---|---|
| Percentage discount | Whole cart total | General sitewide promotions | Disproportionately large discount on high-ticket items unless capped |
| Fixed cart discount | Whole cart total, flat amount | Predictable, budget-capped promotions | Can exceed cart value on small orders; set a minimum spend |
| Fixed product discount | Specific products or categories, flat amount per item | Clearing specific SKUs without discounting the full cart | Only reduces price on qualifying items, not the full order |
| Free shipping | Shipping cost only, combinable with others | Raising average order value via a spend threshold | Requires “Allow free shipping” enabled on the relevant shipping method too |
There is no native buy-one-get-one or tiered quantity discount type; those require an extension like WooCommerce Smart Coupons or a rules-based pricing plugin.
Step 1: Confirm Coupons Are Enabled
This is on by default in current WooCommerce versions, but it is worth checking if you inherited a store or migrated from an older install. Go to WooCommerce > Settings > General, scroll to the bottom, and confirm “Enable the use of coupon codes” is checked. If it is unchecked, no coupon field appears at checkout regardless of how many coupons you create, and customers get no error message explaining why, they just see no field at all. This single setting is responsible for more “my coupons don’t work” support tickets than any bug.
Step 2: Create the Coupon
Navigate to Marketing > Coupons (older versions show this under WooCommerce > Coupons) and click Add Coupon. The coupon code field at the top is what customers type; keep it short, memorable, and free of characters that are easy to mistype on a phone keyboard. SAVE10 beats Summer-Sale-2026-VIP for actual redemption rates, even though the longer code feels more official.
General Tab
Set the discount type, amount, and whether free shipping is included. If you set an expiry date here, WooCommerce automatically deactivates the coupon at midnight on that date in your site’s configured timezone, no cron job or manual cleanup needed.
Usage Restriction Tab
This is the tab most stores under-use. Minimum and maximum spend limits control whether a coupon applies at all based on cart total, useful for pushing average order value up (a $15 code that only triggers above $75 cart value nudges people toward adding one more item). “Individual use only” prevents stacking with other active coupons, which matters if you run more than one promotion at a time and do not want a customer combining a 20% code with a free-shipping code for an effectively bigger discount than intended. “Exclude sale items” stops a coupon from applying on top of products already discounted, protecting margin on clearance stock. You can also restrict a coupon to specific products, product categories, or email addresses, the last of which is how single-use, customer-specific codes get built without a plugin.
Usage Limits Tab
“Usage limit per coupon” caps the total number of redemptions across all customers, which is the setting that turns an influencer discount code into a controlled-cost campaign rather than an open-ended liability. “Usage limit per user” caps how many times a single account, or a single email address for guest checkouts, can use the code. Without this second limit, a customer who notices a coupon has no per-user restriction can place multiple orders back to back and redeem it every time.
Publish the coupon once these three tabs are configured, and it becomes immediately usable at checkout.
Step 3: Test Before You Promote It
Testing catches the two most common coupon failures: a typo in the code itself, and a restriction that is stricter than intended. Add a qualifying product to the cart, go to checkout, and enter the code exactly as a customer would, do not copy-paste it from the admin screen, since that skips the step where a customer might add a trailing space or wrong capitalization. WooCommerce coupon codes are not case-sensitive by default, but confirm this behavior on your specific setup if you have a plugin that touches checkout validation.
Check three scenarios specifically: a cart that meets the minimum spend, a cart that falls just under it (the coupon field should reject with a clear message, not fail silently), and, if you set an exclusion for sale items, a cart containing only sale-priced products (the discount should not apply). If any of these behave unexpectedly, the fix is almost always in the Usage Restriction tab rather than a bug.
Coupon Strategy Beyond the Basic Percentage Code
A flat 10% off everything code is the easiest coupon to build and, for many stores, the least profitable one to run repeatedly. A few structures that get more mileage out of the same discount budget:
Threshold-based free shipping. Instead of a percentage discount, create a coupon that only unlocks free shipping above a spend threshold, then advertise the threshold rather than a code (“Free shipping over $75” as a site-wide banner, with the coupon auto-applying via a cart rule or a related shipping-zone setting rather than requiring manual entry). This raises average order value without touching product margin directly.
Category-restricted clearance codes. Restricting a steep discount to a specific product category lets you move slow inventory aggressively without discounting your full-margin bestsellers at the same rate.
Single-use welcome codes tied to email signup. Generating a unique code per subscriber (via an email marketing integration or a plugin like Advanced Coupons) converts better than a public code because it feels earned rather than generic, and the per-user usage limit prevents one person from reusing it across multiple accounts. If you already run WooCommerce email through MailPoet or a similar platform, trigger the code send on the subscription confirmation event rather than immediately on signup; codes delivered after a confirmed opt-in tend to see meaningfully higher redemption than codes sent to an unconfirmed address.
First-order-only restriction. WooCommerce does not have a native “first order only” toggle, but combining an email restriction with usage limit per user achieves the same effect for anyone checking out with an account. For guest checkouts, this is harder to enforce reliably since a new guest email can be created freely; if first-order-only enforcement matters for your margins, an extension that checks order history by billing email is worth the cost.
Coupon Abuse and How to Prevent It
Public coupon codes get scraped and posted to deal-aggregator sites within days of launch, sometimes hours if the discount is generous. That is not necessarily a problem, more redemptions can mean more revenue, but it becomes one when the usage limit per coupon is left unset and a code intended for a small email list ends up on a site with millions of visitors. Set a total usage cap on every promotional code before it goes live, even ones you think will only reach a small audience. A cap set too high does no harm; a missing cap on a code that goes viral for the wrong reasons can turn a marketing expense into a five-figure mistake by the time anyone notices.
The second common abuse pattern is code guessing: automated bots submitting sequential or dictionary-based strings at the coupon field hoping to find an active code, particularly around known sale periods. This rarely succeeds against a well-chosen code, but if your store has been targeted by checkout bots for other reasons (see our guide on stopping WooCommerce registration spam for the broader bot-mitigation picture), the same CAPTCHA and rate-limiting measures that protect registration and login forms reduce coupon-guessing attempts too, since they all hit the same checkout endpoint.
Common Mistakes
The failures below account for most coupon-related support requests and most of the accidental discount overspend stores report after a promotion.
No expiry date on a limited-time promotion. A code created for a weekend sale and never given an expiry date keeps working indefinitely. Customers find old codes through coupon aggregator sites months later and use them at full validity, quietly eating into margin on orders that were never supposed to be discounted.
Forgetting the usage limit per coupon on influencer or affiliate codes. A code shared with a single creator’s audience without a total redemption cap can generate far more discounted orders than the campaign budget anticipated if the content performs better than expected.
Stacking coupons unintentionally. If “Individual use only” is left unchecked on every active coupon, customers who find two valid codes can apply both in the same cart. This is rarely caught until someone notices an order total that does not match expectations.
Applying a fixed-amount discount to a low-priced cart. A $20 fixed discount code on a $15 order either produces a negative total (which WooCommerce blocks, floors it at zero) or an effectively free order plus shipping cost absorbed by the store. Set a minimum spend that exceeds the discount amount to prevent this.
Testing Coupons Under Load
Most stores never think about coupon performance until a high-traffic sale event, at which point a poorly indexed coupons table or a plugin doing extra database lookups per coupon validation can slow checkout at exactly the moment traffic is highest. If you are planning a major sale with a heavily promoted code, load test checkout with the coupon applied ahead of time rather than discovering the bottleneck during the event itself. Object caching (Redis or Memcached) helps here since coupon lookups happen on every cart update, not just once per session.
Reading Coupon Performance After a Campaign
Marketing > Coupons shows a usage count column for every code, and clicking into an individual coupon lists the orders that redeemed it. That list is more useful than the raw count. Pull the total revenue from those orders and compare it against what the same customers would likely have spent without the discount, a rough gut-check rather than a precise model, but enough to flag a coupon that drove volume at a loss versus one that pulled in new customers worth the discount.
WooCommerce Analytics (Analytics > Coupons if the module is active) aggregates this further, showing net sales and discount amount per coupon over a date range. For stores running several promotions a month, checking this report before repeating a code is a five-minute habit that prevents running an underperforming promotion on autopilot simply because nobody looked at last month’s numbers.
Promoting Coupons Without Training Customers to Wait for Discounts
Discount codes are effective until customers learn your rhythm and stop buying at full price because they know a sale is coming. A few practices reduce that risk: vary the discount amount and structure between promotions rather than running the identical 15% code every month, restrict some promotions to email subscribers only so the general public does not see a pattern, and reserve your deepest discounts for genuine clearance or seasonal inventory turnover rather than routine traffic generation.
Frequently Asked Questions
Can I create a coupon that only works for one specific customer?
Yes. Under Usage Restriction, add the customer’s email address to the “Allowed emails” field. Only checkouts using that email, whether logged in or as a guest, can redeem the code. This is how personalized win-back or loyalty codes get built without additional plugins.
Why does my coupon field not appear at checkout?
Check WooCommerce > Settings > General for the “Enable the use of coupon codes” setting first, since that is the most common cause. If it is enabled and the field still does not show, check whether your checkout page uses the block-based Checkout block or the classic shortcode; some older coupon-related plugins only support one or the other.
Can I set a coupon to only apply to specific products, not the whole cart?
Yes. Under Usage Restriction, use the “Products” and “Exclude products” fields, or restrict by category instead if the discount should apply to a whole product line. A fixed-amount discount type applied this way discounts each qualifying product individually rather than the cart total.
Do coupons work with subscription products?
Native WooCommerce coupons apply to the initial order for a subscription product, but recurring discounts on future renewal payments require WooCommerce Subscriptions’ own coupon types (percentage or fixed discount for renewal), which are separate from the standard coupon discount types described here.
How do I bulk-create a batch of unique single-use codes?
Core WooCommerce does not support generating hundreds of unique codes at once. Smart Coupons or Advanced Coupons both add bulk generation, letting you export a batch of unique codes as CSV for distribution through email or a print campaign, each valid for one use.
Does a coupon affect how tax is calculated?
Depends on your tax settings and jurisdiction. Under WooCommerce > Settings > Tax, the “Calculate tax based on” setting interacts with whether coupons apply before or after tax calculation. In most US states, sales tax is calculated on the post-discount total, but confirm this matches your local tax requirements since rules vary by jurisdiction and your tax plugin’s configuration.
Can a coupon be scheduled to activate in the future rather than immediately?
Not natively. Publishing a coupon makes it active right away; there is no built-in start date field, only an expiry date. To hold a code back until a launch date, keep it as a draft and publish it manually when the promotion begins, or use a scheduling plugin that supports custom post types including shop_coupon.
Making Coupons Earn Their Keep
The setup itself takes minutes. What separates a coupon program that grows revenue from one that quietly erodes margin is the restriction tab, the expiry date, and the discipline to review usage reports before deciding to repeat a promotion. Check the coupon’s usage count and associated order value in Marketing > Coupons after each campaign; a code with high redemptions but low average order value is telling you something worth listening to before you run it again.