Skip to content
All posts

Product variants in ecommerce: turning a supplier’s rows into one product with sizes and colours

A supplier sends the hoodie once with S/M/L/XL in one cell, or three times under three codes, or with navy spelt three ways. None of that is a variant a store or a feed can sell. Here is what Google Merchant Center, Shopify and WooCommerce each need to see, what may differ inside a group and what must not, and how to rebuild the rows before the import.

BeforeNavynavy blueNVY
AfterNavy
Colour

Have a supplier file like this? Send it exactly as it arrived and see the same products before and after.

What a variant is, and what a supplier file sends instead

A product variant in ecommerce is one purchasable version of a product that comes in more than one option: the medium navy hoodie, as distinct from the hoodie. Google defines variants as “a group of similar products that only differ from one another by product details such as colour and size for clothing”.1 Shopify’s model says the same from the store’s side: each variant is a purchasable combination of option values with “its own price, inventory, and barcode”.12

Supplier files rarely arrive in that shape. The same hoodie turns up three ways, sometimes in one spreadsheet.

  • One row for the product, with every size crammed into a cell: Size “S/M/L/XL”.
  • One row per colour with nothing to say they belong together: HD-200, HD-200-BLK and HD200-GRY, the grey one at a higher price.
  • A colour column that means one colour and says it three ways: Navy, navy blue, NVY.

The first offers nothing a shopper can buy in size M. The second has rows and no group, so a store makes three hoodies of them. The third puts one colour into a filter three times.

What each platform needs to see

The three platforms describe one shape in three vocabularies: Google groups rows with a shared key, Shopify nests rows under one product, and WooCommerce points child rows at a parent.

Google Merchant Center: one row per variant, one item_group_id

Each variant is submitted as a product of its own, with its own ID and the same item_group_id as its siblings. Google’s example is a T-shirt in three sizes and three colours, sent as “a total of nine separate products” sharing one item group ID.1 The value is 1 to 50 characters, and the attribute is required for free listings of variants and for Shopping ads on variants in six countries, the United Kingdom among them.1

The differences travel in standard attributes. Colour [color] takes up to three colours joined by a slash, 100 characters in all, and is required for clothing and accessories; size [size] takes up to 100 characters and is required for clothing and shoes.23 Two optional attributes refine size: size_type for the cut (regular, petite, plus, tall, big or maternity) and size_system for the country convention, such as UK, EU or US.45

In May 2026 Google added variant_option, which lists each property that varies alongside its value: “Shoe width:narrow,size:8” in one CSV cell.26 Every variant in a group must use the same names, in a combination of values no other variant has.6 Its own page calls it optional, while the item group ID page lists it among the minimum requirements.61 Send it: Google says the attribute will be used to show a product with its variants “in conversational AI as well as traditional search experiences”.6 Its partner, item_group_title, names the group in up to 150 characters.7

Shopify: options and variants under one handle

A Shopify product has up to three options, and each combination of option values can be a variant, up to 2,048 per product.10 In the product CSV the URL handle is the group, and it is required when you add variants: the first row carries the product’s fields, and each following row repeats the handle, skips Title, Description, Vendor and Tags, and holds one variant’s details.11 An update that touches a variant column, such as SKU, needs Option1 name and Option1 value as well; without them “a new default variant is created and existing variants are deleted”.11

WooCommerce: a variable parent and its variation rows

WooCommerce’s importer reads a Type column: the parent row is variable, each child row is variation, and the child’s Parent column holds the parent’s SKU, or its ID in the form id:100.14 The parent row lists every value in Attribute 1 value(s), such as “S, M”, and each variation row holds only its own: “A variation needs one value; if you provide more than one, WooCommerce uses the first.”14 Every variation needs a unique SKU and a price: “Variations without prices don’t show in your store.”1413

RuleGoogle Merchant CenterShopifyWooCommerce
Group keyitem_group_id, 1 to 50 characters, the same on every variant1The URL handle, repeated on every variant row11The Parent column: the parent’s SKU, or its ID in the form id:10014
What can differcolor, size, pattern, material, age_group, gender, size_type and size_system, plus up to 30 variant_option pairs96Up to three options10Numbered attribute columns, one value per variation row14
Variants per productNot stated2,04810Not stated; by default, dropdowns stop narrowing above 3013
Requireditem_group_id on every variant; color for clothing and accessories; size for clothing and shoes123URL handle when adding variants; Option1 name and Option1 value when an update touches a variant column11Type, a unique SKU and a matching Parent on every variation row14
What each platform needs from a variant group, as its own documentation states it, read on 30 September 2026. Google’s requirements cover free listings, and Shopping ads in six countries including the UK.

What may vary inside a group, and what must not

