{"id":348064,"date":"2026-08-22T07:20:19","date_gmt":"2026-08-22T07:20:19","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/coupon-audit-and-analytics-for-woocommerce\/"},"modified":"2026-08-22T08:33:31","modified_gmt":"2026-08-22T08:33:31","slug":"coupon-audit-and-analytics-for-woocommerce","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/coupon-audit-and-analytics-for-woocommerce\/","author":10024063,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.4.1","stable_tag":"0.4.1","tested":"7.1","requires":"6.4","requires_php":"8.1","requires_plugins":null,"header_name":"Coupon Audit and Analytics for WooCommerce","header_author":"David Mar\u00edn Carre\u00f1o","header_description":"Audits your coupon inventory \u2014 what is live, what it really applies to, what overlaps \u2014 and measures what each coupon actually earns.","assets_banners_color":"bdccdb","last_updated":"2026-08-22 08:33:31","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/davefx\/coupon-audit-and-analytics-for-woocommerce","header_author_uri":"https:\/\/davefx.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":30,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.4.0":{"tag":"0.4.0","author":"DaveFX","date":"2026-08-22 07:19:42"},"0.4.1":{"tag":"0.4.1","author":"DaveFX","date":"2026-08-22 08:33:31"}},"upgrade_notice":{"0.4.1":"<p>Documentation and listing artwork only. No code changes.<\/p>","0.4.0":"<p>Adds filtering to the coupon audit, by discount type and by expiry.<\/p>","0.3.1":"<p>Compatibility only: tested against WordPress 7.1 and WooCommerce 11.<\/p>","0.3.0":"<p>The margin window is now filterable. Nothing else changes for existing installs.<\/p>","0.2.1":"<p>Fixes the basket column, and a warning about fixed discounts with no minimum\nspend that never appeared.<\/p>","0.2.0":"<p>Adds the coupon terms to the overview, names what each coupon applies to, and\nreports fixed discounts that give away more than they ask for.<\/p>","0.1.0":"<p>First release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3660201,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3660201,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3660201,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3660201,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3660201,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.4.0","0.4.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3660137,"resolution":"1","location":"assets","locale":"","width":3560,"height":1476},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3660137,"resolution":"2","location":"assets","locale":"","width":2960,"height":946},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3660137,"resolution":"3","location":"assets","locale":"","width":3000,"height":1680},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3660137,"resolution":"4","location":"assets","locale":"","width":2960,"height":650}},"screenshots":{"1":"The coupon audit: every coupon, its real status, what it applies to, and what is wrong with it \u2014 expired, exhausted, dormant, dead campaign, no expiry date, and overlapping. Filter by discount type or by whether it expires.","2":"Per-coupon margin. Cost coverage is stated rather than assumed: one coupon's margin is exact, one is an estimate over half its lines, and one has no cost recorded at all and so shows no margin.","3":"Warnings on the coupon edit screen, against the coupon in front of you. They never block a save.","4":"Settings: which cost-of-goods system to read, and whether uninstalling should take the data with it."}},"plugin_section":[],"plugin_tags":[232,591,6744,6882,286],"plugin_category":[36,45],"plugin_contributors":[141515],"plugin_business_model":[],"class_list":["post-348064","plugin","type-plugin","status-publish","hentry","plugin_tags-analytics","plugin_tags-coupons","plugin_tags-discounts","plugin_tags-profit","plugin_tags-woocommerce","plugin_category-analytics","plugin_category-ecommerce","plugin_contributors-davefx","plugin_committers-davefx"],"banners":{"banner":"https:\/\/ps.w.org\/coupon-audit-and-analytics-for-woocommerce\/assets\/banner-772x250.png?rev=3660201","banner_2x":"https:\/\/ps.w.org\/coupon-audit-and-analytics-for-woocommerce\/assets\/banner-1544x500.png?rev=3660201","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/coupon-audit-and-analytics-for-woocommerce\/assets\/icon.svg?rev=3660201","icon":"https:\/\/ps.w.org\/coupon-audit-and-analytics-for-woocommerce\/assets\/icon.svg?rev=3660201","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/coupon-audit-and-analytics-for-woocommerce\/assets\/screenshot-1.png?rev=3660137","caption":"The coupon audit: every coupon, its real status, what it applies to, and what is wrong with it \u2014 expired, exhausted, dormant, dead campaign, no expiry date, and overlapping. Filter by discount type or by whether it expires."},{"src":"https:\/\/ps.w.org\/coupon-audit-and-analytics-for-woocommerce\/assets\/screenshot-2.png?rev=3660137","caption":"Per-coupon margin. Cost coverage is stated rather than assumed: one coupon's margin is exact, one is an estimate over half its lines, and one has no cost recorded at all and so shows no margin."},{"src":"https:\/\/ps.w.org\/coupon-audit-and-analytics-for-woocommerce\/assets\/screenshot-3.png?rev=3660137","caption":"Warnings on the coupon edit screen, against the coupon in front of you. They never block a save."},{"src":"https:\/\/ps.w.org\/coupon-audit-and-analytics-for-woocommerce\/assets\/screenshot-4.png?rev=3660137","caption":"Settings: which cost-of-goods system to read, and whether uninstalling should take the data with it."}],"raw_content":"<!--section=description-->\n<p>Most shops accumulate coupons. A launch code from two years ago, a partner\ndiscount nobody switched off, three variations of the same campaign where only\none was meant to survive. WooCommerce will happily keep honouring all of them,\nand it will not tell you.<\/p>\n\n<p>This plugin reads your coupons and says what is wrong with them.<\/p>\n\n<h4>The audit<\/h4>\n\n<p>Works on day one, in every shop, with no setup and no cost data:<\/p>\n\n<ul>\n<li><strong>Never expires<\/strong> \u2014 live, with nothing scheduled to ever turn it off.<\/li>\n<li><strong>Dormant<\/strong> \u2014 live, but nobody has redeemed it in months.<\/li>\n<li><strong>Dead campaign<\/strong> \u2014 live, while every other code from its campaign has expired.<\/li>\n<li><strong>Applies to everything<\/strong> \u2014 live, with no product or category restriction at all.<\/li>\n<li><strong>Overlaps<\/strong> \u2014 two live coupons that can both apply to the same product.\nNothing in WooCommerce compares one coupon against another, so this is not a\nfinding you can reach any other way.<\/li>\n<\/ul>\n\n<p>Status is worked out when you look, never stored, so a coupon that expired\novernight says so the next morning.<\/p>\n\n<p>Filter the list by discount type, or by whether a coupon expires at all \u2014 a shop\nwith four hundred coupons cannot be read top to bottom, and \"show me everything\nthat never expires\" is the question worth asking first.<\/p>\n\n<h4>The warning where it matters<\/h4>\n\n<p>The same findings appear on the coupon edit screen, against the coupon in front\nof you. They never block a save. You are told, and you decide.<\/p>\n\n<h4>The margin<\/h4>\n\n<p>For each coupon: revenue, what it gave away, the cost of the goods it moved, and\nthe gross margin left over. Over the last 30 days.<\/p>\n\n<p>This half needs cost data, and it is honest about not having it. WooCommerce's\nown cost-of-goods feature is off by default, so the plugin also reads the cost\nplugins shops actually use:<\/p>\n\n<ul>\n<li>WooCommerce's built-in Cost of Goods (10.3 and later)<\/li>\n<li>Cost of Goods for WooCommerce, by WPFactory<\/li>\n<li>WooCommerce Cost of Goods<\/li>\n<li>Booster for WooCommerce<\/li>\n<\/ul>\n\n<p>Figures come from <strong>one<\/strong> of these, never a mixture \u2014 a margin blended from two\nsets of books reconciles with neither. If several are installed you choose which\none to believe.<\/p>\n\n<p>Where cost is only partly known, the margin says so and states how much of it is\nreal. Where no cost is known at all, no margin is shown. A wrong number in a\nfinancial dashboard destroys trust far faster than a missing number builds it.<\/p>\n\n<h4>What it does not do<\/h4>\n\n<p>No tracking. No external requests of any kind. No account. It reads your shop's\nown database and shows you what is in it.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate the plugin.<\/li>\n<li>Go to <strong>WooCommerce \u2192 Coupon Audit<\/strong>. The audit works immediately.<\/li>\n<li>For margins, make sure your shop records product costs \u2014 either through\nWooCommerce's own Cost of Goods feature or one of the supported plugins \u2014\nthen look at <strong>WooCommerce \u2192 Coupon Margin<\/strong>.<\/li>\n<\/ol>\n\n<p>Past orders are read in the background after activation, so margins for older\nperiods fill in over a few minutes rather than all at once.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20a%20cost-of-goods%20plugin%3F\"><h3>Do I need a cost-of-goods plugin?<\/h3><\/dt>\n<dd><p>No. The audit half \u2014 expiry, overlaps, orphans, scope \u2014 needs no cost data at\nall and works the moment you activate.<\/p>\n\n<p>Margins do need cost data, but not necessarily another plugin: WooCommerce has\nincluded its own Cost of Goods feature since 10.3, and it only needs switching\non. If your shop already records cost in one of the third-party plugins listed\nabove, this reads that instead \u2014 whichever one you tell it to believe.<\/p><\/dd>\n<dt id=\"why%20does%20a%20coupon%20show%20no%20margin%3F\"><h3>Why does a coupon show no margin?<\/h3><\/dt>\n<dd><p>Because none of its orders has a cost recorded against it. The plugin will not\nguess, and it will not quietly treat an unknown cost as zero, because that would\nreport your revenue as your profit.<\/p><\/dd>\n<dt id=\"why%20are%20some%20margins%20marked%20as%20an%20estimate%3F\"><h3>Why are some margins marked as an estimate?<\/h3><\/dt>\n<dd><p>Either some order lines have no cost recorded, in which case the covered share\nis stated alongside; or your cost plugin only stores what a product costs today\nrather than what it cost when each order was placed. Both are useful. Neither is\nexact, and the screen says so.<\/p><\/dd>\n<dt id=\"i%20use%20two%20cost%20plugins.%20which%20one%20does%20it%20read%3F\"><h3>I use two cost plugins. Which one does it read?<\/h3><\/dt>\n<dd><p>One of them, chosen by you under <strong>WooCommerce \u2192 Coupon Audit Settings<\/strong>. It\nnever mixes them.<\/p><\/dd>\n<dt id=\"does%20it%20slow%20my%20shop%20down%3F\"><h3>Does it slow my shop down?<\/h3><\/dt>\n<dd><p>It does not run on the storefront at all. Aggregation happens in the background\nthrough Action Scheduler, and the admin screens read precomputed figures.<\/p><\/dd>\n<dt id=\"does%20it%20send%20my%20data%20anywhere%3F\"><h3>Does it send my data anywhere?<\/h3><\/dt>\n<dd><p>No. The plugin makes no external requests.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.4.1<\/h4>\n\n<ul>\n<li>Clearer answer on cost data: WooCommerce has included its own Cost of Goods\nfeature since 10.3, so no separate plugin is needed for margins \u2014 the\nthird-party ones are still read if your shop already uses one.<\/li>\n<li>A banner and an icon for the plugin directory.<\/li>\n<\/ul>\n\n<h4>0.4.0<\/h4>\n\n<ul>\n<li>Filter the audit by discount type, and by whether a coupon expires at all.\nThe summary tiles keep describing the whole store, so the counts do not move\nas you narrow the list.<\/li>\n<\/ul>\n\n<h4>0.3.1<\/h4>\n\n<ul>\n<li>Tested against WordPress 7.1 and WooCommerce 11. No code changes.<\/li>\n<\/ul>\n\n<h4>0.3.0<\/h4>\n\n<ul>\n<li>The margin window is now a documented filter, <code>dfxcaaw_margin_window_days<\/code>,\nrather than a fixed cap. Thirty days remains the default; anything can change\nit, including a snippet in your own theme.<\/li>\n<li>Removed the internal feature-gate layer. Nothing in this plugin is withheld.<\/li>\n<\/ul>\n\n<h4>0.2.1<\/h4>\n\n<ul>\n<li>Fixed the basket column, which read \"0.00 to 0.00\" against every coupon that\nhas no spend limits. It now says \"any\", which is what it means.<\/li>\n<li>Fixed a warning that never appeared: a fixed discount with no minimum spend\nwas not reported, because every coupon looked as though it required a basket\nof at least zero.<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li>The overview now shows what each coupon actually is: the discount, the basket\nit requires, free shipping, individual use, and the usage caps per customer\nand per basket.<\/li>\n<li>\"Applies to\" names the products and categories, prices them, and strikes\nthrough anything a customer cannot currently buy.<\/li>\n<li>New finding: a fixed discount worth more than the minimum spend it demands, or\nmore than something it applies to. WooCommerce applies these without comment.<\/li>\n<li>Support for WooCommerce Extended Coupon Features, including coupons it applies\nautomatically \u2014 which is what makes a high-severity overlap possible at all.<\/li>\n<li>Support for YITH WooCommerce Points and Rewards: its generated reward coupons\nare kept out of the audit, where tens of thousands of them would bury the\ncoupons you chose.<\/li>\n<li>Filters for other plugins to add columns, fill them, and shape the coupon query.<\/li>\n<li>Much faster on shops with a lot of coupons. The overview used to read every\ncoupon's settings one at a time and weigh each coupon against every other by\nsearching the list afresh; both are now done once. On a test shop of 500\ncoupons and 300 products the screen went from 737 database queries to 27, and\nfrom roughly 3.7 seconds to 0.6.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>First release: coupon audit, overlap detection, pre-publish warnings and\n30-day gross margin.<\/li>\n<\/ul>","raw_excerpt":"Find the coupons quietly costing you money: what is still live, what it really applies to, what overlaps, and what each one actually earns.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/348064","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=348064"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/davefx"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=348064"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=348064"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=348064"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=348064"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=348064"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=348064"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}