WooCommerce gives you a handful of coupon restrictions: a minimum spend, a product list, an expiry date. Real promotions usually need more than that.
Better Coupon Restrictions adds over 25 new conditions to every WooCommerce coupon, so a discount applies only when you actually want it to. Stop a welcome offer going to existing customers. Keep a weekend code working only at weekends. Require two items from a category instead of one. Cut off the discount code that leaked onto a deals forum.
Everything is set per coupon, in a new
Better Coupon Restrictions tab on the normal WooCommerce coupon screen. There is nothing new to learn and no code to write.
Why store owners use it
- Protect your margins. Stop coupon stacking, block codes that have leaked, and limit how often one person can reuse an offer.
- Target the right shoppers. Restrict an offer to new customers, returning customers, wholesale roles, one country, or one email domain.
- Run smarter promotions. Happy hour discounts, weekend-only codes, seasonal offers, and "buy 2 from this category" deals.
- Understand what is happening. See which coupons your rules turn away, and why, so you can fix a rule that is too strict.
Free features
- Improved Product Restrictions - replaces the default product restriction, adding a minimum and maximum quantity for each product or variation.
- Improved Category Restrictions - the same for product categories, with the option to add up quantities across the whole cart rather than per cart line.
- Product Attribute Restrictions - allow or exclude products by attribute, such as a size or a colour.
- Cart Restrictions - require a minimum cart quantity, subtotal, or total weight.
- Date Restrictions - a start and end date, specific calendar months, or specific weekdays.
- Time of Day Restrictions - allow a coupon only between two times, including windows that run past midnight.
- Customer Status Restrictions - new customers only, logged in only, or guests only.
- User Role Restrictions - allow or block specific user roles, such as wholesale customers.
- Payment & Shipping Method Restrictions - allow or block specific payment gateways and shipping methods.
- Custom Error Messages - replace the message a shopper sees for any restriction, in your own words.
PRO features
Upgrade to PRO to unlock customer history, location, and anti-abuse rules:
- Customer Address Restrictions - restrict by billing or shipping country, state, city, or postcode, and limit uses per address.
- Customer Order History Restrictions - require a minimum total spent or a minimum number of past orders.
- Purchase History Restrictions - require that a customer has, or has not, bought specific products before. Ideal for reorder offers and win-back campaigns.
- Usage Limit Per Period - allow a coupon a set number of times per customer per day, per month, or per rolling period, instead of only once for life.
- Time Since Last Order - target customers who ordered recently, or who have not ordered in a while.
- Time Registered - reward brand new accounts, or only long standing ones.
- Customer Email Domain Restrictions - allow or block whole email domains, for corporate and partner perks.
- Referring Domain Restrictions - only honour a code when the shopper arrived from an approved site.
- IP Address Restrictions - allow or block IP addresses, and cap uses per IP.
- Coupon Links - share a link that applies the coupon automatically, and optionally make the code valid only through that link.
- Meta Data & Cookie Restrictions - match your own user meta, cart item meta, or cookies for fully custom rules.
- Global Restrictions - apply rules such as "new customers only" or "no coupon stacking" to every coupon at once, with a per coupon opt out.
- Rejection Analytics - a report showing which coupons are rejected most and which rule is responsible.
Learn more about Better Coupon Restrictions PRO
Works with your store
Compatible with WooCommerce High Performance Order Storage (HPOS), block and shortcode carts, and the classic checkout. Translation ready.
Version 2.0.0 - 12th September 2026
- New: Shop managers see which restriction rejected a coupon, inline in the cart notice. Customers never see this line.
- New: (PRO) Rejection analytics, off by default and enabled with the "Rejection Analytics" setting in WooCommerce > Settings > Better Coupon Restrictions. While it is off nothing is recorded.
- New: (PRO) WooCommerce > Coupon Rejections analytics page: most rejected coupons, top reasons, and a log, filterable by period and coupon. The coupons list gains a "Rejections (30d)" column, and each coupon gets a "Recent Coupon Rejections" box.
- New: Custom error message per restriction section. Use {value} to insert the required amount.
- New: (PRO) "Ignore Global Restrictions" checkbox per coupon.
- New: Time of day restriction.
- New: Allowed and disallowed payment methods and shipping methods.
- New: Option to sum category quantities across all cart items instead of per cart line.
- New: (PRO) Allowed and disallowed customer email domains.
- New: (PRO) Usage limit per customer within a period (hours, days, or the calendar month).
- New: (PRO) Purchase history restrictions: must have, or must not have, purchased specific products.
- New: (PRO) Coupon links: ?coupon=CODE applies the coupon automatically, with an optional "only valid via link" restriction.
- New: (PRO) Rejection analytics answers WordPress personal data export and erasure requests, so a customer's recorded rejections are included in their export and removed when their data is erased.
- Tweak: The rejection analytics page runs a fixed number of queries regardless of how many coupons have been rejected.
- Tweak: The variations AJAX action and nonce are now prefixed, avoiding collisions with other plugins.
- Tweak: Category pickers now use WooCommerce's AJAX search instead of loading every category into the page, matching the product pickers. This makes the coupon screen much lighter on stores with many categories.
- Tweak: (PRO) The referring domain cookie is only set when a coupon or the global settings actually use a referring domain restriction. Stores that do not use them now set no cookie, which also keeps pages cacheable.
- Tweak: (PRO) The usage limit per period, maximum usage per address, maximum usage per IP and minimum order count checks now load only as many orders as they need, instead of every matching order.
- Tweak: Coupon error messages are shown once, without the extra "Coupon is not valid." notice.
- Tweak: Product pickers now use WooCommerce's AJAX search instead of loading every product into the page.
- Tweak: Order history checks use WooCommerce's customer totals instead of loading every order.
- Tweak: Admin scripts and styles are only loaded on the coupon edit screen.
- Tweak: Added translation loading, a languages folder, and clean-up on uninstall.
- Fix: Coupons no longer wrongly reject a customer retrying after a failed payment. Cancelled and failed orders are no longer counted by the "new customer", usage limit, per address and per IP rules, matching how WooCommerce itself releases coupon usage.
- Fix: "Maximum Usage Per Address" could count every order in the same postcode when only a postcode was known, blocking unrelated customers. It now requires a full address.
- Fix: Country, state and postcode rules no longer reject a coupon on the cart page before the customer has entered an address.
- Fix: Payment method rules are now only applied at checkout. Previously a gateway remembered from a past order could reject a coupon on the cart page.
- Fix: A coupon link whose coupon was not yet valid (below a minimum spend, say) is now retried as the cart changes instead of being discarded.
- Fix: Email domain entries written as "*.company.com" now match instead of silently matching nothing.
- Fix: Locking a field via the global restriction settings no longer wipes that coupon's own saved value when the coupon is next saved.
- Fix: A custom error message consisting only of a number is no longer replaced by a generic notice.
- Fix: Blank minimum and maximum quantity boxes stay blank instead of reloading as 0.
- Fix: The rejection log table version is only recorded once the table really exists, so creation is retried if the database refused it.
- Fix: Failed admin AJAX requests are no longer reported as success ("log cleared", "no variations").
- Fix: Uninstall now removes data from every site on a multisite network.
- Fix: (PRO) The "Custom User Meta" restriction can no longer be pointed at private account data such as user roles, capabilities or session tokens.
- Fix: (PRO) The custom user meta and cart item meta restrictions no longer cause a PHP warning when the stored value is a list rather than a single value.
- Fix: (PRO) Rejection analytics no longer attempts to create its database table during a customer's checkout.
- Fix: The "New Customer Only" checkbox did not show as checked after saving.
- Fix: Allowed / disallowed referring domain and IP address lists were cleared every time a coupon was saved.
- Fix: The variation dropdown in the product restrictions table did not load variations.
- Fix: "Maximum Hours Since Last Order" did not display its saved value.
- Fix: Enabling the global "Exclude Sale Items" setting caused a fatal error when applying a coupon.
- Fix: Guests were treated as returning customers before entering an email address.
- Fix: Referring domain restrictions now use the site the visitor arrived from, not the checkout page itself.
- Fix: "Maximum Hours Since Customer Registered" now blocks the coupon instead of only showing a message.
- Fix: State and postcode restrictions now match whole values (postcodes support a trailing * wildcard).
- Fix: Attribute restrictions did not match taxonomy attributes.
- Fix: Excluded categories are now stored the way WooCommerce expects.
- Fix: Date ranges are evaluated in the store timezone and the end date is inclusive.
- Other: Restriction rows are de-duplicated without using PHP serialisation.
- Other: Removed a leftover debug call.
Version 1.0.4 - 5th November 2024
- Tweak: Fixed an issue with the "new customers only" option.
- Other: Initial FREE release of the plugin.
Version 1.0.3 - 4th November 2024
- Tweak: (PRO) Fixed an issue with the global settings.
Version 1.0.2 - 2nd November 2024
- Tweak: Made a few small tweaks to the plugin.
- Other: Updated to Freemius SDK 2.9.0.
Version 1.0.1 - 12th October 2024
- Tweak: Made a few small tweaks to the plugin.
Version 1.0.0 - 4th October 2024
- Initial PRO release of the plugin.