A variation with no price, or no SKU
The parent looks priced and buyable in the category. One combination inside it is neither, and nothing says so until the customer picks it.
The symptom
The category page shows “From 49 zł” and the product page looks normal. The customer picks Blue / XL, and the price disappears, the Add to cart button goes away, or the page simply stops responding to the selection. Nothing announces an error — the combination just does not exist as far as WooCommerce is concerned.
The SKU version of the same problem is quieter still. The variation sells perfectly well; it is only invisible to everything outside the store.
What it costs
A variable product advertises the cheapest of its variations. That price range is computed from the variations that do have a price, so a broken combination never lowers it and never shows up in the listing:
- The product ranks and takes ad spend on a combination it cannot sell. The visitor arrives for the size they searched for and finds it unselectable.
- A variation with no price is excluded from the cart silently. WooCommerce treats an empty
_priceas “not purchasable” — no warning in the admin, no notice on the front end. - A variation with no SKU cannot be identified downstream. Stock sync, warehouse pick lists and product feeds key on SKU; a blank one means that row is dropped or merged into its neighbour.
The larger the variable product, the better it hides this. On a product with forty combinations, nobody clicks through all forty.
How to check it yourself
Variations that a customer can select but not buy:
wp db query "SELECT p.post_parent AS produkt, p.ID AS wariant \
FROM wp_posts p LEFT JOIN wp_postmeta m ON m.post_id = p.ID AND m.meta_key = '_price' \
WHERE p.post_type = 'product_variation' AND p.post_status = 'publish' \
AND (m.meta_value IS NULL OR m.meta_value = '')"
The same query with '_sku' in place of '_price' lists variations invisible to anything outside
WooCommerce. Replace wp_ with your table prefix.
In wp-admin the equivalent is opening the product, expanding every variation and reading each price field. That is workable for one product and hopeless for a catalogue.
How to fix it
- Decide whether the combination should exist at all. Most empty variations are leftovers from an attribute value that was renamed or deleted — those get removed, not priced.
- If it should exist, set the price on the variation itself. Inheriting from the parent is not a thing WooCommerce does for prices.
- For a missing SKU, follow whatever scheme the rest of the catalogue uses. A blank SKU is only safe if nothing downstream consumes SKUs at all.
- Regenerate the product lookup tables afterwards, or the storefront keeps showing the old range:
wp wc tool run regenerate_product_lookup_tables --user=1
- If an import created the variation, fix the import. Otherwise it comes back on the next run.
When it is a false positive
- “Price on request” setups. Some B2B stores deliberately leave the price empty and replace the Add to cart button with a contact form. That is a design, not a defect.
- Variations priced at runtime by a bundle, subscription or configurator plugin that fills
_priceonly when the cart is built. - A store that does not use SKUs. If no field is filled anywhere, an empty SKU carries no information and the finding is noise — hide it once and it stays hidden.
- Variations left as drafts on purpose, waiting for stock to arrive.
How Merchlint finds it
Merchlint reads _price and _sku for every row of type product_variation whose parent product
is published, and reports the ones that are empty or missing. The finding is grouped by parent
product, with the count of affected combinations and their attribute values — so you see
“Baltic wool throw: 3 of 12 combinations”, not twelve separate lines.
Confidence: F — fact from the database. The meta row is empty or it is not. No threshold, no interpretation.
This check ships in the Pro add-on.
Disagrees with what you see in your store? Write to us — we read every message. contact@merchlint.com