Merchlint – Catalog Audit for WooCommerce
Read-only WooCommerce product audit: goods that sold but are out of stock, duplicate SKUs, missing prices — each with the money at stake.
Solid choice
Merchlint is a solid plugin choice in 2026, with a few things worth checking first. Was last updated 6 days ago, and scores 64/100 on our health check.
- Actively developed — last update 6 days ago
- Tested with the latest WordPress (7.1)
- Small user base (<10 active installs)
- Very few reviews so far
How does it stack up?
Side-by-side on installs, updates, ratings & supportDaily downloads
Download spikes usually follow a new release — each site that auto-updates counts as a download.
Rankings
Where Merchlint stands todayWordPress.org search rankings
Live position in the plugin search, top 100| Keyword | Position |
|---|---|
| abilities-api | >100 |
| catalogue audit | #21 |
| duplicate gtin | #20 |
| ean | #85 |
| missing gtin | #22 |
About Merchlint
From the official readme · v0.3.8Description
Merchlint reads your WooCommerce catalogue and tells you where it is losing you money. Every
finding comes with the value it was based on, so you can check it yourself instead of taking our
word for it.
It changes nothing. No product, no price, no stock level, no order. The audit reads and reports;
every fix is yours to make, in your own admin.
What it looks for
Nineteen checks, in six groups:
- Money — products that sold in the past year and can no longer be bought; goods selling
without a photo or hidden from the catalogue; sale prices whose scheduled end date has passed
and are still running; products with no price at all. - Catalogue and navigation — products outside every category; duplicate SKUs; variable
products with every variation sold out, or marked sold out while their variations are still in stock;
published products WooCommerce keeps out of the shop because their parent doesn’t exist or isn’t published. - Content — descriptions too short to answer a customer’s question; images with no alt text.
- Performance and media — oversized image files; bloated autoloaded options; media entries
whose file is missing from disk. - Environment — PHP, WordPress or WooCommerce on a version that no longer gets security fixes;
a scheduled-task queue that stopped running — WP-Cron and Action Scheduler are reported
separately — which is what stalls every piece of work meant to happen later. - Product identifiers — products with no GTIN, UPC, EAN or ISBN, and two products carrying
the same one. An empty or duplicated identifier is the usual reason an item quietly drops out of
a shopping feed, and nothing in WooCommerce says a word about it.
What makes it different
- Every finding shows its evidence. Not “12 636 problems” but the field we read, the value we
found and the threshold we compared it against. - It tells you where to start. The three items with the largest amount at stake, first — before
the full list. - A zero means “checked, clean”. A rule that could not run says so instead of quietly
reporting nothing. “No data” and “no problems” are different answers, and you get the right one. - It never adds up currencies. A store selling in euros and dollars gets a separate figure for
each. Adding them without an exchange rate would be inventing a number. - Two scans of an unchanged store give the same result, item for item. When something does
change, a separate screen tells you what — and whether the difference came from your store or
from a rule of ours that got smarter. - “Hide from report” is permanent. Seasonal stock you already know about stops coming back
after every scan, and stays hidden across plugin updates.
Every check has a page that explains it
Nineteen checks, nineteen pages — linked from the audit screen, next to the rule they belong to.
Each page says what the problem costs, which fields the rule reads and which thresholds it
compares them against, how to fix it, and when the finding is not a problem in your store.
That last part is why the pages exist. A rule you cannot argue with is a rule you end up ignoring
wholesale, so every page names the cases where the right answer is “hide this and move on”:
seasonal goods, spare parts, products sold only by phone.
Your data stays yours
The free version works entirely on your server. No account, no sign-up, no phoning home: the
plugin makes no outbound connections at all, and an automated check enforces that on every build.
The links to merchlint.com are ordinary links. They open in your browser when you click them, and
the plugin sends nothing along the way — not your store’s address, not its version, not an
identifier of any kind. The only thing in the address is the language your admin is set to, so
that a Polish store gets the Polish page. Without a click, nothing leaves your store at all.
An AI assistant can read the audit only if you connect one to your store yourself; see the FAQ.
Installation
- Install and activate the plugin. WooCommerce must be active first — WordPress enforces this for
you. - Open Store audit in the admin menu.
- Press Scan now. A store with 50 000 products takes about a minute and a half on the hardware
we measure on; a slower host takes longer. You can stop the scan at any point.
The audit reads your catalogue and writes only to its own tables. Removing the plugin removes them.
Short PHP time limit? Nothing to do — the audit reads your host’s own limit and sizes each chunk
to fit inside it, then books the next one itself. A shorter chunk means more of them, not less work:
the audit still finishes, and it still resumes from where it stopped.
If your host reports a limit it does not actually enforce, you can set the chunk yourself in
wp-config.php:
define( 'MERCHLINT_BUDGET_SECONDS', 8 );
Frequently asked questions
Does it change anything in my store?
No. It reads your catalogue and reports what it finds. Every change is made by you, in your own admin. This is enforced in the code, not just promised: an automated check refuses to build the plugin if it calls any function that would modify products, categories, media or orders.
Will it slow my store down?
The scan runs in the background, in short slices, and it only touches the admin side. Your storefront is not involved. If the scan is interrupted — a server restart, a deployment — it picks up where it left off and gives the same result as an uninterrupted run.
Can I audit a store with tens of thousands of products?
Yes. A scan of 50 000 products completes in about 90 seconds and the results are paginated, so a rule with twelve thousand findings still opens instantly.
Why does it check WP-Cron and Action Scheduler?
Because a stalled queue fails quietly. WP-Cron and Action Scheduler are what WooCommerce and its extensions book later work on — order emails, the end of a scheduled sale, stock released from abandoned carts, subscription renewals — and neither your storefront nor your order list will tell you they stopped. The store keeps selling. It just stops doing everything that was meant to happen later. The two queues are reported as separate findings, because they stop for different reasons and are fixed in different places. What the rule measures is the age of the oldest overdue action, not how many…
What does “store health” cover here?
Everything the nineteen checks touch, not only product fields: the catalogue and its categories, the media library and the files behind it, the size of your autoloaded options, and the versions of PHP, WordPress and WooCommerce you are running. A store can have faultless product data and still be losing money to a stalled queue or to an unsupported PHP version, so the report covers both.
Does it work with multilingual stores?
Yes. Translations of one product are counted as one product: their SKU is shared deliberately, and their stock is one physical stock, so we never report the same goods twice or double the amount at stake. Polylang is tested with the plugin itself; WPML is recognised through its translation table, which we test against the same data it produces.
Does it work with HPOS (High-Performance Order Storage)?
Yes, with HPOS on and off. Both modes give identical results, amounts included.
Some of the findings do not apply to my store.
Then hide them. Every rule’s page explains when the finding is NOT a problem — seasonal goods, spare parts, products sold only by phone — and hiding takes two clicks, with an optional reason. The decision survives future scans, and the hidden items stay visible as a count and in a list you can restore them from, so nothing disappears silently.
Can an AI assistant read my audit?
Only if you connect one yourself. On WordPress 6.9 or later Merchlint registers two read-only abilities through the WordPress Abilities API: the audit summary and the list of findings. An AI assistant you connect to your store, for example through an MCP plugin, can call them as a logged-in user with the manage_woocommerce permission, and gets the same results as the Store audit screen. Merchlint itself sends nothing anywhere and changes nothing in your store.
Changelog
An AI assistant you connect to your store can read the audit (WordPress 6.9 or later), and Tools → Site Health shows what the last audit found.
0.3.8
-
An AI assistant can read the audit. On WordPress 6.9 or later Merchlint registers two
read-only abilities through the WordPress Abilities API: the audit summary and the list of
findings, most expensive first. An assistant you connect to your store yourself, for example
through an MCP plugin, calls them with the same permission as the Store audit screen and gets
the same numbers. They read the last finished audit and never start a new one; Merchlint sends
nothing anywhere. -
Site Health shows what the last audit found. Tools → Site Health gets a Merchlint item. When
the last audit found products that were selling and can no longer be bought, the item is a
recommended improvement that says how many there are and how much they brought in; other
“Important” findings make it one too. An audit older than 30 days gets a warning, because the
store may have changed since. The item only reads the saved audit and never starts a new one.
Before the first audit it sits among the passed tests, with a link to run it. -
Works on SQLite. Two queries used MySQL syntax that SQLite-based WordPress (WordPress
Playground, for example) rejects, so there the “Where to start” list stayed empty and SKUs and
GTINs with a stray space at the start or end were not compared as equal. Both queries now run on
SQLite too; on MySQL and MariaDB the results are exactly as before.
0.3.7
-
New check: “Published, but the shop doesn’t show it”. Since WooCommerce 11.1, a product
whose parent points to an entry that doesn’t exist or isn’t published disappears from the shop
page, categories and search, and a simple product can’t be added to the cart – while the admin
shows it as published and visible. A simple product doesn’t use a parent at all, but CSV imports
and tools that create products through the REST API sometimes write one. WooCommerce itself
decides, in the version you run, and the check follows it: from 11.3 a parent that isn’t a
product no longer hides anything. The evidence names the parent and what it does to customers,
and the check’s page shows how to clear it. -
On a phone, the full list of a check shows the evidence again. Since 0.3.6 the “What we
read” column was hidden on narrow screens with no way to open it; each row now has the button
that shows it.
0.3.6
-
Every check that found something now has its own card on the audit screen. The cards stand
under “What we found, check by check”, below the list of checks. Each shows the first five
items – with a thumbnail, the evidence and the amount – and what to do about them. “Show all”
opens the full list, and the card says how many items are hidden. The check names in “Where
to start” and in the list of checks lead to their cards. -
The evidence reads as “field: value”, in the words WooCommerce uses. Stock status,
catalogue visibility, product type and publication status show their WooCommerce and WordPress
labels – “Out of stock” rather than “outofstock” – on the screen and in the CSV export. An empty
main image field shows as “(empty)” rather than “0”, and “Product outside every category” names
the category – “Uncategorized (#15)” rather than “15”. Revenue and prices in the evidence follow
the number format of your admin language: “7,740.00 USD” and “195.30” on an English screen,
where they used to read “7 740,00 USD” and “195.3”. WP-CLI output has not changed. -
“Hide from report” takes an optional reason, and everything you have hidden has its own
list. After hiding an item from a card you are back on that card. The new “Hidden items”
button, next to “Download everything (CSV)”, opens a list of every hidden item with the date
and the reason. The list says when a check has changed since an item was hidden, and lets you
restore any of them – also items the latest audit no longer finds. -
The summary gives the size of the catalogue. “Products in the catalogue” now stands next to
the number of findings, counted when the audit ran. -
On the “Why did this change?” screen, each example links to its item. The checks there are
listed in code order, B4 before B10, and the screen says how many items were hidden since the
earlier audit, with a link to the list. -
Fixed the way back after hiding or restoring an item in a shop installed in a folder. With
an address such as example.com/shop, the page you landed on afterwards did not exist. The item
itself was hidden or restored. -
“When this is NOT a problem” no longer suggests hiding where hiding is the wrong answer.
Under “Duplicate SKU”, “Variation the customer can never pick” and “Sold out, but its variations
are in stock” the advice to use “Hide from report” is gone: these checks have practically no
exceptions, and the answer is to fix the product. The button itself stays on every card. The
plugin description now calls it by its current name, “Hide from report”, rather than “Hide”.
0.3.5
-
The audit screen now starts with a summary. Above the full list: the revenue sitting in
products that sold but can no longer be bought, and four tiles – Important, Worth fixing,
Clean, Not checked – each with the number of checks in it. “Everything we checked” opens with
one bar per area of the catalogue, and “Where to start” shows each product’s photo and a bar for
its amount. Check names now come before their codes, “When this is NOT a problem” no longer
hides behind a click, and the plugin’s box on the product page sits right under “Publish”.
The dashboard widget shows the same four counts. -
New check: “Sold out, but its variations are in stock”. The product is marked out of
stock, yet at least one of its variations can still be added to the cart. Shoppers see “out of
stock” in the shop and in search results, while the product page sells the variation – one of
the two is wrong, and the data alone cannot tell which, so the advice starts there. “They were
selling, now nobody can buy them” no longer lists these products, because they can be bought. -
Checks based on sales skip products that earned nothing in the period. A product sold only
at a price of 0 – a free gift added to orders – or whose every sale was refunded is no longer
listed by “They were selling, now nobody can buy them”, “Selling without a photo” or “Selling,
but hidden”. The amount at stake for it was zero anyway. -
“Product with no price or a zero price” no longer lists products that are out of stock, or
gift cards. Most such items turned out to be withdrawn products, free gifts and vouchers, not
mistakes. The evidence now says whether the price is missing or zero, and the advice starts
with checking whether it is intentional – and hiding the item if it is. -
“No GTIN, UPC, EAN or ISBN” no longer lists gift cards. Gift card products from gift card
plugins have no barcode by nature. -
SKUs and GTINs are compared the same way on every database. A code that came with an
invisible character or a non-breaking space – common when it is pasted from a spreadsheet – is
now the same code as the one without it. Until now this depended on the database behind the
shop: on MySQL 8 such a duplicate was missed, or only one product of the pair was listed. A GTIN
field holding nothing but such characters now counts as empty. -
“Image with no alt text” also counts a file name, a random code or digits only. Text such
as “IMG_2034.jpg” in the alternative text field describes nothing to a person who cannot see the
image, so it is treated like an empty field. The advice also says what WooCommerce 9.3.3 and
later do with an empty field: the product page shows the product name there, depending on the
theme. -
“Where to start” counts each product’s amount once. A product both hidden from the
catalogue and out of stock had its revenue counted twice and could rank above products that
earned more. -
Evidence on an English screen is in English. A few values written by the checks themselves,
such as “yes” and “no”, “(empty)”, “(not on disk)” and the note about supported WooCommerce
versions, appeared in Polish whatever language your admin uses. The results screen and the CSV
export now translate them. WP-CLI keeps them as they were, because scripts read them.
0.3.4
-
The evidence now gives its reason in words, in the language of your admin. Where a check says
why an item is listed – a product hidden from the catalogue, a task queue that stopped – the
reason appeared as an internal code in Polish, such as “wylaczony z katalogu”, whatever language
your admin uses. The results screen and the CSV export now say “excluded from the catalogue”,
translated like the rest of the screen. WP-CLI keeps the code, because scripts read it. -
Amounts and counts in the Polish admin no longer read “7,740,00” or “1,234”. The Polish
translation of WordPress changes the decimal separator to a comma but leaves the thousands
separator as it was, so both were the same character. When that happens, thousands are now split
with a non-breaking space – “7 740,00” – as in the evidence. Other languages see no change. -
The note about numbers kept in EAN for WooCommerce now names that plugin’s own copy tool. EAN
for WooCommerce can copy its numbers into WooCommerce’s identifier field itself: WooCommerce →
Settings → EAN → Tools → Copy to product meta. The note now says so and warns that the copy skips
WooCommerce’s own checks, so run the audit again afterwards – the duplicate check shows any
number that came across twice. Fields of other plugins keep the general advice. -
On WooCommerce 9.0 and 9.1 the note about another plugin’s field no longer sends you to a field
that is not there. Those versions have no field for a product identifier, yet the note advised
moving the numbers into it. It now says the field arrived in WooCommerce 9.2 and gives the same
advice as the identifier checks themselves: update WooCommerce, then run the audit again. -
“wp merchlint status –format=json” now also gives the counts the table shows. “counts”
includes the findings you have hidden, so a script reading it got other numbers than a person
looking at the screen. “visible_counts” and “hidden_counts” now stand next to it, with every
check of the scan, zeros included. “counts” itself has not changed.
0.3.3
-
The plugin no longer does anything at all when WooCommerce is not active. Until now it
created its own tables on every page load, registered the audit screen and added its WP-CLI
command even on a site with no WooCommerce – and then showed an empty screen without a word
of explanation. It now checks first, says so in one sentence on the dashboard, and touches
nothing. Saved results are left exactly as they were: activate WooCommerce and everything
comes back. -
New display name: Merchlint – Catalog Audit for WooCommerce. Only the displayed name
changed: same plugin, same directory address, same settings, same saved audits. Nothing in
your shop needs doing, and the screen in your admin menu is where it was. -
The identifier checks now say when your numbers are kept in another plugin’s field. Both
checks read WooCommerce’s own GTIN, UPC, EAN or ISBN field. When products hold their number only
in a field of EAN for WooCommerce, Germanized for WooCommerce, Trusted Shops Easy Integration,
Google for WooCommerce, Customer Reviews for WooCommerce or Product Feed Manager for WooCommerce,
the audit now says how many, names the field and
says plainly which check cannot see those numbers — on the results screen, on the check’s own
page, in WP-CLI and in the CSV export. Germanized passes its numbers through WooCommerce’s own
field when that field is empty, so with Germanized active only the duplicate check is affected.
Nothing is counted differently: no finding appears or disappears, and earlier scans stay
comparable. -
A check’s own page now shows what that check could not see. Notes about gaps were only on
the main results screen, above the list of checks — not next to the findings they explain. -
“What this audit could NOT check” no longer says “these rules found nothing” about rules that
ran. A rule that missed only part of what it looks at is now listed separately, with a sentence
of its own. -
Invisible characters in product codes now show in the evidence. Two codes that differ only
by a non-breaking space or a zero-width character look the same on screen, so a pair of
duplicates could show one value twice, with no way to tell which product carries the extra
character. The evidence now writes each such character as ⟨U+00A0⟩ and similar, on the screen and
in the CSV export. Clean codes look exactly as before. -
Three WP-CLI commands now stop on bad input instead of guessing. With a mistyped check code,
“findings” listed and “export” exported every finding instead of none; an invalid separator in
“export” ended in a critical error; “cancel” reported success for a scan that does not exist.
Each of them now says what was wrong. -
Two WP-CLI outputs now keep gaps apart from findings. The message after “export” counted the
rows about gaps — what the audit could not check — as findings, so a check that never ran was
reported as one saved finding. It now counts findings only and names the gap rows separately.
“status –format=json” now lists the gaps the same way “rule –format=json” does; until now a
check that did not run simply disappeared from its counts. -
The advice for missing sales data now points to a button that exists. When WooCommerce’s
order summary table was empty, the audit told you to run “Regenerate the order lookup tables” in
Status → Tools, and WooCommerce has no such tool. It now sends you to Analytics → Settings →
“Import historical data”, and the WP-CLI warning gives the same advice instead of naming a script
that is not part of the plugin. -
One request for a review, under the results. It appears once per user after a finished
audit and goes away for good when you open it or choose “Don’t ask again”. No reward is offered
and no rating is suggested.
Screenshots
For developers
Is this your plugin? Show off the numbers.
Add a live badge to your site, docs or GitHub README. It updates on its own — no account needed.
Best Merchlint alternatives
All abilities-api plugins →FAQ
Merchlint: quick answers
Straight answers, pulled from live WordPress.org data.
Live data from WordPress.org · checked Oct 20, 2026
Is Merchlint free?
Yes. Merchlint is free to download and use from the official WordPress.org plugin directory.
Is Merchlint safe to use in 2026?
Merchlint is a solid plugin choice in 2026, with a few things worth checking first. Was last updated 6 days ago, and scores 64/100 on our health check.
How many websites use Merchlint?
Merchlint is active on <10 WordPress websites and has been downloaded 702 times since it launched in September 2026. It was downloaded 467 times in the last 30 days.
Does Merchlint work with WordPress 7.1?
Yes. The developer has tested Merchlint up to WordPress 7.1.3, the latest release. It requires WordPress 6.5 or newer.
What PHP version does Merchlint need?
Merchlint requires PHP 7.4 or higher. Most hosts run PHP 8.x today, so it works on any modern WordPress hosting.
When was Merchlint last updated?
The latest version, 0.3.8, was released on October 14, 2026 (6 days ago).
Who makes Merchlint?
Merchlint is developed and maintained by baltano.
What are the best alternatives to Merchlint?
The most popular alternatives to Merchlint are MCP Adapter (50K+ installs), SlyTranslate (10+ installs) and SudoWP Radar (<10 installs).
Powered by PageForge
Want thousands of pages that rank like these? Build them in an afternoon.
This directory runs on the same engine as PageForge. Turn any spreadsheet, CSV or API into thousands of fast, SEO-ready WordPress pages — with schema, internal links and AI-written copy baked in.
- CSV, Google Sheets & API data sources
- AI content, schema & internal links per page
- Works with Elementor, Gutenberg, Yoast & Rank Math
- Free on WordPress.org — no credit card