Merchlint
Available now
Next, in this order
  • DeutschDE
  • EspañolES
  • FrançaisFR
  • ItalianoIT
  • PortuguêsPT
  • NederlandsNL
  • SvenskaSV
  • TürkçeTR

A language shows up here once its pages are actually written. Nothing on this site is machine-translated.

Install free
← All checks

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.

Group
Catalogue
Confidence
F — fact from the database
Version
Free
Updated
Code
B5

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”:

  1. Restock, if the goods are coming back soon.
  2. Enable backorders on the variations, if you can actually fulfil them.
  3. 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.
  4. 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.

Run this check on your store

Disagrees with what you see in your store? Write to us — we read every message. contact@merchlint.com