
WooCommerce discount setups make the customer do the work, i.e., create a code, put it in an email, and hope enough people paste it at checkout to justify the margin you just gave away.
Baymard Institute puts average cart abandonment near 70%, and leaving to hunt for a code is one of the most common routes out of checkout.
WooCommerce ships with two discounting tools: the sale price field on each product, and manual coupon codes under Marketing ⇨ Coupons.
Here, coupons come in three types: percentage discount, fixed cart discount, and fixed product discount.
And each one waits for the customer to type something.
Anything that applies itself (bulk tiers, BOGO, wholesale pricing, scheduled sales, cart-total rewards) needs a discount rules plugin.
This guide covers all 11 offer types a WooCommerce store can run, which ones work natively and which need a plugin, and how to set up both coupon codes and automatic cart rules.
We compare the discount plugins worth a license fee. We also cover a shortcode method and six reasons an offer silently refuses to apply.
Table of Contents
- 1 The 11 WooCommerce Discount Types (And What Each One Is For)
- 2 What WooCommerce Can and Can’t Discount Natively?
- 3 How to Create a WooCommerce Discount Code (Step-by-Step)
- 4 How to Apply Discounts Automatically (No Coupon Code Required)
- 5 Cart-Total and Spend-Threshold Offers
- 6 Quantity and Bulk Pricing Tiers
- 7 Buy One Get One (BOGO) and Free Gift Offers
- 8 Category-Wide and Storewide Sales
- 9 Role-Based and Wholesale Pricing
- 10 Customer-Specific and First Order Discounts
- 11 Scheduled, Seasonal and Flash Sales
- 12 Showing Discounts On the Front End (Where Most Stores Lose Money)
- 13 When Two Discounts Collide: Stacking, Priority and Tax
- 14 WooCommerce Discount Not Applying? 6 Things to Check
- 15 Best WooCommerce Discount Plugins Compared
- 16 Frequently Asked Questions
- 17 Ready to Offer WooCommerce Discount to Boost Sales?
The 11 WooCommerce Discount Types (And What Each One Is For)
Most guides treat “discount” as one thing. In practice, it’s eleven jobs with eleven different setups, and the fastest way to waste a weekend is picking the wrong one.
| # | Type | What it does | Example | Native or plugin |
|---|---|---|---|---|
| 1 | Sale price | Cuts one product’s price | $60 jacket gets reduced to $45 | Native (coupon) |
| 2 | Coupon code | Discount on code entry | WELCOME10 = 10% off | Native (coupon) |
| 3 | Cart-total offer | Discount at a spend threshold | Spend $75, get 10% off | Plugin |
| 4 | Bulk / tiered | Unit price falls with quantity | 5-9 = 10% off, 10+ = 20% | Plugin |
| 5 | BOGO / Buy X Get Y | Free or discounted extra item | Buy 2 tees, third free | Plugin |
| 6 | Free gift | Adds a gift at a threshold | Spend $100, get a tote | Plugin |
| 7 | Category / storewide | Rule across a whole catalogue slice | 25% off all outerwear | Plugin |
| 8 | Role-based | Different price per user role | Wholesale sees 30% off | Plugin |
| 9 | Customer-specific | Price for named accounts | One buyer’s negotiated rate | Partly native |
| 10 | Scheduled | Starts and stops on a date | Black Friday, 00:01 Friday | Plugin |
| 11 | Free shipping threshold | Removes shipping at a spend level | Free over $50 | Native |
Free shipping is native, but only as a shipping zone rule or a coupon checkbox.
Similarly, scheduled sales are half native, as the product sale price field takes a start and end date, while coupons take an expiry date and no start date.
A coupon promotion therefore has to be published by hand at the right hour, which is a fine plan until the right hour is 6 am on Black Friday.
What WooCommerce Can and Can’t Discount Natively?
Sale prices vs coupon codes
The sale price field lives on each product under Product data ⇨ General.
Enter a regular price and a sale price, and WooCommerce shows the old price struck through.
It’s per-product, it’s manual, and there’s no bulk editor for it in core.
Whereas coupons are the other half, and you can find them under Marketing ⇨ Coupons, and they only work when WooCommerce ⇨ Settings ⇨ General ⇨ Enable the use of coupon codes is ticked.
Everything a coupon does is triggered by a customer typing a code.
The three built-in coupon types
- Percentage discount: Takes a percentage off the qualifying cart items.
- Fixed cart discount: A flat amount off the cart total, spread proportionally across items.
- Fixed product discount: A flat amount off each qualifying item, multiplied by quantity. So, 10 units and a $5 fixed product discount is $50 off, which surprises people at least once.
You can also tick "Allow free shipping" on any coupon, and set an expiry date.
Three things WooCommerce can't do natively
- Apply a discount on its own without a code or discount. However, it doesn't support native auto-apply.
- Change price based on quantity, role, or cart contents. Coupons validate against the cart; they don’t rewrite catalog pricing.
- Start a sale on a schedule by specifying a coupon expiry end date. There’s no start date, so a Black Friday coupon is live the moment you publish it.
How to Create a WooCommerce Discount Code (Step-by-Step)
To offer a discount using a coupon code on your WooCommerce store, follow these steps:
Step 1: Create the coupon and set the discount type
Go to Marketing ⇨ Coupons and click on 'Add coupon'.

