{"id":360163,"date":"2026-09-01T16:59:19","date_gmt":"2026-09-01T16:59:19","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/merchlint\/"},"modified":"2026-09-07T09:47:53","modified_gmt":"2026-09-07T09:47:53","slug":"merchlint","status":"publish","type":"plugin","link":"https:\/\/az-tr.wordpress.org\/plugins\/merchlint\/","author":23551451,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.2.1","stable_tag":"0.2.1","tested":"7.1","requires":"6.5","requires_php":"7.4","requires_plugins":null,"header_name":"Merchlint \u2013 Store Audit for WooCommerce","header_author":"Baltano","header_description":"Store catalogue audit. Shows how much you are losing, and changes not a single byte.","assets_banners_color":"bad2e1","last_updated":"2026-09-07 09:47:53","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/merchlint.com","header_author_uri":"https:\/\/baltano.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":119,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.2.0":{"tag":"0.2.0","author":"baltano","date":"2026-09-01 16:58:44","revision":3676537},"0.2.1":{"tag":"0.2.1","author":"baltano","date":"2026-09-07 09:47:53","revision":3684589}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3676536,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3676536,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3676536,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3676536,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3676536,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.2.0","0.2.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3680473,"resolution":"1","location":"assets","locale":"","width":1440,"height":727},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3680473,"resolution":"2","location":"assets","locale":"","width":1440,"height":1297},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3680473,"resolution":"3","location":"assets","locale":"","width":1440,"height":1512},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3680473,"resolution":"4","location":"assets","locale":"","width":1440,"height":560},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3680473,"resolution":"5","location":"assets","locale":"","width":1440,"height":498}},"screenshots":{"1":"Where to start: the three findings with the largest amount at stake, each shown with the money\nbehind it, before the full list.","2":"One rule up close: what it checks, what to do about it, a link to the full write-up, and the\nlist of items with the evidence for each \u2014 the field read, the value found, the threshold.","3":"Every rule with its count, split into what came from your own data and what came from your\ntheme or plugins \u2014 including the rules that found nothing, which say \"clean\" rather than\nstaying silent.","4":"The dashboard widget: the result of the last audit on the first screen you see after logging in.","5":"What changed since the previous audit, and whether the difference came from your store or from\na rule of ours that got smarter."}},"plugin_section":[262246],"plugin_tags":[279555,279556,264211,256503,286],"plugin_category":[45,55],"plugin_contributors":[278694],"plugin_business_model":[],"class_list":["post-360163","plugin","type-plugin","status-publish","hentry","plugin_section-dashboard-widgets","plugin_tags-autoloaded-options","plugin_tags-catalog-audit","plugin_tags-duplicate-sku","plugin_tags-store-health","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_category-seo-and-marketing","plugin_contributors-baltano","plugin_committers-baltano"],"banners":{"banner":"https:\/\/ps.w.org\/merchlint\/assets\/banner-772x250.png?rev=3676536","banner_2x":"https:\/\/ps.w.org\/merchlint\/assets\/banner-1544x500.png?rev=3676536","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/merchlint\/assets\/icon.svg?rev=3676536","icon":"https:\/\/ps.w.org\/merchlint\/assets\/icon.svg?rev=3676536","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/merchlint\/assets\/screenshot-1.png?rev=3680473","caption":"Where to start: the three findings with the largest amount at stake, each shown with the money\nbehind it, before the full list."},{"src":"https:\/\/ps.w.org\/merchlint\/assets\/screenshot-2.png?rev=3680473","caption":"One rule up close: what it checks, what to do about it, a link to the full write-up, and the\nlist of items with the evidence for each \u2014 the field read, the value found, the threshold."},{"src":"https:\/\/ps.w.org\/merchlint\/assets\/screenshot-3.png?rev=3680473","caption":"Every rule with its count, split into what came from your own data and what came from your\ntheme or plugins \u2014 including the rules that found nothing, which say \"clean\" rather than\nstaying silent."},{"src":"https:\/\/ps.w.org\/merchlint\/assets\/screenshot-4.png?rev=3680473","caption":"The dashboard widget: the result of the last audit on the first screen you see after logging in."},{"src":"https:\/\/ps.w.org\/merchlint\/assets\/screenshot-5.png?rev=3680473","caption":"What changed since the previous audit, and whether the difference came from your store or from\na rule of ours that got smarter."}],"raw_content":"<!--section=description-->\n<p>Merchlint reads your WooCommerce catalogue and tells you where it is losing you money. Every\nfinding comes with the value it was based on, so you can check it yourself instead of taking our\nword for it.<\/p>\n\n<p>It changes nothing. No product, no price, no stock level, no order. The audit reads and reports;\nevery fix is yours to make, in your own admin.<\/p>\n\n<h4>What it looks for<\/h4>\n\n<p>Fifteen checks, in five groups:<\/p>\n\n<ul>\n<li><strong>Money<\/strong> \u2014 products that sold in the past year and can no longer be bought; goods selling\nwithout a photo or hidden from the catalogue; sale prices whose scheduled end date has passed\nand are still running; products with no price at all.<\/li>\n<li><strong>Catalogue and navigation<\/strong> \u2014 products outside every category; duplicate SKUs; variable\nproducts with every variation sold out.<\/li>\n<li><strong>Content<\/strong> \u2014 descriptions too short to answer a customer's question; images with no alt text.<\/li>\n<li><strong>Performance and media<\/strong> \u2014 oversized image files; bloated autoloaded options; media entries\nwhose file is missing from disk.<\/li>\n<li><strong>Environment<\/strong> \u2014 PHP, WordPress or WooCommerce on a version that no longer gets security fixes;\na scheduled-task queue that stopped running \u2014 WP-Cron and Action Scheduler are reported\nseparately \u2014 which is what stalls every piece of work meant to happen later.<\/li>\n<\/ul>\n\n<h4>What makes it different<\/h4>\n\n<ul>\n<li><strong>Every finding shows its evidence.<\/strong> Not \"12 636 problems\" but the field we read, the value we\nfound and the threshold we compared it against.<\/li>\n<li><strong>It tells you where to start.<\/strong> The three items with the largest amount at stake, first \u2014 before\nthe full list.<\/li>\n<li><strong>A zero means \"checked, clean\".<\/strong> A rule that could not run says so instead of quietly\nreporting nothing. \"No data\" and \"no problems\" are different answers, and you get the right one.<\/li>\n<li><strong>It never adds up currencies.<\/strong> A store selling in euros and dollars gets a separate figure for\neach. Adding them without an exchange rate would be inventing a number.<\/li>\n<li><strong>Two scans of an unchanged store give the same result<\/strong>, item for item. When something does\nchange, a separate screen tells you what \u2014 and whether the difference came from your store or\nfrom a rule of ours that got smarter.<\/li>\n<li><strong>\"Hide\" is permanent.<\/strong> Seasonal stock you already know about stops coming back after every\nscan, and stays hidden across plugin updates.<\/li>\n<\/ul>\n\n<h4>Every check has a page that explains it<\/h4>\n\n<p>Fifteen checks, fifteen pages \u2014 linked from the audit screen, next to the rule they belong to.\nEach page says what the problem costs, which fields the rule reads and which thresholds it\ncompares them against, how to fix it, and when the finding is <strong>not<\/strong> a problem in your store.<\/p>\n\n<p>That last part is why the pages exist. A rule you cannot argue with is a rule you end up ignoring\nwholesale, so every page names the cases where the right answer is \"hide this and move on\":\nseasonal goods, spare parts, products sold only by phone.<\/p>\n\n<ul>\n<li><a href=\"https:\/\/merchlint.com\/checks\/\">All fifteen checks, explained<\/a><\/li>\n<li><a href=\"https:\/\/merchlint.com\/changes-nothing\/\">Why there is no \"Fix it\" button<\/a><\/li>\n<li><a href=\"https:\/\/merchlint.com\/sample-report\/\">What a finished report looks like<\/a><\/li>\n<\/ul>\n\n<h4>Your data stays yours<\/h4>\n\n<p>The free version works entirely on your server. No account, no sign-up, no phoning home: the\nplugin makes no outbound connections at all, and an automated check enforces that on every build.<\/p>\n\n<p>The links to merchlint.com are ordinary links. They open in your browser when you click them, and\nthe plugin sends nothing along the way \u2014 not your store's address, not its version, not an\nidentifier of any kind. The only thing in the address is the language your admin is set to, so\nthat a Polish store gets the Polish page. Without a click, nothing leaves your store at all.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate the plugin. WooCommerce must be active first \u2014 WordPress enforces this for\nyou.<\/li>\n<li>Open <strong>Store audit<\/strong> in the admin menu.<\/li>\n<li>Press <strong>Scan now<\/strong>. A store with 50 000 products takes about a minute and a half on the hardware\nwe measure on; a slower host takes longer. You can stop the scan at any point.<\/li>\n<\/ol>\n\n<p>The audit reads your catalogue and writes only to its own tables. Removing the plugin removes them.<\/p>\n\n<p><strong>Short PHP time limit?<\/strong> Nothing to do \u2014 the audit reads your host's own limit and sizes each chunk\nto fit inside it, then books the next one itself. A shorter chunk means more of them, not less work:\nthe audit still finishes, and it still resumes from where it stopped.<\/p>\n\n<p>If your host reports a limit it does not actually enforce, you can set the chunk yourself in\n    wp-config.php:<\/p>\n\n<pre><code>define( 'MERCHLINT_BUDGET_SECONDS', 8 );\n<\/code><\/pre>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20it%20change%20anything%20in%20my%20store%3F\"><h3>Does it change anything in my store?<\/h3><\/dt>\n<dd><p>No. It reads your catalogue and reports what it finds. Every change is made by you, in your own\nadmin. This is enforced in the code, not just promised: an automated check refuses to build the\nplugin if it calls any function that would modify products, categories, media or orders.<\/p><\/dd>\n<dt id=\"will%20it%20slow%20my%20store%20down%3F\"><h3>Will it slow my store down?<\/h3><\/dt>\n<dd><p>The scan runs in the background, in short slices, and it only touches the admin side. Your\nstorefront is not involved. If the scan is interrupted \u2014 a server restart, a deployment \u2014 it picks\nup where it left off and gives the same result as an uninterrupted run.<\/p><\/dd>\n<dt id=\"can%20i%20audit%20a%20store%20with%20tens%20of%20thousands%20of%20products%3F\"><h3>Can I audit a store with tens of thousands of products?<\/h3><\/dt>\n<dd><p>Yes. A scan of 50 000 products completes in about 90 seconds and the results are paginated, so\na rule with twelve thousand findings still opens instantly.<\/p><\/dd>\n<dt id=\"why%20does%20it%20check%20wp-cron%20and%20action%20scheduler%3F\"><h3>Why does it check WP-Cron and Action Scheduler?<\/h3><\/dt>\n<dd><p>Because a stalled queue fails quietly. WP-Cron and Action Scheduler are what WooCommerce and its\nextensions book later work on \u2014 order emails, the end of a scheduled sale, stock released from\nabandoned carts, subscription renewals \u2014 and neither your storefront nor your order list will tell\nyou they stopped. The store keeps selling. It just stops doing everything that was meant to happen\nlater.<\/p>\n\n<p>The two queues are reported as separate findings, because they stop for different reasons and are\nfixed in different places. What the rule measures is the age of the oldest overdue action, not how\nmany are waiting: a store with no visitors always has a queue full of them and is perfectly\nhealthy, because the first visitor clears it. Anything overdue by more than a day is not quiet, it\nis broken \u2014 and that threshold is yours to move.<\/p><\/dd>\n<dt id=\"what%20does%20%22store%20health%22%20cover%20here%3F\"><h3>What does \"store health\" cover here?<\/h3><\/dt>\n<dd><p>Everything the fifteen checks touch, not only product fields: the catalogue and its categories, the\nmedia library and the files behind it, the size of your autoloaded options, and the versions of PHP,\nWordPress and WooCommerce you are running. A store can have faultless product data and still be\nlosing money to a stalled queue or to an unsupported PHP version, so the report covers both.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20multilingual%20stores%3F\"><h3>Does it work with multilingual stores?<\/h3><\/dt>\n<dd><p>Yes. Translations of one product are counted as one product: their SKU is shared deliberately, and\ntheir stock is one physical stock, so we never report the same goods twice or double the amount at\nstake. Polylang is tested with the plugin itself; WPML is recognised through its translation table,\nwhich we test against the same data it produces.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20hpos%20%28high-performance%20order%20storage%29%3F\"><h3>Does it work with HPOS (High-Performance Order Storage)?<\/h3><\/dt>\n<dd><p>Yes, with HPOS on and off. Both modes give identical results, amounts included.<\/p><\/dd>\n<dt id=\"some%20of%20the%20findings%20do%20not%20apply%20to%20my%20store.\"><h3>Some of the findings do not apply to my store.<\/h3><\/dt>\n<dd><p>Then hide them. Every rule's page explains when the finding is NOT a problem \u2014 seasonal goods,\nspare parts, products sold only by phone \u2014 and hiding is one click. The decision survives future\nscans, and the hidden items stay visible as a count, so nothing disappears silently.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.2.1<\/h4>\n\n<ul>\n<li><strong>New display name: Merchlint \u2013 Store Audit for WooCommerce.<\/strong> Same plugin, same address, same\nsettings \u2014 the name now says what it does, for people who find plugins by searching for the job\nrather than for a brand.<\/li>\n<li><strong>Every rule now links to its own page<\/strong>, which explains what the finding costs, exactly how the\nrule decides, how to fix it, and when it is not a problem worth fixing. The link opens in your\nbrowser and carries nothing but the language of your admin; the plugin itself still makes no\noutbound connections at all.<\/li>\n<li>The plugin's name on your plugins list is now a link to its home page. Until now it led nowhere.<\/li>\n<li>No change to what the audit checks or reports. A scan of an unchanged store gives exactly the\nsame result as it did under 0.2.0.<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li><strong>First public release.<\/strong> Versions 0.1.0 and 0.1.1 below were pre-release: they were reviewed but\nnever published, so this is the first version you can install from the directory. Everything the\naudit does is listed under 0.1.0.<\/li>\n<li>Two extension points so add-ons can build on the audit: an action when a scan finishes and\na filter over the scan settings, plus the scan history behind both.<\/li>\n<li>Rules the current scan did not run are now marked \"not in this audit\" instead of \"clean\".<\/li>\n<li>A scan now keeps its settings even if an add-on hands it a value that cannot be stored \u2014 before,\none such value silently dropped every threshold the scan was running with, and the second half of\nthe scan used the defaults.<\/li>\n<li>Comparing two audits no longer writes a PHP notice to the log when a setting holds a list rather\nthan a number.<\/li>\n<li>No change to what the audit checks on its own.<\/li>\n<\/ul>\n\n<h4>0.1.1<\/h4>\n\n<ul>\n<li>Translations now come from translate.wordpress.org instead of files bundled in the plugin.<\/li>\n<li>No change to what the audit checks or reports.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>First release. Fifteen checks, resumable scanning, CSV export, per-rule knowledge pages,\npermanent \"hide\", English and Polish.<\/li>\n<\/ul>","raw_excerpt":"Read-only WooCommerce product audit: goods that sold but are out of stock, duplicate SKUs, missing prices \u2014 each with the money at stake.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/az-tr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/360163","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/az-tr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/az-tr.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/az-tr.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=360163"}],"author":[{"embeddable":true,"href":"https:\/\/az-tr.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/baltano"}],"wp:attachment":[{"href":"https:\/\/az-tr.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=360163"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/az-tr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=360163"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/az-tr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=360163"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/az-tr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=360163"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/az-tr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=360163"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/az-tr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=360163"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}