Each variant has its own identifier, price, stock and image, and a combination of option values no other variant in the group shares.1213 Google requires a unique ID per variant and recommends a separate landing page URL for each; Shopify will not save “an exact duplicate of another variant that already exists”.110

Everything that holds the group together has to match on every row.

  • The group key. Casing does not separate groups: abc123 and ABC123 “are interpreted as the same product”, so ranges whose codes differ only in case merge.1
  • The group title. “All variants of the same product must have the same item group title”.7
  • The set of properties that vary. If one row names colour and size, every row must. Google flags “Missing colour for product variants” when a product in a group has no colour, and asks for “the same set of variant attributes” across the group.8

Some things look like variants and are not.

  • A parent SKU. “Don’t submit a parent SKU as a separate product.” It belongs in item_group_id on the variants.1
  • A set. Google’s examples of products that are not variants include “a suit consisting of a jacket and trousers or a set of bath accessories”.1
  • A part that fits many models. Windscreen wipers that fit many cars are submitted once, with the compatibilities listed “in its product description”.9

How supplier files break a group

Supplier files break groups in six ways, each visible in a single cell.

  • Sizes crammed into a cell. Size “S/M/L/XL” is four variants in one cell, and Google’s size attribute takes one value per product, so a feed reads it as the size of one product.3
  • Variants listed as unrelated products. HD-200, HD-200-BLK, HD200-GRY. With no shared key there is no group, and Google has no way to show them “as a group, instead of separately”.1
  • One colour, four spellings. Navy, navy blue, NVY, NAVY. Shopify shows option values to customers as they choose a variant, so the supplier’s spelling is what they read.10 Google wants the feed to use the landing page’s name for the colour: if the page says “Toasted Walnut”, the feed should not say “Brown”.2
  • Option names that drift. Colour, Color, Shade. WooCommerce wants attribute names spelt identically across parent and variations, and Google the same set of names across a group.146
  • Values that are not values. “N/A”, “see image”, “assorted”. Google’s colour attribute rules out “variety”, “men’s”, “women’s”, “N/A” and anything that points at the image; its size attribute rules out “n/a”, “none” and “multi-size”.23
  • Commas where a slash belongs. A two-tone jacket sent as “Navy, White”. If commas separate the colours, Google applies only one; the format is Navy/White.2

Spelling variants multiply options: every spelling of navy is one more choice in the picker for one real colour. Normalising attribute values is how to fold them back.

The same rows before and after

Here is the hoodie from the opening, field by field.

FieldSupplier sentAfter
Rows for the hoodie3, one per colour12, one per colour and size
Group keyblankHD-200 on every row
Variant IDHD-200, HD-200-BLK, HD200-GRYHD-200-NVY-S through to HD-200-GRY-XL
ColourNVY, black, GryNavy, Black, Grey
SizeS/M/L/XLS, M, L or XL, one per row
Variant titleCLASSIC HOODIE GREYClassic Hoodie, Grey, M
Group titleblankClassic Hoodie
Price39.99, 39.99, 44.9939.99, and 44.99 on the grey rows
ImageOne link, on the navy rowEach colour’s own photo on its rows
Three supplier rows rebuilt as one product with twelve variants.

The group key is the supplier’s base code, HD-200, following Google’s best practice of using the parent SKU as the item_group_id and never submitting it as a product.1 The grey rows keep their higher price, because Shopify and WooCommerce hold price on the variant.1213 And the group title leaves colour and size to the variant titles: “Don’t include details that only apply to individual variants, for example, size and colour.”7

Rebuilding the rows, step by step

This is spreadsheet work: a filter, a formula and a sort at each step.

  1. Choose the group key. The supplier’s parent code if there is one, otherwise brand plus model, and never change it once assigned.1
  2. Decide which properties vary. Usually colour and size. Use the same set on every row of the group.
  3. Split compound cells into rows. “S/M/L/XL” becomes four rows, each carrying every shared field from the original: three colours in four sizes is twelve rows.
  4. Give every row its own identifier. A variant SKU, and a barcode where the supplier gives one per variant; HD-200-NVY-S reads at a glance.
  5. Normalise the option values. One spelling per colour, matched to the product page, and one format per size: “S”, “M” and “L”, not “S”, “Medium” and “Lrg”.23 WooCommerce’s advice for supplier files is the same: “use one capitalization for each value, and map synonyms to one value”.14
  6. Fill each variant’s own fields. Copy shared values down to the size rows, keep a different price only where it belongs, and put each colour’s photo on that colour’s rows.
  7. Write the titles. A generic group title, and variant titles with colour and size in them.7
  8. Shape it for the destination. An item_group_id column for Google; repeated handles with Option1 name and Option1 value for Shopify; a variable parent row, then variation rows with Parent set, for WooCommerce.11114
  9. Check the group before export. The same key and option names on every row, no combination twice, no compound cell left, and no parent row sent to Google as a product.