Enter the code, or click Generate coupon code for a random string, which is what you want for anything single-use.
Add a description for yourself. It’s the only note-to-self field you get, and in six months it’s the difference between confidently deleting a rule and being afraid to.

Set up the following coupon-related data:
- Discount type: Choose from three discount types: percentage discount, fixed cart discount, and fixed product discount.
- Coupon amount: Enter the discount amount. Make sure to calculate the discount amount based on the discount type you choose.
- Allow free shipping: Check this option to allow free shipping along with the discount.
- Coupon expiry date: Set an expiry date for your coupon code.

Step 2: Set usage restrictions
The Usage restriction tab is where most WooCommerce discount codes break.
- Minimum spend: Set the minimum amount to spend to get this discount. This checks the cart subtotal, and whether that subtotal includes tax depends on your tax display setting.
- Maximum spend: Set the maximum spend allowed when availing of the discount code.
- Individual use only: Check this box to set this coupon to individual use only so the coupon cannot be used in conjunction with other coupons.
- Exclude sale items: Check this option to exclude sale items from the WooCommerce discount. This is highly recommended, as sale items already offer a discount.
- Products: Search and add the products to which this coupon will be applied. This applies to the fixed cart discount type.
- Exclude products: Set the products to which the fixed cart discount will not be applied.
- Product categories: Choose the categories eligible for coupon application.
- Exclude categories: Set the categories excluded from the coupon application.
- Allowed emails: List of allowed billing emails to check against when an order is placed. You can separate email addresses with commas.

Step 3: Set usage limits
On Usage limits, set Usage limit per user to 1.
Leave Usage limit per coupon blank for an open campaign, or cap it for a genuine “first 100 orders” offer.
For guests, WooCommerce matches on billing email, so the limit is only as strong as the honesty of the person filling in the field.

Step 4: Test before you publish
Finally, create the WooCommerce discount coupon code and click on Publish.

After publishing the coupon code, place an order and apply the coupon code on the checkout page to test it.
Make sure you add products worth at least the minimum amount you set.
Here is a preview:

