Importing Variable Products
WooCommerce variable products have a parent product (type: variable) and one or more child variations (type: variation). Super Speedy Imports can import them four different ways depending on how your CSV is structured. This guide covers each method and the exact settings you need for it to work.
Variable products need the paid edition of Super Speedy Imports. Lite imports simple products.
Pick your method
Open your import, scroll to Product Data → Variable Products, and use the Import contains: selector to tell SSI what your CSV looks like:

| Option | Use when |
|---|---|
| Parent & Child rows | Every parent and its variations are in the same CSV. This is the classic format – the one most WooCommerce exports produce. It also handles plain simple products, so it is the right choice whenever your file is a normal product export (with or without variations). |
| Only variations with grouping column | Your CSV only has variation rows. A column (for example Style or Parent_SKU) groups rows that belong under the same parent. SSI creates the parents for you. |
| Only variations (parents already in db) | The parents already exist in WooCommerce (from a prior import or entered manually). This CSV only carries the variation rows, referencing those parents. |
The fields that appear below the selector change based on what you pick.
Upgrading an older import: an import saved with the retired Simple/parents (no variations) option is migrated to Parent & Child rows automatically. Parent & Child rows handles simple products the same way.
Method 1 – Parent and child rows in one file (the normal way)
CSV layout
Every parent has one row, and every variation has one row. Parent rows have an empty parent-reference column; variation rows fill it in with the parent’s SKU.
SKU,Name,Type,Description,Regular_Price,Color,Size,Parent_SKU
SHIRT,Branded Shirt,variable,A cool shirt,,"Red, Blue","Small, Medium, Large",
SHIRT-RED-S,Branded Shirt Red Small,variation,Red small,19.99,Red,Small,SHIRT
SHIRT-RED-M,Branded Shirt Red Medium,variation,Red medium,19.99,Red,Medium,SHIRT
SHIRT-BLU-S,Branded Shirt Blue Small,variation,Blue small,19.99,Blue,Small,SHIRT
HAT,Simple Hat,simple,A hat,9.99,,,
Notes:
- The
Typecolumn is informational – SSI usesParent_SKUto decide what’s a variation. A row with a non-emptyParent_SKUbecomes a variation; everything else is a parent or simple product. - Parent rows can carry the union of variation attribute values (
"Red, Blue","Small, Medium, Large") – WooCommerce uses those to list which options exist on the product page.
What to configure
Under Product Data:
- Main → map Product Title, Full Description, Short description, Regular price, SKU to your CSV columns as usual.
- Variable Products subsection:
- Import contains: Parent & Child rows.
- Parent reference (on variation rows): select the CSV column that holds the parent’s SKU (in the example above,
Parent_SKU). SSI uses this to match each variation row to its parent row in the same CSV. By default it is matched against the parent row’s unique item identifier (its SKU); if your rows are identified by one field but linked by another, use Parent is matched by (on parent rows) to point the linkage at a different column on the parent.

Under Taxonomies for each attribute that varies between the variations (Color, Size, etc.):
- Map the taxonomy’s source column to the CSV column.
- Tick Used for variations on it. Without this, WooCommerce won’t treat the attribute as variable and the variations won’t appear on the product page. Leave non-variation taxonomies (e.g. Product categories) with Used for variations unticked.

That’s it. Categories, tags, prices, stock and images are configured exactly like simple products.
Re-running the import
SSI matches rows to existing products by SKU, so running the import again updates the parent and its variations in place – no duplicates.
Method 2 – Variations only, with a grouping column
Use this when you have a CSV that’s effectively a list of variations, with a column (often called Style, Parent_SKU, Model, or similar) that tells you which variations belong together.
CSV layout
SKU,Name,Description,Regular_Price,Color,Size,Style,Parent_Name
SHIRT-RED-S,Branded Shirt Red Small,Red small,19.99,Red,Small,SHIRT,Branded Shirt
SHIRT-RED-M,Branded Shirt Red Medium,Red medium,19.99,Red,Medium,SHIRT,Branded Shirt
SHIRT-BLU-S,Branded Shirt Blue Small,Blue small,19.99,Blue,Small,SHIRT,Branded Shirt
JACKET-BLK-M,Warm Jacket Black Medium,Black medium,49.99,Black,Medium,JACKET,Warm Jacket
JACKET-BLK-L,Warm Jacket Black Large,Black large,49.99,Black,Large,JACKET,Warm Jacket
SSI reads the grouping column, creates one parent product per unique value, and links the variation rows under it. Each parent it creates gets a URL slug made from its title, numbered when another product already uses that slug, so its product page opens like any other.
What to configure
- Variable Products subsection:
- Import contains: Only variations with grouping column.
- Parent grouping: the CSV column (or a PHP function) that groups variations –
Stylein the example above. - Auto-created parent title: the CSV column whose value should become the parent product’s title –
Parent_Nameabove. If you leave this blank, the parent title is set to the grouping value itself (soBranded Shirtwould becomeSHIRT, which is usually not what you want). - Auto-created parent SKU: leave blank if your parents don’t need a SKU. See the composite-SKU note below.
- Taxonomies – same as Method 1: map Color/Size etc. to their CSV columns and set Used for variations on each one.