When it is ambiguous

Two questions need an answer before any row is split.

Is it a variant or a different product? Variants differ only by details such as colour and size.1 Where each version “is considered a different product by design”, Google asks for the difference in the title and description and a GTIN or other unique identifier on each.9 A hoodie in grey is a variant; a zip-up version of the same hoodie is a different design.

Is the slash a list or a range? Settle it before the split, because both readings turn up in the same column.

The limits bite at the top end too. Shopify allows 2,048 variants per product but warns that some themes, apps and sales channels “might not support more than 100 variants”.10 WooCommerce’s dropdowns stop narrowing to the combinations that exist once a product passes 30 variations, a default developers can change.13

Where RefynData fits, and what to do next

Variants are one part of turning a supplier’s file into a catalogue; product data enrichment covers the rest, from each product’s identity to its category and images. RefynData’s product data enrichment service handles the value side of this job. It matches each SKU or barcode to the real product, splits compound cells, folds spellings such as NVY and navy blue onto one canonical value, clears non-values such as “N/A”, and finds the full-size original behind a thumbnail. It cross-checks each title against its own specs and flags what does not add up. Every value keeps a link to its source, and a grade per product puts the worst first without blocking the export.

To start, sort the supplier’s file by product name: a product that appears once with a slash in its size cell, or three times under three codes, is a group waiting to be built. Settle the group key and the option set first, then split, normalise and fill in. Do it in the supplier file rather than in the store, so the next delivery maps onto the same groups, for the same reason supplier data onboarding maps each supplier’s columns once. Then run the group check before export, alongside the product data quality checklist.

Questions

What is a product variant in ecommerce?

A variant is one purchasable version of a product that comes in several options, such as a hoodie in navy and size M. Variants differ only by details such as size, colour or material, and each has its own SKU, price, stock and image. A set, or a part that fits several models, is not a variant.

What is item_group_id in Google Shopping?

It is the Merchant Center attribute that marks products as variants of one another. Each variant is a separate product with its own ID, and all of them share one item_group_id of up to 50 characters, ideally the parent SKU. It is required for free listings of variants, and for Shopping ads on variants in six countries including the UK.

How many variants can a Shopify product have?

Up to 2,048, across up to three options such as size, colour and material. Shopify’s help page also warns that some themes, apps and sales channels might not support more than 100 variants. In a CSV import, each variant is a row that repeats the product’s URL handle.

How do I import variable products into WooCommerce from a CSV?

Give the parent row the Type variable and each child row the Type variation, with the parent’s SKU in the child’s Parent column. The parent lists every attribute value, each variation only its own, and every variation needs a unique SKU and a price. Spell attribute names and values identically in parent and variation rows.

Should each size be a separate product or a variant?

A variant, when the sizes are the same product sold from one page. Google, Shopify and WooCommerce all expect one row per size inside one group, so the shopper picks a size rather than a listing. Separate products are for things that differ by design, such as a zip-up and a pullover version of one hoodie.

What do I do when a supplier puts every size in one cell, like S/M/L/XL?

First check that the slash means a list and not a range, because Google itself uses a slash to put several sizes of one product in a single value. Four stock figures or four barcodes beside the cell mean four variants; otherwise ask the supplier. Then split the cell into one row per size, each with its own SKU and a shared group key.

Sources

  1. Google Merchant Center Help. Item group ID [item_group_id]. Read .
  2. Google Merchant Center Help. Colour [color]. Read .
  3. Google Merchant Center Help. Size [size]. Read .
  4. Google Merchant Center Help. Size type [size_type]. Read .
  5. Google Merchant Center Help. Size system [size_system]. Read .
  6. Google Merchant Center Help. Variant option [variant_option]. Read .
  7. Google Merchant Center Help. Item group title [item_group_title]. Read .
  8. Google Merchant Center Help. How to fix: Missing colour for product variants. Read .
  9. Google Merchant Center Help. Best practices for submitting unsupported variants. Read .
  10. Shopify Help Center. Adding variants. Read .
  11. Shopify Help Center. Using CSV files to import and export products. Read .
  12. Shopify developer documentation. About products and collections. Read .
  13. WooCommerce documentation. Variable Products. Read .
  14. WooCommerce documentation. Product CSV Importer and Exporter. Read .

Try it on a fileyour supplier sent

Nothing goes live without your sign-offEvery value keeps its sourceYour data is never shared

Send one supplier spreadsheet exactly as it arrived. We will show you the same products before and after, with a source on every value we add.

One email with the upload link. Nothing else lands in your inbox.