How to Create WooCommerce Coupon Codes: Discounts, Rules, and Testing (2026)

A coupon that looks harmless in the dashboard can become expensive at checkout. Ten percent off a pizza is one thing; ten percent off every eligible item in a large catering order is another. The difference comes down to the rules you set—and the baskets you test before publishing the code. WooCommerce includes the essentials...

September 8, 2026 WPSlash

A coupon that looks harmless in the dashboard can become expensive at checkout. Ten percent off a pizza is one thing; ten percent off every eligible item in a large catering order is another. The difference comes down to the rules you set—and the baskets you test before publishing the code.

WooCommerce includes the essentials for creating coupon codes without an extra discount plugin. Here’s how to use those controls for a restaurant promotion, where the built-in options stop, and how to check that your offer behaves as intended.

How WooCommerce coupons work—and which discount to choose

A standard WooCommerce coupon applies a discount when a valid code is entered through the cart or checkout flow. WooCommerce checks the coupon’s restrictions, calculates the eligible discount, and records usage as qualifying orders move through the order process.

There are three built-in discount types. Pick the one that matches the promise you’re making to customers—not simply the one that sounds most generous.

Percentage discount

A percentage coupon reduces eligible product prices by a chosen percentage. For example, a 10% dinner promotion takes $4 off $40 of eligible food before considering the store’s tax treatment.

This works well across products with different prices. But the discount grows with the eligible basket, and core WooCommerce doesn’t provide a separate “maximum discount amount” field for percentage coupons. A maximum spending restriction is different: it makes an oversized basket ineligible rather than capping the saving.

Fixed-cart discount

A fixed-cart coupon provides a set discount against the cart’s eligible merchandise, such as $5 off an order. It’s useful when you want a predictable headline offer rather than a saving that keeps increasing with order value.

WooCommerce allocates that discount across applicable items for calculation purposes. It isn’t a general-purpose credit against shipping, tips, or every charge appearing in the order total.

Fixed-product discount

A fixed-product coupon takes a set amount off each eligible item. A $2 discount on selected pizzas could save $6 when three qualifying pizzas are purchased, unless you limit the number of discounted items.

Built-in coupons aren’t a full promotion engine. Automatic discounts, genuine first-order-only offers, and buy-one-get-one deals generally need an extension or custom development. Don’t advertise those conditions until your checkout actually enforces them.

Create your first WooCommerce coupon step by step

Let’s build DINNER10: 10% off selected food categories, excluding sale items, with one redemption per customer identity recognized by WooCommerce. Delivery charges and tips aren’t part of the advertised saving.

For a restaurant running FoodMaster’s WooCommerce restaurant ordering system, start with these native WooCommerce coupon settings. FoodMaster provides delivery, pickup, and dine-in ordering alongside POS, kitchen display, QR table ordering, and automatic printing. Coupon behavior across your configured ordering flows still needs testing.

1. Enable coupon codes

In WordPress, open WooCommerce → Settings → General. Find the coupon setting, enable the use of coupon codes, and save your changes.

This enables coupon functionality; it doesn’t guarantee that every custom checkout design displays an obvious coupon field. We’ll check the customer-facing interface later.

2. Open the coupon editor

Go to Marketing → Coupons and select Add coupon. Enter DINNER10 in the coupon-code field, or use the code generator if you want something less memorable.

A short, readable code is usually better for a printed flyer or a phone conversation. Add an internal description such as “Dinner food promotion; excludes sale items; one use per customer.” That description helps staff understand the offer, but it doesn’t create any restrictions by itself.

3. Choose the discount type and amount

Under Coupon data → General, choose Percentage discount and enter 10 in the amount field. Enter the number only, without a percentage symbol.

For a fixed discount, the same field represents an amount in the store’s currency. That’s an easy mistake to make: selecting Fixed cart discount and entering 10 creates a currency discount, not 10% off.

4. Set an optional expiry

Choose a coupon expiry date if this is a limited promotion. Treat that date as a technical setting to verify, not a substitute for clear customer-facing terms.

Check the WordPress site timezone and test the expiry boundary before promising “valid through Sunday night.” If you need precise start and end times, confirm that your chosen scheduling solution supports them; the basic coupon editor isn’t a full campaign scheduler.

5. Add restrictions, then publish

In Usage restriction, select the food categories eligible for DINNER10 and exclude sale items. In Usage limits, set the per-user limit to 1. The next sections explain the other controls worth considering.

Publish the coupon when its configuration is ready, then test it before distributing the code. On a live store, a published, otherwise-valid code may already be redeemable.

