NewShop managers see which restriction rejected a coupon, inline in the cart notice. Customers never see this line.
NewPRORejection analytics, off by default and enabled with the “Rejection Analytics” setting in WooCommerce > Settings > Better Coupon Restrictions. While it is off nothing is recorded.
NewPROWooCommerce > 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.
NewCustom error message per restriction section. Use {value} to insert the required amount.
NewPRO
NewTime of day restriction.
NewAllowed and disallowed payment methods and shipping methods.
NewOption to sum category quantities across all cart items instead of per cart line.
NewPROAllowed and disallowed customer email domains.
NewPROUsage limit per customer within a period (hours, days, or the calendar month).
NewPROPurchase history restrictions: must have, or must not have, purchased specific products.
NewPROCoupon links: ?coupon=CODE applies the coupon automatically, with an optional “only valid via link” restriction.
NewPRORejection 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.
TweakThe rejection analytics page runs a fixed number of queries regardless of how many coupons have been rejected.
TweakThe variations AJAX action and nonce are now prefixed, avoiding collisions with other plugins.
TweakCategory 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.
TweakPROThe 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.
TweakPROThe 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.
TweakCoupon error messages are shown once, without the extra “Coupon is not valid.” notice.
TweakPRODuct pickers now use WooCommerce’s AJAX search instead of loading every product into the page.
TweakOrder history checks use WooCommerce’s customer totals instead of loading every order.
TweakAdmin scripts and styles are only loaded on the coupon edit screen.
TweakAdded translation loading, a languages folder, and clean-up on uninstall.
FixCoupons 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.
FixCountry, state and postcode rules no longer reject a coupon on the cart page before the customer has entered an address.
FixPayment method rules are now only applied at checkout. Previously a gateway remembered from a past order could reject a coupon on the cart page.
FixA coupon link whose coupon was not yet valid (below a minimum spend, say) is now retried as the cart changes instead of being discarded.
FixEmail domain entries written as “*.company.com” now match instead of silently matching nothing.
FixLocking a field via the global restriction settings no longer wipes that coupon’s own saved value when the coupon is next saved.
FixA custom error message consisting only of a number is no longer replaced by a generic notice.
FixBlank minimum and maximum quantity boxes stay blank instead of reloading as 0.
FixThe rejection log table version is only recorded once the table really exists, so creation is retried if the database refused it.
FixFailed admin AJAX requests are no longer reported as success (“log cleared”, “no variations”).
FixUninstall now removes data from every site on a multisite network.
FixPROThe “Custom User Meta” restriction can no longer be pointed at private account data such as user roles, capabilities or session tokens.
FixPROThe 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.
FixPRORejection analytics no longer attempts to create its database table during a customer’s checkout.
FixThe “New Customer Only” checkbox did not show as checked after saving.
FixAllowed / disallowed referring domain and IP address lists were cleared every time a coupon was saved.
FixThe variation dropdown in the product restrictions table did not load variations.
Fix“Maximum Hours Since Last Order” did not display its saved value.
FixEnabling the global “Exclude Sale Items” setting caused a fatal error when applying a coupon.
FixGuests were treated as returning customers before entering an email address.
FixReferring 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.
FixState and postcode restrictions now match whole values (postcodes support a trailing * wildcard).
FixAttribute restrictions did not match taxonomy attributes.
FixExcluded categories are now stored the way WooCommerce expects.
FixDate ranges are evaluated in the store timezone and the end date is inclusive.
Other: Restriction rows are de-duplicated without using PHP serialisation.