Every variation is out of stock
The product looks buyable in the category, ranks in search and takes ad spend — and then no combination the customer picks can be added to the cart.
The symptom
In the category listing the product looks completely normal: photo, name, price range. The customer clicks through, picks a size, gets “This combination is unavailable”. Picks another. Same. Works through every option in the dropdown and none of them can be bought.
There was no signal before the click. The listing did not say sold out, because the parent product is still published and still in stock as far as the catalogue is concerned.
What it costs
This is worse than a product being hidden, and that is the part people underestimate.
- It keeps taking traffic. It ranks, it sits in the category, it appears in the feed, it can be in a paid campaign. Every one of those visits ends in a dead end.
- It costs trust, not just the sale. A customer who works through four dropdowns and finds nothing available does not conclude “out of stock”. They conclude the shop is broken, and that judgement applies to the whole store.
- It hides from the usual stock report. Reports that filter by out of stock list variations, which most people never look at, while the parent — the thing customers actually see — reads as in stock.
How to check it yourself
The query below finds published variable products that have variations, where none of the
variations is instock:
wp db query "SELECT parent.ID, parent.post_title
FROM wp_posts parent
WHERE parent.post_type = 'product' AND parent.post_status = 'publish'
AND EXISTS (SELECT 1 FROM wp_posts v
WHERE v.post_parent = parent.ID AND v.post_type = 'product_variation')
AND NOT EXISTS (SELECT 1 FROM wp_posts v
JOIN wp_postmeta sm ON sm.post_id = v.ID AND sm.meta_key = '_stock_status'
WHERE v.post_parent = parent.ID AND v.post_type = 'product_variation'
AND sm.meta_value IN ('instock','onbackorder'))"
onbackorder is deliberately treated as available — a made-to-order store where everything is on
backorder is working exactly as intended, and reporting it would be noise.
From the admin, the closest equivalent is Products → filter by Product type: Variable and sort by stock, but WooCommerce shows the parent’s stock status there, which is precisely the value that is lying to you.
How to fix it
You have four options and only one of them is “do nothing”:
- Restock, if the goods are coming back soon.
- Enable backorders on the variations, if you can actually fulfil them.
- Set the parent product to out of stock. The listing then says so, up front, and the customer never clicks through. This is the honest minimum.
- Hide it from the catalogue if it is not coming back. It keeps its URL and its search history, so nothing is lost, but it stops occupying a slot in the category.
What to avoid: deleting the product. It usually still has order history, and deleting it makes past orders harder to read.
When it is a false positive
- Seasonal stock you keep visible on purpose — skis in July, with a “back in autumn” note on the page. Deliberate; hide the finding and it stays hidden across scans.
- Pre-orders handled by a plugin that manages availability outside
_stock_status. - A variable product with a single variation you are about to publish. Transient state during setup.
How Merchlint finds it
Merchlint reads _stock_status for every variation of every published variable product and reports
the parent only when the product has at least one variation and none of them is instock or
onbackorder. The finding shows how many variations were checked and the status of each — so the
choice between restocking and hiding is made on the same screen.
Confidence: F — fact from the database. Every variation’s stored status is read; nothing is inferred from the storefront.
Where order data is available, the finding also carries what the product earned over the past twelve months, which is usually the number that decides whether it is worth restocking.
Disagrees with what you see in your store? Write to us — we read every message. contact@merchlint.com