For the full comparison of coupon-side tooling, see our guide to the best WooCommerce coupon plugins.
How to Apply Discounts Automatically (No Coupon Code Required)
Coupon redemption depends on a customer finding, remembering, and typing a code, which means every discount you run this way is priced for everyone and collected by a fraction.
There are three real routes to an automatic discount in WooCommerce and they solve different problems.
Route 1: Auto-apply coupon links
You keep a normal coupon, then push customers to a URL that applies it for them.
The customer never sees a coupon field they need to fill in. They click a link in an email and the discount is already on the cart.
It's good for email campaigns, influencer links and single-use recovery offers.
But it still has limits: the product page keeps showing the full price until they reach the cart.
Several plugins add this, including Advanced Coupons and FunnelKit. For the single-use, expiring variant used in abandoned-cart recovery, see our guide to dynamic coupon codes.
Route 2: Cart-condition rules
The rule watches the cart and fires when a condition is met, for example, subtotal over $75, three items from a category, or a specific product present.
It's good for threshold offers, free gifts, free shipping, or “add one more and save”.
The only limitation is that it applies at the cart level, so product pages still show the list price unless the plugin also handles front-end display.
Route 3: Dynamic pricing rules
The following rule applies to the product’s price before it’s displayed, so a wholesale customer opening a product page sees their price struck through against the retail price everywhere in the store.
It's good for bulk tiers, role-based pricing, category sales, or anything a customer needs to see before adding to cart.
The only limitation is that you need a dedicated pricing plugin, and you have to actively manage rule priority.
If you want the shortest possible answer, use rules for evergreen pricing and codes for campaigns.
These rules apply to 100% of qualifying carts. Codes apply to the fraction of customers who type them.
Cart-Total and Spend-Threshold Offers
A threshold offer is the only discount type that reliably increases order value instead of just reducing revenue on orders you were already getting.
For example, “Spend $75 for free shipping” moves a $62 cart up; “20% off everything” moves nothing.
Set the threshold 10-20% above your current average order value. Below that, and you’re discounting orders you were getting anyway.
The mechanic that makes this work is visibility.
A static banner is worth a fraction of a live progress bar that updates as items go in: “You’re $13 away from free shipping.”
FunnelKit Cart does this with milestone rewards in the slide-out cart, tracking the bar toward free shipping, a percentage off, or a free gift.

For the shipping-specific version, see our guide to the free shipping threshold bar.
Quantity and Bulk Pricing Tiers
Bulk tiers are the cheapest way to raise units per order, because the customer funds the discount by buying more.
For example, 1-4 at full price, 5-9 at 10% off, 10+ at 20% off. It’s the default B2B mechanic, and it works just as well in consumables and apparel.
Here are two configuration details to decide:
- How quantities are counted
Per product counts each SKU separately, so four t-shirts and four hoodies never hit a tier of five. Across the filter set counts them together.
Getting this backward is the most common bulk-pricing misconfiguration.
- Whether the tier applies to the whole quantity or the excess
Buy 10 with a 20% tier: does all 10 discount, or only the units above the threshold? Both are legitimate.
Only one matches what your customer expects from your product page copy.
Show the tiers on the product page. A quantity table telling a shopper that four more units saves them 15% converts; a discount they only discover in the cart doesn’t.

