What this problem looks like
A variable product is a parent with child variation posts. The dropdown on the front end maps to those children. Missing price on a variation makes it unpurchasable even when stock exists.
Bulk imports often create attributes on the parent without generating variation posts. The admin looks correct but the storefront has zero selectable combinations.
Build attributes correctly
On the Attributes tab, add Size, Colour, or other attributes. Check Used for variations. Choose Select all for values you sell. Global attributes live under Products → Attributes and keep naming consistent across the catalog.
- Products → Attributes: create pa_size if it does not exist.
- On the product, pick pa_size and add terms S, M, L.
- Save attributes before opening the Variations tab.
Generate variations and set required fields
Open Variations → Generate variations → Go. WooCommerce creates a row per combination. Set regular price on every variation you sell. Empty price variations never appear as buyable.
Set stock at variation level when managing inventory per SKU. Parent stock alone does not control variation availability.
Default form values
Use Default form values to preselect a variation. Wrong defaults can grey out other options on some themes. Leave defaults empty while debugging so all options start unselected.
Import and migration issues
CSV imports must create both parent variable products and variation rows with parent SKU references. Re-import with WooCommerce's official column mapping or use WP-CLI for large catalogs.
wp wc product_variation list --product_id=123 --user=1
wp wc tool run regenerate_product_lookup_tables --user=1
Theme and JavaScript conflicts
If admin looks correct but the front end fails, switch to Storefront and test. Swatches plugins and custom gallery scripts often break variation form events. Disable swatches temporarily to confirm.
When to stop DIY and hire help
Large catalogs with hundreds of variations per product, multi-currency displays, or custom configurators need developer time. BugShield repairs broken imports and variation AJAX on live WooCommerce stores.