Leave Allow free shipping unchecked for this example. Checking it on another coupon merely allows that coupon to qualify for an appropriately configured free-shipping method. You must also configure Free shipping in the relevant WooCommerce shipping zone with a coupon-compatible requirement; the checkbox alone won’t create or configure that method.

[IMAGE: WooCommerce coupon editor showing DINNER10 with Percentage discount selected, amount 10, and the General, Usage restriction, and Usage limits tabs]

Set spending requirements, product exclusions, and customer restrictions

The discount amount gets the attention. Restrictions do the margin protection. Write the intended offer in plain English first, then map each condition to a setting.

Minimum and maximum spend

Minimum spend requires the basket to meet a qualifying value; maximum spend sets an upper eligibility boundary. For example, a $30 minimum can prevent DINNER10 from being redeemed against a single inexpensive side.

WooCommerce’s documented spending checks use the cart subtotal plus tax, rather than the final payable total after shipping and every other charge. A merchandise subtotal of $28 with $2.80 in tax may therefore meet a $30 minimum. Verify that behavior with your tax configuration and customer location.

Don’t assume a minimum spend applies only to the products receiving the discount. These are cart-level spending restrictions. Requiring “$30 of pizza specifically” generally needs additional rule logic, not just a minimum spend plus a Pizza category selection.

Included and excluded products or categories

Use Products or Product categories to select the items that qualify. For a pizza-only percentage offer, select your Pizza category and leave burgers, drinks, and desserts outside its scope.

If a customer orders a $20 eligible pizza and an $8 excluded dessert, a 10% coupon should produce a $2 merchandise discount before tax effects. That’s a useful baseline test because it makes an overly broad category selection obvious.

Excluded products and Excluded categories let you carve out exceptions, such as a low-margin party bundle within the Pizza category. Check actual product assignments: a product can belong to multiple categories, and careless categorization creates surprising results.

Sale items and stacking

Exclude sale items prevents coupon discounts on products WooCommerce recognizes as on sale. A bundle that looks like a bargain but has only a regular price isn’t automatically a sale item.

Enable Individual use only if the coupon shouldn’t combine with other coupon codes. That doesn’t necessarily block every automatic price adjustment introduced by another plugin. Coupon stacking and dynamic pricing are separate things.

Allowed billing emails

Allowed emails restricts redemption to specified billing email addresses. This is helpful for a private customer-service offer, such as compensation for a delayed order.

It doesn’t establish first-order eligibility. Nor does a one-use limit mean “new customers only”: a regular customer who has never used DINNER10 can still qualify. A real welcome offer needs an order-history rule with clearly defined guest handling.

Control coupon usage without promising abuse-proof protection

Usage limits put boundaries around redemption, but they aren’t identity verification. That distinction matters when a code is printed on packaging or shared in a neighborhood group.

Set an overall redemption limit

Usage limit per coupon controls the total number of uses. Setting it to 100 creates a limited-redemption campaign rather than an indefinitely available offer.

That doesn’t necessarily cap the campaign’s financial cost. One hundred redemptions of a percentage coupon can produce very different discount totals depending on basket size. A fixed-cart offer is often easier to budget, although refunds and order-status changes still deserve review when reconciling results.

Limit repeat use and discounted quantities

Usage limit per user restricts how many times a recognized customer can redeem the code. WooCommerce uses customer identifiers, including user IDs for logged-in customers and billing emails for guests, in its usage checks. Test both routes rather than treating them as interchangeable.

For fixed-product coupons, Limit usage to X items can restrict how many eligible units receive the discount. A $2-off-pizza coupon limited to two items offers up to $4 off qualifying pizzas in a redemption, rather than discounting every pizza in a large order.

Test mixed eligible products too, especially where prices differ. Customers should understand whether the offer applies to two units or to the entire basket.

Know what native limits don’t cover

A guest can enter another email address. A recipient can share a public code. Native limits reduce casual repeat redemption, but they don’t prove that two orders came from different people.

Pickup-only coupons, table-specific promotions, and rules involving paid toppings or meal modifiers generally require integration-aware extensions or custom logic. A pickup label in your ordering interface isn’t automatically a native coupon restriction. Confirm the connection before promising “pickup orders only.”

Test the coupon before sharing it with customers

My preferred coupon test is deliberately boring: a small basket with prices you can calculate without a spreadsheet. Once that works, add the messy restaurant details—modifiers, delivery charges, taxes, and mixed eligibility.

Use a staging site that mirrors production, with sandbox payment credentials where supported. Prevent test emails, kitchen tickets, automatic printing, and delivery notifications from reaching real operational systems. A test pizza shouldn’t become a real kitchen task.