For the full build, see our guide to WooCommerce quantity discounts.
Buy One Get One (BOGO) and Free Gift Offers
BOGO moves inventory without touching your headline price, which is why it survives in categories where a percentage discount would train customers to wait.
Here are its variants worth noting:
- Buy X get X: Applies to the same product. Buy 2 tees, third free.
- Buy X get Y: Applies to different products. Buy a laptop, get a sleeve at 50% off.
- Cheapest free: Add any three; the lowest-priced is free. Protects margin better than a flat “third free” on mixed baskets.
- Free gift at a threshold: Spend $100, get a fixed item. Your cost is a known COGS number rather than a percentage of an unknown basket, which is why finance teams prefer it.
Native coupons can’t do any of these. Advanced Coupons handles BOGO on the coupon layer; Flycart, Barn2 and YayPricing handle it on the pricing layer.
For the gift-specific setup, see our guide to the free gift with purchase.
Category-Wide and Storewide Sales
WooCommerce has no storewide sale. You can bulk-edit sale prices through Products ⇨ select all ⇨ Edit, but that overwrites the sale price field on every product, and reversing it means another bulk edit and hoping nothing was already discounted.
A rules plugin handles this as one rule. For example, 25% off Outerwear, excluding three SKUs, live until Sunday.
This way, nothing gets written to the products, so turning it off is a toggle.
However, you need to set these three things every time:
- Exclusions: New-season and low-margin lines come out before the rule goes live, not after someone notices.
- Sale-item handling: Decide whether the storewide rule stacks on top of existing sale prices or skips them. Stacking a 25% storewide on a 40% clearance line is how stores accidentally sell below cost.
- Front-end display: A storewide sale nobody can see on a category page is a storewide sale that doesn’t convert.
Role-Based and Wholesale Pricing
Trade accounts are the one segment where a discount buys volume you can forecast, and role-based pricing is how you serve them without publishing their rate.
Retail customers see $100, the wholesale_customer role sees $70, and the difference is invisible to everyone else.
This is genuinely impossible natively. WooCommerce has one price per product.
The workaround people try, a WHOLESALE30 coupon shared with trade accounts, leaks within a month and gives you no per-account control.
The setup, once you have a rules plugin:
- Create the role (a membership or wholesale plugin usually adds it; Users ⇨ Add New lets you assign it).
- Create a rule scoped to that role: percentage off, fixed price, or a bulk tier that only wholesale sees.
- Decide whether tax display changes for that role. B2B buyers usually expect prices excluding tax, and WooCommerce sets that store-wide rather than per role, so check it before launch.
- Test logged out, logged in as retail, and logged in as wholesale. Three sessions, three prices.
Stacking a wholesale role rule with a bulk tier (trade price and volume breaks) is where priority settings start to matter. Cover that in the collision section below.
Customer-Specific and First Order Discounts
These two are different terms that people conflate:
- Customer-specific pricing
This means one named account gets a price nobody else does.
Natively, you can approximate it with a coupon restricted by allowed emails, which works for a handful of accounts and falls apart past that.
The customer still has to enter a code, and you’re managing a coupon per buyer.
A pricing plugin lets you target individual user accounts directly, no code involved.
- First order discounts
This discount targets anyone who hasn’t bought before. Native WooCommerce has no “first order” condition. You cannot use the usage limit per user because it isn’t the same thing.
A rules plugin can check order count and apply it automatically, or generate a unique code triggered by signup.
The second is the higher-volume play. For the full setup, see our guide to the first order discount.
Scheduled, Seasonal and Flash Sales
Native coupon expiry gives you an end date. It does not give you a start date, so a coupon meant to go live at midnight on Black Friday is live the second you hit publish.
A discount rules plugin adds start and end datetimes, which is what makes these campaigns possible without someone setting an alarm:
- Black Friday and Cyber Monday: Build in October, schedule, walk away.
- Flash sales: A four-hour window with a countdown timer on the product page.
- Day-parting: A Tuesday-only offer on a slow weekday.
- Seasonal clearance: Starts when the new range lands, ends when it doesn’t.
Make sure to check your store timezone under Settings ⇨ General before scheduling anything (WooCommerce uses site time, not the customer’s), and set the end date when you create it.
A sale that outlives its campaign is a permanent price cut you didn’t budget for.
Showing Discounts On the Front End (Where Most Stores Lose Money)
A discount the customer can’t see before checkout does none of the persuading it's supposed to.
You’ve paid for it in margin and left the revenue it was meant to buy on the table.
This is the most-skipped part of a WooCommerce discount setup, and it’s why two stores running identical rules get different results.
What earns its place on the page:
- Strikethrough pricing on shop, category, and product pages. The old price is the reference that makes the new one feel like a saving.
- A quantity pricing table on product pages for anything with bulk tiers. It tells the shopper the exact number of units needed to drop to the next price.
- A sale badge on category listings, so the discount survives the browse step.
- “You saved $X” in the cart. Confirms the decision when doubt peaks.
- A progress message such as “Add $12 and shipping is free”, anywhere a threshold rule exists.
Front-end display is the clearest dividing line between the plugins in the comparison below.

