WooCommerce Showing a $0 Price on a Variable Product? Causes & Fix
Your variable product renders $0.00 – $49.00 instead of the range you set. One variation is priced at zero and it's dragging the bottom of the range with it. Here's how to find which one, and why a blank price behaves completely differently.
Last updated: 16 Jul 2026 · ~6 min read
The usual cause is a single variation with a literal 0 price — not a blank one. WooCommerce builds the range from every visible variation's active price, sorts it, and shows the lowest. A blank price is skipped entirely; a typed 0 is a real price and sorts first. Open the product's Variations tab and look for 0.00 in either Regular or Sale price.
What the price range is actually built from
A variable product has no price of its own. When it renders, WooCommerce calls get_variation_prices(), walks every visible variation, collects each one's active price, sorts the list, and prints the lowest and highest as a range. If the lowest value in that list is 0, you get $0.00 – $X.
The distinction that trips almost everyone up: blank and zero are not the same thing. WooCommerce explicitly skips a variation whose price is an empty string — it never enters the range at all (and the variation becomes unselectable, which is a different bug). But 0 is a legitimate price. It goes into the list, sorts to the front, and becomes your minimum. So when you're hunting for the culprit, you're not looking for an empty field — you're looking for a zero.
The most common causes (most likely first)
- One variation has a literal
0regular priceProducts → your product → Variations shows0.00typed into a Regular price field. A genuinely blank field is not this cause — blank variations are excluded from the range entirely. - A variation's sale price is 0 while its regular price looks fineThe Regular price column all looks correct, so you scan past it. Expand each variation and check the Sale price field — a sale price of
0.00becomes the active price and sorts to the front of the range. - The cached price range is staleThe Variations tab shows the right prices, but the front end still says $0. WooCommerce caches the computed range in a
wc_var_prices_<product_id>transient — a direct database write or an import can change prices without invalidating it. - The parent's price meta was never re-synced after an import or WP-CLI writeThe single product page shows the correct range, but the shop grid, the price filter widget or price sorting still say 0. Those read the parent's synced
_pricerows and thewc_product_meta_lookuptable, which only update whenWC_Product_Variable::sync()runs. Importers and direct SQL bypass it. - A pricing plugin is filtering the price down to 0It's $0 for some visitors and correct for others. Role-based, wholesale and dynamic-pricing plugins hook
woocommerce_variation_prices_price. Log out, or view in a private window — if the range corrects itself, it's a filter, not your data.
Where to look first
- Open Products → your product → Variations and expand every variation. You're looking for
0.00— in either the Regular price or the Sale price field. A blank field is not your culprit here. - Found a 0? That's cause 1 or 2. Set a real price (or clear the field to blank if the variation shouldn't be sold), save, and reload the product page.
- Every price looks right in admin but the front end still says $0? That's the cache — go to
WooCommerce → Status → Toolsand run Clear transients, then reload. - Product page correct but the shop grid or price filter still shows 0? The parent never re-synced (cause 4). Open the parent product and click Update — that alone triggers a sync. If prices arrived by import or WP-CLI, run
wp eval 'WC_Product_Variable::sync( 123 );'with your product ID. - Only some visitors see $0? View the product logged out. If it's correct there, a pricing plugin is filtering it (cause 5) — deactivate pricing plugins one at a time.
Got hundreds of variations to scan?
Expanding variations one by one hunting for a stray 0.00 is fine for a product with six variants and miserable for one with two hundred — and it doesn't tell you whether you're chasing bad data or a stale price cache. DiagnosticIQ's free dashboard flags zero-priced and unpriced variations across your catalogue in one screen, and separates a genuine 0 from a stale wc_var_prices transient so you fix the right thing first. It also keeps watching — so the next import that writes a 0 into a price column doesn't get found by a customer.
Made by Prima Digital — the team behind this guide. Free forever; no card to install.
How to know you fixed it
Reload the product page and the range should read $X – $Y with no zero at the front — then check the shop grid and the price filter widget, whose lower bound should no longer be 0 either.
Frequently asked
Can a customer actually buy it for $0?
Yes. A variation priced at 0 is purchasable, and WooCommerce will let the order through at zero — often skipping payment entirely. Fix it before you go looking for anything else.
What's the difference between a blank price and a 0 price?
Blank means the variation is excluded from the range and can't be selected at all — customers get "no products matched your selection". A 0 means it's fully sellable at zero. Different symptom, different cause.
Why does one bad variation break the whole product's price?
Because the range is just the lowest and highest of every visible variation's price. One zero becomes the lowest, so it becomes the front of the range.
Is clearing transients safe on a live store?
Yes — transients are a rebuildable cache, not your data. The first few page loads afterwards will be slightly slower while the ranges recompute.