Which cause is yours?
| What you observe | Most likely cause |
|---|---|
| Variations imported without their attributes, or the parent has no usable options | 1. Variation listed before parent |
| Parent imports, but variations fail because their parent is not found | 2. Stray whitespace or case mismatch |
| Variations exist in admin, but are missing from the dropdown on the product page | 3. Missing regular price |
| Variation shows "Any…" or an option cannot be selected | 4. Attribute value not listed on the parent |
| Large import stopped midway; some variations of a product are missing | 5. The import stopped inside a product group |
1. A variation row appears before its parent in the CSV
The built-in importer processes the file in order. When a variation row names a Parent SKU that does not exist yet, WooCommerce creates a temporary placeholder parent without attributes, and the variation's attributes are lost; the parent row that comes later does not bring them back.
| Record | Type | SKU | Name | Regular price | Parent | Attribute 1 name | Attribute 1 value(s) | Attribute 1 visible | Attribute 1 global |
|---|---|---|---|---|---|---|---|---|---|
| 1 | variation | TS-001-S | T-Shirt - Small | 25.00 | TS-001 | Size | Small | 1 | 0 |
| 2 | variable | TS-001 | T-Shirt | (empty) | (empty) | Size | Small, Medium | 1 | 0 |
| 3 | variation | TS-001-M | T-Shirt - Medium | 25.00 | TS-001 | Size | Medium | 1 | 0 |
Record numbers exclude the header. (empty) marks an empty cell; · marks outer spaces and ↵ a line break.
| Record | Type | SKU | Name | Regular price | Parent | Attribute 1 name | Attribute 1 value(s) | Attribute 1 visible | Attribute 1 global |
|---|---|---|---|---|---|---|---|---|---|
| 1 | variable | TS-001 | T-Shirt | (empty) | (empty) | Size | Small, Medium | 1 | 0 |
| 2 | variation | TS-001-S | T-Shirt - Small | 25.00 | TS-001 | Size | Small | 1 | 0 |
| 3 | variation | TS-001-M | T-Shirt - Medium | 25.00 | TS-001 | Size | Medium | 1 | 0 |
Record numbers exclude the header. (empty) marks an empty cell; · marks outer spaces and ↵ a line break.
Fix: Sort your CSV so that every variable row comes before its variation rows. Never sort purely alphabetically by Name or SKU if that pushes variations above their parent. CatalogDock moves the rows for you and lists every move.
2. Stray whitespace or case mismatch in Parent or SKU
The importer finds the parent by the SKU written in the variation's Parent column. A space copied from a spreadsheet ("TS-001 ") or a different letter case (ts-001) can make that lookup fail.
| Record | Type | SKU | Name | Regular price | Parent | Attribute 1 name | Attribute 1 value(s) | Attribute 1 visible | Attribute 1 global |
|---|---|---|---|---|---|---|---|---|---|
| 1 | variable | TS-001 | T-Shirt | (empty) | (empty) | Size | Small, Medium | 1 | 0 |
| 2 | variation | TS-001-S | T-Shirt - Small | 25.00 | TS-001· | Size | Small | 1 | 0 |
| 3 | variation | TS-001-M | T-Shirt - Medium | 25.00 | TS-001 | Size | Medium | 1 | 0 |
Record numbers exclude the header. (empty) marks an empty cell; · marks outer spaces and ↵ a line break.
| Record | Type | SKU | Name | Regular price | Parent | Attribute 1 name | Attribute 1 value(s) | Attribute 1 visible | Attribute 1 global |
|---|---|---|---|---|---|---|---|---|---|
| 1 | variable | TS-001 | T-Shirt | (empty) | (empty) | Size | Small, Medium | 1 | 0 |
| 2 | variation | TS-001-S | T-Shirt - Small | 25.00 | TS-001 | Size | Small | 1 | 0 |
| 3 | variation | TS-001-M | T-Shirt - Medium | 25.00 | TS-001 | Size | Medium | 1 | 0 |
Record numbers exclude the header. (empty) marks an empty cell; · marks outer spaces and ↵ a line break.
Fix: Trim spaces around values in the Parent and SKU columns and write the parent's SKU exactly as it is. CatalogDock trims outer spaces in Parent automatically; a case difference is reported for you to decide, because it could also be a different product.
Fixed automatically
- Variations listed before their parent are moved below it (
VARIATION_BEFORE_PARENT). - Outer spaces in
Parentare removed when the match is unambiguous (PARENT_WHITESPACE).
Reported for you to decide
- A Parent that names no SKU of the file (
PARENT_NOT_FOUND) or differs only in letter case. - Variations without a price, values the parent does not list, duplicate combinations.
Needs data from your store
Global attributes and terms, and parents that already exist in your store. The website does not see them; the free WordPress plugin compares them with your store.
3. Missing price on variation rows
A common reason why variations look linked in the admin but are missing on the product page: WooCommerce does not show a variation without a price in the product page's dropdown.
| Record | Type | SKU | Name | Regular price | Parent | Attribute 1 name | Attribute 1 value(s) | Attribute 1 visible | Attribute 1 global |
|---|---|---|---|---|---|---|---|---|---|
| 1 | variable | TS-001 | T-Shirt | (empty) | (empty) | Size | Small, Medium | 1 | 0 |
| 2 | variation | TS-001-S | T-Shirt - Small | 25.00 | TS-001 | Size | Small | 1 | 0 |
| 3 | variation | TS-001-M | T-Shirt - Medium | (empty) | TS-001 | Size | Medium | 1 | 0 |
Record numbers exclude the header. (empty) marks an empty cell; · marks outer spaces and ↵ a line break.
Fix: Give every variation row a Regular price. For a free variation write 0 instead of leaving the cell empty.
4. Parent attributes not configured for variations
In the native WooCommerce CSV, the parent row lists every value of the attribute in Attribute 1 value(s), separated by commas (the cell is quoted because it contains commas). Each variation names the same attribute and exactly one of those values. There is no separate "used for variations" column: the importer marks the attribute of a variable product as used for variations itself.
| Record | Type | SKU | Name | Regular price | Parent | Attribute 1 name | Attribute 1 value(s) | Attribute 1 visible | Attribute 1 global |
|---|---|---|---|---|---|---|---|---|---|
| 1 | variable | TS-001 | T-Shirt | (empty) | (empty) | Size | Small, Medium, Large | 1 | 0 |
| 2 | variation | TS-001-S | T-Shirt - Small | 25.00 | TS-001 | Size | Small | 1 | 0 |
| 3 | variation | TS-001-M | T-Shirt - Medium | 25.00 | TS-001 | Size | Medium | 1 | 0 |
| 4 | variation | TS-001-L | T-Shirt - Large | 27.00 | TS-001 | Size | Large | 1 | 0 |
Record numbers exclude the header. (empty) marks an empty cell; · marks outer spaces and ↵ a line break.
| Record | Type | SKU | Name | Regular price | Parent | Attribute 1 name | Attribute 1 value(s) | Attribute 1 visible | Attribute 1 global |
|---|---|---|---|---|---|---|---|---|---|
| 1 | variable | TS-001 | T-Shirt | (empty) | (empty) | Size | Small, Medium | 1 | 0 |
| 2 | variation | TS-001-S | T-Shirt - Small | 25.00 | TS-001 | Size | Small | 1 | 0 |
| 3 | variation | TS-001-L | T-Shirt - Large | 27.00 | TS-001 | Size | Large | 1 | 0 |
Record numbers exclude the header. (empty) marks an empty cell; · marks outer spaces and ↵ a line break.
- On the parent row:
Attribute 1 value(s)lists every value the variations use, separated by commas. - On variation rows:
Attribute 1 nameis exactly the parent's attribute name, andAttribute 1 value(s)holds one value. Attribute 1 globalis0for a local attribute (as here) and1for a global attribute of Products → Attributes; keep it the same on the parent and its variations.
5. Server timeout broke the product group across batches
Large imports can stop at a server limit (PHP max_execution_time, a proxy timeout such as HTTP 504). If that happens inside a product group, the parent may be created with only some of its variations.
Splitting a catalog into several files is fine in itself: a variation in a later file finds a parent that an earlier import already created, by its SKU. What you cannot easily repair is a file that stopped halfway, because running it again as a new import reports the rows that already exist instead of creating them. Updating existing products is a different job (Update existing products changes products that already exist); it is not needed just for a variation to find a parent created by an earlier file.
Fix: Import in smaller files and keep each parent together with all of its variations in one file, so that a failed file can be checked and redone as a unit. CatalogDock builds such batches (a target of 500 records; a larger group stays whole in one larger file) with an IMPORT-ORDER.txt checklist. More on server limits: 504 Gateway Timeout.
Still failing?
- Clear product transients: In WooCommerce → Status → Tools, use "Clear transients" and "Regenerate the product attributes lookup table" if the frontend shows outdated variations.
- Global attributes (
pa_*): withAttribute 1 global = 1the importer looks the attribute up in Products → Attributes and creates it, and any missing terms, when they do not exist; a variation's value is matched to a term by its name. A file check cannot see your store's attributes. The free WordPress plugin lists the global attributes and terms an import would create and checks variations against a parent already in the store; test on a staging copy. - Getting duplicated SKU errors during import? See "Invalid or duplicated SKU" causes & fixes.
Check and repair your variations automatically
Drop your CSV or Excel file into CatalogDock. The free in-browser checker moves parents ahead of variations, strips stray whitespace from Parent columns, and checks variation prices and attributes before you import.
Runs in your browser · No files uploaded · Never connects to your store
Applies to the built-in WooCommerce CSV importer (Products → Import) creating new products; importer behavior as in WooCommerce 11.1.2 (on WordPress 7.1.2). The examples are complete CSV files you can copy or download. Each gives the result stated next to it in the CatalogDock checker (an automated file check, not an import).