Coupon-layer tools mostly can’t do it, because the price only changes once the cart evaluates. Pricing-layer tools rewrite the price before display, so they can.
When Two Discounts Collide: Stacking, Priority and Tax
Every store gets here eventually. A wholesale role rule, a bulk tier, and a Black Friday storewide sale all match the same product.
Here's what you should do:
- Priority
Rules plugins evaluate in a set order, usually drag-and-drop, sometimes numeric.
Typical options include applying the first matching rule and stopping; applying all matching rules cumulatively; or applying whichever gives the largest (or smallest) discount.
Cumulative is the setting that sells things below cost. Pick it deliberately or not at all.
- Exclusive rules
Most engines let you mark one rule exclusive, meaning when it fires, nothing else does.
That’s the right shape for clearance.
- Coupons on top of rules
Automatic rules and coupon codes are separate systems, so by default a customer can often stack both.
Most pricing plugins have a “don’t apply on top of coupons” toggle. Find it before your first campaign, not after.
- Tax
WooCommerce applies discounts to the pre-tax amount and recalculates tax on the discounted figure, so a 10% discount reduces the tax owed proportionally.
If you enter prices inclusive of tax, the discount comes off the gross price, and the tax portion is recalculated from there.
Either way, the customer pays tax on what they actually spent, but the numbers on your reports differ, so match your setup to what your accountant expects.
- Rounding
With per-item tax rounding, a percentage discount across many low-value lines can drift a cent or two from the figure your spreadsheet predicts.
Go to WooCommerce ⇨ Settings ⇨ Tax and enable the 'Round tax at subtotal level', which fixes it if the difference matters to you.
WooCommerce Discount Not Applying? 6 Things to Check
Here's what you should check if discounts in your store don't apply:
1. Coupons are switched off: Go to WooCommerce ⇨ Settings ⇨ General ⇨ Enable the use of coupon codes. If this is unticked, the field doesn’t render and nothing you do to the coupon matters.
2. “Individual use only” is on another coupon: The customer already has a code applied that refuses company. WooCommerce rejects the second one, usually with a message nobody reads.
3. “Exclude sale items” is doing its job: The customer’s cart is full of products with a sale price, so the coupon skips every one of them and reports a $0 discount. This looks like a bug, but it isn’t.
4. Minimum spend is measured against a different number than you think: Your $60 threshold is checked against the cart subtotal, and the tax display setting changes whether the customer’s $61 basket reads as $58 to the coupon. Test with a cart sitting right on the line.
5. Two rules collide and priority picks the other one: If you have a pricing plugin, open the rule list and check the order. A rule marked exclusive higher up the stack silently suppresses everything below it. Running two discount plugins at once produces the same symptom and is much harder to debug. Run one.
6. Something is caching the cart: Page cache, object cache, or cart-fragment cache serving a stale total is the classic “it works for me, not for customers” bug. Clear all three, exclude cart and checkout from full-page caching, and flush WooCommerce transients under WooCommerce ⇨ Status ⇨ Tools.
Please note that the Cart and Checkout Blocks render differently from the old shortcode templates.
Some discount plugins still hook only the legacy templates, so a rule that fires perfectly in admin does nothing on a Blocks checkout.
Check the plugin’s Blocks compatibility before you blame the rule.
Best WooCommerce Discount Plugins Compared
We installed each plugin on a clean WooCommerce 11.0.1 / WordPress 7.1 staging site running the Twenty Twenty-Five theme with 31 products, HPOS enabled and the Blocks cart and checkout active.
For each tool, we built the same 5 rules (a bulk tier, a role-based rule, a BOGO, a cart-total threshold, and a scheduled category sale), then checked front-end display, priority handling, and cart behavior.
| Plugin | Best for | Free version | Auto-apply | Front-end display | Entry price (1 site) |
|---|---|---|---|---|---|
| Discount Rules for WooCommerce (Flycart) | The widest rule library at the lowest entry cost | Yes | Yes | Pricing table, strikethrough, badge, “you saved” | From $85/yr |
| FunnelKit | Cart-total rewards, checkout offers, triggered coupons | Yes | Yes | Cart progress bar, checkout offer display | Free / from $99.50/yr |
| WooCommerce Discount Manager (Barn2) | Fastest setup and the cleanest conflict handling | No | Yes | Tiered table, strikethrough, product-page message, cart total saved | $79/yr |
| Advanced Coupons (Rymera) | Campaigns that run on codes | Yes | Yes (URL + cart conditions) | Limited, cart-layer only | Free / $99.50/yr |
| YayPricing (YayCommerce) | Non-technical setup plus campaign reporting | Yes | Yes | Pricing table, countdown, offer text | Free / $99/yr |
| ELEX Dynamic Pricing | Many rules that must run in a strict order | Yes | Yes | Basic | Free / from $99/yr |
| Discount Rules & Dynamic Pricing (AsanaPlugins) | The cheapest paid tier | Yes | Yes | Moderate | Free / from €39/yr |
The honest cons
- Flycart Discount Rules: Deepest condition library here, and the free tier covers more than most paid ones. But payment-method and shipping-zone conditions are Pro-only, and past roughly twenty rules you’re managing priority by hand.
- Barn2 Discount Manager: The setup wizard is the best in the group, and it never stacks two discounts on one product, which is a safety feature right up to the day you want stacking. No free version and no public WordPress.org review pool, so you’re buying on the 30-day refund.
- Advanced Coupons: A coupon engine, not a pricing engine: product pages keep showing list price until the cart evaluates. Loyalty and gift cards are separate purchases. First-year pricing renews higher.
- YayPricing: Cleanest interface and the only one here with built-in campaign analytics. Smaller install base and a shorter track record than Flycart, and a few conditions sit behind Pro that rivals give away.
- ELEX: Best-in-group control over rule execution order. Weakest front-end display, and the admin UI expects you to already know what you want.
- AsanaPlugins: Cheapest route to a full rules engine. Smallest ecosystem, so budget testing time against your theme and checkout.
- FunnelKit: It doesn’t rewrite catalog prices with rules, so it won’t do role-based product pricing or category-wide strikethrough. For those, use Flycart, Barn2 or YayPricing. What it does own is the cart and checkout layer: milestone rewards with a live progress bar, quantity discounts and order bumps at checkout, and coupons generated automatically on abandonment, birthdays, and win-backs.
Which tool for which job
- Catalog pricing rules (bulk, role-based, category, scheduled): Flycart, Barn2, or YayPricing.
- Code-driven campaigns (email blasts, influencer codes, store credit): Advanced Coupons.
- Cart and checkout offers (thresholds, progress bars, order bumps, upsells): FunnelKit. For those builds, see our guides to cart upsells and order bumps at checkout.
- Fifty-plus overlapping rules: ELEX, for execution control.
Frequently Asked Questions
Core WooCommerce has no rules engine, so “discount rules” come from plugins.
A rule is a condition plus an action: when the cart matches (quantity, subtotal, category, user role, purchase history, date range, payment method or shipping zone), apply this discount.
Rules run automatically, with no code entry.
Not with core WooCommerce. Native coupons can be limited to an allowed billing email, but the customer still has to enter the code.
Genuinely automatic per-customer pricing needs a plugin with customer-level targeting, or a dedicated user role for that account with a role rule attached.
Yes, unless individual use only is enabled on one of the coupons.
With rules plugins, stacking depends on the priority and exclusivity settings, and most offer an apply-best-only mode.
Set a maximum cap before you allow any stacking.
It depends on your tax settings. With prices entered inclusive of tax, the reduction comes off the tax-inclusive price and tax recalculates on the lower amount.
Minimum spend is evaluated on subtotal plus tax, which catches out a lot of store owners.
Not natively, since WooCommerce has no payment-aware pricing rules.
You need a payment discount plugin or a conditional negative fee applied when a gateway is selected.
Many stores get the same result by adding a surcharge to expensive methods instead.
Discounts are a WooCommerce feature, not a WordPress one, so a site with no store plugin has nothing to discount.
If you sell through a forms plugin, a membership plugin, or a checkout-only tool, the coupon field lives inside that plugin’s own settings.
The platform limitation is that everything past percentage and fixed coupons needs a paid plugin, which adds cost and another compatibility surface.
The commercial limitation is that discounting too often trains customers to wait, and it erodes your reference price.
Both are manageable, but only if you cap, date and measure every offer.
Ready to Offer WooCommerce Discount to Boost Sales?
No single item here transforms a store. A threshold reward will not save a business, and neither will a better coupon restriction.
What moves the needle is running a 5% bump by showing the savings on the product page, another from a threshold that nudges the cart up $20, and another from a rule that stops discounting stock that was already on sale.
If you only change one thing this month, change where the saving happens.
Move it out of the coupon field and into the cart, where the shopper can see it while they are still deciding what to buy.
That is the friction the default setup builds in, and it is the cheapest one to remove.
Our own tooling sits on that side of the problem.
FunnelKit runs the threshold rewards, checkout offers, and behavior-triggered codes, and pairs with a rules plugin when your catalog pricing needs one.

Editorial Team
September 3, 2026The right WooCommerce subscription plugin turns one-time buyers into predictable recurring revenue. On the other hand, a wrong one breaks renewals, loses customers, and costs more than the license fee....

Editorial Team
August 28, 2026WooCommerce order attribution tells you where your orders come from. Out of the box, no extra plugin needed. But the built-in report only tells half the story, crediting whichever click...
Editorial Team
August 27, 2026Have you ever noticed the cart icon at the top of many online stores? It’s more than just a design choice. It can greatly improve your customers' experience. A cart...






