How to Add Product Variations in WooCommerce
Variations need three things in order: global or local attributes, the attributes marked for variations, and each variation given its own price. Miss one and the product is unbuyable.
The three-step order that matters: create the attributes, tick Used for variations, then give every variation a price. Skipping the middle step is why the Variations tab appears empty; skipping the third is why the add-to-cart button never shows.
Step 1: decide between global and custom attributes
Global attributes are created once under Products → Attributes and reused. Choose these when several products share the same options — size, colour, material. They can have archive pages and work with attribute-based filtering.
Custom attributes are created inside a single product. Use them for a one-off option that no other product shares.
Global attributes are almost always the right choice for a real catalogue. Retrofitting them onto hundreds of products later is tedious.
To create one: Products → Attributes, enter a name such as "Size", save, then click Configure terms and add the values — Small, Medium, Large. Order them deliberately; that order is what customers see.
Step 2: make the product variable
- Open the product and set Product data to Variable product.
- Go to the Attributes tab.
- Add your global attribute, or create a custom one with values separated by
|. - Tick Used for variations.
- Click Save attributes.
That checkbox is the step everyone misses. Without it, the attribute displays as product information and generates nothing.
Step 3: create the variations
Open the Variations tab. You have two options:
- Generate variations creates every combination automatically. Convenient for small matrices, unmanageable for large ones — three attributes with five values each produce 125 variations.
- Add manually creates only the combinations you actually sell, which is usually what you want.
Then, for each variation, set:
| Field | Notes |
|---|---|
| Regular price | Required — no price means not purchasable |
| Sale price | Optional, with an optional schedule |
| SKU | Optional but useful for inventory systems |
| Stock | Enable "Manage stock" per variation for real stock control |
| Image | Shown when that variation is selected |
| Weight and dimensions | Needed for accurate shipping — see WooCommerce shipping setup |
| Description | Shown under the variation selectors |
Use the bulk actions dropdown at the top of the Variations tab to set prices or stock across all variations at once, then adjust the exceptions.
Step 4: set defaults and check the front end
At the bottom of the Variations tab, Default Form Values pre-selects options for the customer. Setting a sensible default reduces one step at purchase — but leave it empty if you genuinely want a deliberate choice, such as a made-to-measure item.
Then view the product logged out and check:
- every attribute dropdown lists the right values;
- selecting a combination updates the price and image;
- an unavailable combination is reported clearly rather than silently failing;
- add to cart works and the cart line shows the chosen options.
When variations do not appear
| Symptom | Cause |
|---|---|
| Variations tab is empty | "Used for variations" not ticked, or attributes not saved |
| Dropdowns show but nothing is selectable | No variations created for those combinations |
| No add to cart button | At least one variation has no price |
| "Out of stock" on everything | Stock managed per variation with quantity zero |
| Price shows a range, never a single price | Normal until a variation is selected |
| Selections do not update the price | JavaScript error — see below |
For the last one, open the browser console. Variation selection is JavaScript-driven, and a script combination or deferral feature in a performance plugin is the usual cause. Turning off JS combination and purging fixes most instances — the risk list is in choosing a cache plugin.
If the product is missing from the catalogue entirely rather than unbuyable, that is a different problem — see WooCommerce products not showing.
Keep the matrix manageable
- Do not generate combinations you do not sell. Every empty variation is a row to maintain.
- Two attributes is comfortable; three is the practical limit before the editor and the customer both suffer.
- For genuinely large catalogues, consider separate products with clear names instead of one product with a hundred variations.
- Manage stock per variation only if you really track it that way; otherwise manage at product level and keep the editor fast.
- Import large catalogues by CSV rather than by hand — but verify a sample afterwards, since partial imports are common.
Performance note
Variable products are heavier than simple ones: each variation is queried, and a product page with many of them makes many more database calls. On a large store this shows up as slow product pages, and object caching is the mitigation that actually helps — the reasoning is in how to speed up a WordPress site.
Frequently asked
- At least one variation has no price. WooCommerce will not offer a product for sale until every purchasable variation has a price set.
- Global attributes are defined once under Products → Attributes and reused across products, with their own archives and filters. Custom attributes exist only on the product you create them on.
- Technically many hundreds, but each combination is a row in the database and the editor slows noticeably past a few dozen. Large matrices are usually better split into separate products.