Each of the three Parent grouping / title / SKU fields can be switched from CSV Field to PHP Function with the type dropdown next to it. That’s useful when there’s no dedicated grouping column – for example, you can derive a style code from the SKU:
return function($data, $h) {
// "JC012 JBK M" → "JC012"
return strtok($data[$h['SKU']], ' ');
};
When Auto-created parent SKU is blank
SSI has to uniquely identify each row on re-imports. If the parent has no SKU, it can’t match on SKU alone, so SSI switches to a composite identifier of the form {grouping}|{row identifier}:
- Synthesised parent:
SHIRT| - Each variation:
SHIRT|SHIRT-RED-S
This is stored as postmeta _ssi_unique_item_id on every row, and SSI uses that key for re-import matching. You won’t see it in the admin UI, but it means re-runs of this import are idempotent – existing variations are updated in place rather than duplicated.
If you do want parents to have SKUs, point Auto-created parent SKU at a column whose value is shared across all rows in the same group (for example Style, so parent SHIRT gets SKU SHIRT). In that case the | composite isn’t used and matching uses _sku as normal.
Method 3 – Simple products, or parent shells only
This is a plain import – no variation logic at all: only simple products, or only the parent shells you’ll attach variations to in a separate run (using Method 4).
Parent & Child rows handles this: a file with no variation rows is imported as-is.
What to configure
- Import contains: Parent & Child rows.
- Nothing else variation-specific. Map the Main fields, Taxonomies, Media, etc. as you would for any import.
If a product is going to be a variable parent, set its Type column to variable and include the attribute columns (Color, Size) listing the union of values its future variations will cover – WooCommerce needs those on the parent so the front-end shows the right dropdowns.
Method 4 – Variations only, parents already in the database
Use this when the parent products are already in WooCommerce (imported previously, or created by hand) and the CSV you’re about to run contains only variation rows.
CSV layout
Just the variation rows, with a column that names the parent:
SKU,Name,Description,Regular_Price,Color,Size,Parent_SKU
SHIRT-RED-S,Branded Shirt Red Small,Red small,19.99,Red,Small,SHIRT
SHIRT-RED-M,Branded Shirt Red Medium,Red medium,19.99,Red,Medium,SHIRT
SHIRT-BLU-S,Branded Shirt Blue Small,Blue small,19.99,Blue,Small,SHIRT
SHIRT-BLU-L,Branded Shirt Blue Large,Blue large,21.99,Blue,Large,SHIRT
What to configure
- Variable Products subsection:
- Import contains: Only variations (parents already in db).
- Parent reference (on variation rows): the CSV column that matches the parent’s SKU –
Parent_SKUabove. SSI looks each variation’s value up inwp_postmeta._skuto find the existing parent post ID.
- Taxonomies: Color, Size etc. with Used for variations ticked on each, same as the other methods.

When SSI runs, it looks up each unique parent value in wp_postmeta, finds the parent by its SKU, and links the variation rows to it. A parent created by hand in WooCommerce is found the same way. The parent keeps its title, description, short description, slug, images and categories – only the variations are added/updated.
First-time workflow
If you’re setting this up for the first time, the usual sequence is:
- Import parents with Method 3 (a parent-only file on Parent & Child rows). Set
Type = variableon those rows and include the attribute columns. - Import variations with Method 4 (this method), referencing the parent SKU.
You can of course run both in one file with Method 1 – Method 4 is for cases where parents come from one data source and variations from another.
Default variation
Once your variations are imported, WooCommerce can show a “default” combination (pre-selected when a customer lands on the product page). SSI picks the first variation row it encounters per parent as the default. If you want a specific combination to be the default, put that row first in your CSV.
Common pitfalls
- Variations showing as separate simple products. Used for variations isn’t ticked on one or more attributes. Tick it on every attribute that varies. Select Is Taxonomy on each attribute row as well; SSI creates a missing global attribute and its terms during the run.
- Variations duplicated on re-import. Your SKU column isn’t stable between runs, or (Method 2) you changed
Auto-created parent SKUbetween runs – that changes which matching strategy SSI uses. Pick one and stick with it. - Parent product has no attribute dropdowns on the product page. The parent row doesn’t have the union of variation attribute values. For Method 1, set
"Red, Blue"/"Small, Medium, Large"style values on the parent row. For Method 2, SSI copies them from the first variation automatically, so this shouldn’t happen – but if the first variation has gaps, so will the parent. - Worried Method 4 will overwrite the parent? It doesn’t: for every post field the file maps, SSI carries the parent’s own stored value through the import, so the parent’s title, description, short description, images and categories stay as they are.
Written for Super Speedy Imports 3.40.0.

Comments