Run a deliberate checkout checklist

  • Eligible and excluded products: Test an eligible-only basket, an excluded-only basket, and a mixed basket. Confirm which lines receive discounts.
  • Spending boundaries: Try values just below, exactly at, and just above the minimum and maximum, accounting for tax.
  • Sale items: Combine a genuine WooCommerce sale-priced item with a regularly priced eligible item.
  • Stacking: Apply another coupon before DINNER10, then reverse the order. Check any automatic pricing rules separately.
  • Expiry and limits: Test an expired copy and coupons with exhausted overall or per-user limits. Use separate test codes instead of disrupting campaign records.
  • Shipping and tax: Compare delivery and pickup, applicable shipping zones, and taxable customer locations. Inspect tax totals as well as the discount line.
  • Customer identity: Complete guest and logged-in test orders, then attempt another redemption using the same details.

[IMAGE: Restaurant checkout test comparison with an eligible pizza, excluded dessert, paid topping, delivery charge, tip, and separately labeled coupon and tax totals]

Test your actual checkout and integrations

Check the checkout your customers use: Cart and Checkout blocks, classic shortcode checkout, or a customized restaurant flow. Include mobile and express-payment routes where offered. A coupon that works in a standard test page may not be accessible in your production layout.

Paid add-ons need special attention. Depending on the add-on integration, an extra-cheese charge might become part of the product price, a separate item, or a fee. Those representations can produce different discount behavior.

The same caution applies to delivery charges and third-party tipping plugins. If you use Tipping – Add Order Tip for WooCommerce for preset or custom checkout tips, test the installed configuration rather than assuming a percentage tip uses the discounted subtotal. Verify the tip after applying and removing the coupon.

Complete payment, then inspect the saved order, confirmation email, and kitchen-facing output. A correct-looking cart is only half the test; the stored order and operational handoff must agree.

Fix common coupon problems and measure the promotion

Most coupon problems are configuration problems before they’re code problems. Start with the failing basket and the exact error message, then compare them with the coupon’s settings.

The coupon field is missing

First confirm that coupons are enabled in WooCommerce settings. Then inspect the cart or checkout editor and any checkout customization settings: the coupon interface may be hidden, removed, collapsed, or displayed at another step.

Compare desktop and mobile views. A small “Add a coupon” control can be technically present yet practically invisible. Also verify that an express checkout route gives customers a chance to apply the code before committing to payment.

The code is rejected

Check the code, publication status, expiry date, allowed emails, eligible products, spending requirements, and usage limits. Remove any existing coupon when testing an individual-use offer.

Inspect earlier test orders if a usage limit appears exhausted. Usage accounting is affected by order handling, so don’t assume abandoning or removing a test order has restored availability. Check the current coupon usage and relevant order statuses.

The discount total looks wrong

Recalculate the eligible merchandise first. Common causes include confusing fixed-product and fixed-cart discounts, excluding sale items unintentionally, or expecting a coupon to reduce shipping and fees.

Next inspect quantities, product-category assignments, add-on pricing, tax-inclusive versus tax-exclusive display, and rounding. The final amount saved can include a tax reduction, so it may not match a quick percentage calculation against the displayed order total.

Only then investigate conflicts. On staging, reproduce the issue with a standard checkout and temporarily disable nonessential customizations one at a time. Keep the live restaurant checkout operational while you troubleshoot.

Measure redemption, not just enthusiasm

Where available and enabled, WooCommerce → Analytics → Coupons provides coupon reporting, including redemption-related order counts and discount amounts. Check the reporting date range, included order statuses, and data freshness before comparing it with operational records.

Coupon-attributed orders aren’t proof of incremental sales. Some customers would have ordered anyway, and a larger basket doesn’t automatically mean a more profitable one.

For example, if 40 orders each receive a $3 discount, the discounts total $120. That alone says nothing about ingredient costs, packaging, payment fees, delivery costs, or how many orders the promotion genuinely added.

Compare the campaign with similar trading periods and review contribution margin after discounts. Keep the next offer simple: a clear promise, enforceable rules, and a tested checkout. That’s a coupon you can share without wondering what it will do during the dinner rush.

Commission-free ordering

Run restaurant orders on your own WordPress site

FoodMaster adds delivery, pickup, dine-in, POS, and kitchen tools — with zero per-order fees.

Get FoodMaster

Leave a Comment

Your email address will not be published. Required fields are marked *

×

🔥 ONE DAY ONLY OFFER 🔥

Upgrade FoodMaster Today

Normally your license is limited to 1 Website.

Today only, get a LIFETIME Unlimited Websites License for just:
$499

✔ Unlimited Client Websites
✔ Unlimited Personal Projects
✔ Future Updates Included
✔ Save Hundreds on Additional Licenses

Offer Ends In: