{"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-01T16:58:44","modified_gmt":"2026-09-01T16:58:44","slug":"merchlint","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/merchlint\/","author":23551451,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.2.0","stable_tag":"0.2.0","tested":"7.1","requires":"6.5","requires_php":"7.4","requires_plugins":null,"header_name":"Merchlint","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-01 16:58:44","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/baltano.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":40,"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}},"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"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3676536,"resolution":"1","location":"assets","locale":"","width":1440,"height":1400},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3676536,"resolution":"2","location":"assets","locale":"","width":1440,"height":1150},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3676536,"resolution":"3","location":"assets","locale":"","width":1440,"height":860}},"screenshots":{"1":"Results: what is at stake, where to start, and every rule with its count \u2014 including the ones\nthat found nothing.","2":"A single rule: what it checks, how to fix it, and the list with the evidence for each item.","3":"Product editor: what the audit found about this product, its variations and its images."}},"plugin_section":[262246],"plugin_tags":[8533,6601,49648,186,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-audit","plugin_tags-inventory","plugin_tags-product-data","plugin_tags-seo","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=3676536","caption":"Results: what is at stake, where to start, and every rule with its count \u2014 including the ones\nthat found nothing."},{"src":"https:\/\/ps.w.org\/merchlint\/assets\/screenshot-2.png?rev=3676536","caption":"A single rule: what it checks, how to fix it, and the list with the evidence for each item."},{"src":"https:\/\/ps.w.org\/merchlint\/assets\/screenshot-3.png?rev=3676536","caption":"Product editor: what the audit found about this product, its variations and its images."}],"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; sales whose end date has passed and are still\nrunning; products with no price at all.<\/li>\n<li><strong>Catalogue and navigation<\/strong> \u2014 products outside every category; duplicated 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 alternative\ntext.<\/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 background queue that stopped running, which is what stalls scheduled work on a store.<\/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>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<!--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=\"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.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":"Finds what your catalogue is costing you \u2014 with the number to prove it \u2014 and changes nothing.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/360163","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=360163"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/baltano"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=360163"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=360163"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=360163"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=360163"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=360163"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=360163"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}