← Back to blog

Product variations: what they are and how to set them up

November 12, 2026
Product variations: what they are and how to set them up

A product variation is one version of a product that differs from the others by a single attribute, such as size, colour, material or capacity, and that has its own SKU, price and stock count. In your shop the shopper sees one product page with a selector. In your feed, every variation must be its own row, tied to its siblings by a shared group ID. Get that split right and your catalogue is easy to run and easy for Google Shopping and Meta to read. Get it wrong and products are disapproved, merged or missing. This guide covers the definition, the decision between a variation and a separate product, the setup in the main platforms, and how variations travel into a feed.

Textfinity
textfinity.io
Keep product variation feeds in order
Textfinity maps your catalogue fields and publishes a feed for each channel and market, with setup handled for you.
Get set up

TL;DR

  • A variation is the same product in a different size, colour, pattern or material. If the description would change, it is a different product.
  • Each variation can carry its own SKU, GTIN, price, image and stock level. The parent page holds what they share.
  • In a feed, every variation is one row with a unique ID, and all rows of one product share the same item_group_id.
  • Most feed problems with variants come from missing attributes, duplicate IDs or a missing group ID, and all of them can be fixed at feed level.
  • Textfinity reads your catalogue, maps the fields and publishes one feed per channel and market, and can set it up for you.

Table of Contents

What a product variation is

The usage-research group Nielsen Norman Group gives the cleanest rule. If the only difference between two items is a single attribute such as colour, size, pattern or material, they are variations of one product. If the descriptions differ, they are different products. Its guideline follows from that: different products get different listings, and variations sit under one listing with selectable attributes.

A few terms you will meet in every platform:

  • Attribute: a property that can change between versions of the product. PrestaShop defines it as size, colour, capacity or weight, and advises defining all attributes before creating variations.
  • Option value: one choice within an attribute, for example small, medium or large.
  • Variation (or variant): one specific combination of option values. Shopify's help centre gives the example of a T-shirt with three sizes and two colours, where a small blue T-shirt is one specific variant.
  • Parent product: the container that holds shared data such as name, description, brand and category. WooCommerce calls it a variable product, OpenCart a master product, and Google Shopping a group of items sharing an item_group_id.

The maths grows quickly. Odoo's documentation uses a T-shirt with 4 colours and 5 sizes, which makes 20 variants, each with its own inventory count and records. Add a third attribute and a catalogue of 500 products can become several thousand sellable units. This is why variation data is the part of a feed that most often breaks.

Variation or separate product?

The decision shapes your product pages, your reviews and your feed. The Swedish shop platform Abicart gives a practical test. A price difference alone does not make a separate product. What matters is whether the alternatives still form a clear product family. Write the first two sentences of the description: if they become misleading for any of the alternatives, the group is too broad.

Apply it like this:

SituationUseWhy
Same T-shirt in four colours and five sizesVariations of one productOnly attributes differ; one description fits all
Same running shoe in leather or canvasVariationsMaterial is an attribute, the product family is the same
A phone in 128 GB and 256 GBVariationsCapacity and colour change, the model does not
A jacket and the matching trousersSeparate productsDifferent descriptions, different use
A basic and a pro version with different featuresSeparate productsThe text would mislead for one of them

There is a cost either way. Showing different products as variations makes comparison hard for shoppers. Giving every size its own page, on the other hand, multiplies the options and makes browsing tedious, and shoppers may miss combinations that would suit them. Variations also help search: one strong page collects the reviews and the links instead of splitting them across many near-identical pages.

For a feed, the same logic applies one level down. Products that are genuinely the same model belong under one group ID. Products that differ in description do not. If you merge them, Google and Meta will present them as selectable alternatives of one item, and the shopper sees a mismatch between the ad and the page.

What can differ between variations

The parent holds what is shared. Each variation holds what is not. WooCommerce's documentation lists the fields a variation can have: image, SKU, GTIN, price, sale price, weight, dimensions, shipping class, stock settings and tax class. OpenCart's variant products likewise inherit most settings from the master but can have their own price, inventory, model number, weight and status.

Here is a working split for a typical clothing or home product:

FieldParentVariation
Title and descriptionYesInherited
Brand and categoryYesInherited
SKU / product IDNoUnique per variation
GTIN (EAN, UPC)NoUnique per variation
PriceSometimesWhen it differs by size or option
ImageMain imageColour-specific image
StockNoPer variation
Colour, size, materialNoYes

Two rules from WooCommerce are worth knowing. If you set an SKU or GTIN on the parent and leave the variation blank, the variation takes the parent's value. That is convenient in the shop, but it is a trap for feeds, because two variations with the same SKU or GTIN cannot be told apart by a channel. Set both on every variation.

Setting up variations in WooCommerce

WooCommerce is the platform behind most of the variation questions readers ask. The steps are straightforward, and each has a place where it goes wrong.

  1. Choose the product type. Add a product and set it to Variable Product. Mistake: leaving it as a simple product and trying to fake options with separate listings.
  2. Add attributes. Add global attributes (shared across the shop, good for size and colour) or custom ones for a single product. Tick Used for variations, which makes the attribute available in the Variations tab. Mistake: using free-text custom attributes for colour, so that Blue, blue and Navy fragment your data.
  3. Generate the variations. In the Variations tab, generate all combinations or add them one by one. Mistake: generating combinations you do not sell, which then appear as unavailable or empty rows.
  4. Fill in each variation. Image, SKU, GTIN, price, weight and stock. This is the step that decides your feed quality. If you want a ready-made column layout for bulk work, the WooCommerce product CSV template shows how parent and variation rows are laid out.
  5. Save and publish. Then open the product on the front end and test every combination, in particular the ones with a price difference.

In Shopify the pattern is the same: options (size, colour) combine into variants, each with its own price, SKU and barcode. In PrestaShop you define attributes first and then build combinations from them. The data you need is the same everywhere, only the screen differs.

A note on downloadable products, since shoppers ask about it: yes, a WooCommerce variation can be marked downloadable, which adds fields for files, download limit and expiry in days. Marking a variation virtual removes its shipping settings.

Download and shipping settings for variations

Stock per variation

Stock is where variations cause the most daily confusion. When you create a variable product, tracking moves from the parent to each variation. The parent has no quantity of its own, and its status comes from its children: WooCommerce shows in stock if any variation has stock and out of stock only when every variation reaches zero. The same guide recommends enabling stock management at variation level, because setting it only on the parent gives a single shared quantity across all sizes and colours.

If a variable product shows as out of stock when you expect it to be in stock, check three things in order:

  1. Is stock management ticked at product level? If so, the parent quantity applies and it covers all variations. If not, each variation's own setting decides.
  2. Does every variation have a price? A variation without a price is not purchasable.
  3. Are the variations allowed to be backordered? WooCommerce has been changing how it treats variable products with no purchasable variations, so out-of-stock variations that allow backorders count as purchasable, while a product with nothing purchasable is treated as out of stock.

If your stock lives in a separate system, it helps to plan how it syncs with the shop at variation level, not product level. This overview of planning inventory software is a good starting point. In the feed, the same stock position becomes the availability value of each row, so a wrong count in the shop is a wrong ad on Google.

How variations appear in Google Shopping and Meta

Here the shop's one-page logic turns into one row per variation. Google's feed specification asks for an item_group_id on all items that are variants of the same product, with each item keeping its own id. Meta's catalogue works the same way, using a group ID so that shoppers can pick a size or colour inside one ad.

A worked example for a blue T-shirt in sizes S and M:

ColumnRow 1Row 2
idTSHIRT-BLUE-STSHIRT-BLUE-M
item_group_idTSHIRT-01TSHIRT-01
titleCotton T-shirt, blue, size SCotton T-shirt, blue, size M
colorBlueBlue
sizeSM
gtin(unique EAN)(unique EAN)
availabilityin_stockout_of_stock

The IDs differ, the group ID is shared, and the attributes that vary are filled in on each row. Google's structured data documentation adds the web-page side of this: to help Google understand which products are variations of the same parent, use the ProductGroup type with variesBy, hasVariant and productGroupID, alongside Product markup. That makes the page eligible to show variant information in merchant listings.

If you want to see full rows in XML and CSV, the Google Shopping feed template lists the columns, and the feed examples show common fixes. The XML versus CSV comparison helps you choose a format when a catalogue has thousands of variants.

Where variation feeds go wrong

These are the failures that turn up again and again when a catalogue moves from the shop to a channel.

  • Missing group ID. Each size is treated as an unrelated product. Ads show five near-identical listings, and shoppers cannot select a size.
  • One group ID for different products. A jacket and a vest end up under one group. The shopper sees a size selector that leads to the wrong item.
  • Duplicate IDs. Two variations share an SKU because the shop copied the parent value. One of them is dropped.
  • Missing GTINs on variations. The GTIN belongs to a specific size and colour, not to the whole product. Electronics and jewellery feeds are strict about this, which is why the electronics and jewellery guides spend so long on it.
  • Missing size or colour attributes. The shop shows the choice on the page, but the feed row has no size or color value, so the channel cannot display or filter it. This is the most common gap for fashion; the fashion feed guide covers sizes, colours and variants in detail.
  • A variation title that never changes. All variants carry the same title, so the shopper cannot tell them apart in the ad. Good titles put the variant-specific attribute in the title.
  • Stale availability. A size sells out in the shop, but the feed is a day old. Scheduled rebuilds fix this.

When Merchant Center flags these as disapproved, work from the feed side first: follow one product ID from the shop to the feed and then to the status message. The guide to disapproved products walks through the usual fixes.

A checklist before you publish a variation feed

Run this list on a sample of ten products, including your widest range of sizes and colours.

  1. Every variation row has a unique id.
  2. All rows of one product share one item_group_id, and no other product uses it.
  3. Each variation has its own GTIN where the manufacturer assigned one.
  4. color, size and any other varying attribute are filled in on every row.
  5. Prices are set per variation when they differ, and match the shop page.
  6. The image on each row shows that colour, not a generic parent image.
  7. Availability reflects stock for that variation, not the parent.
  8. Titles distinguish the variants and lead with the key information. Google titles work best between 100 and 150 characters with the most important words in the first 70, so size and colour should not be left to the very end.
  9. The category matches. A mismatched taxonomy will be noticed quickly, so see the Google product category mapping guide.

For a store selling in several countries, add a further layer: the same variation needs the right language, currency and tax in each market. The guide to one feed for several countries and the Nordic feeds guide explain how the split works. Translated titles and descriptions matter for variations in particular, because words such as colours and materials differ by language. The feed translation guide covers this by market.

Why variation data is worth the effort

Variations are not only a shop-admin concern. Yoast's guide on the subject notes that they make shopping easier, support conversions by catering to different needs, and help SEO by targeting more keywords, with indirect gains from longer sessions and fewer bounces. In advertising terms, a clean variation feed means that the size a shopper wants is the one the ad shows, available and priced correctly.

The same data also feeds other channels. Once your parent and variation structure is right, you can reuse it for Meta with a Google Shopping to Facebook catalogue mapping and for Pinterest or Amazon without rebuilding it by hand.

Running variation feeds with Textfinity

Textfinity is a product feed management tool. It reads your catalogue from Shopify, WooCommerce, Magento, PrestaShop, BigCommerce, a CSV, TSV or Google Shopping XML export, or a Google Sheet. It then maps, filters and publishes one feed per channel and market to a stable URL that rebuilds on a schedule. For stores with variations, that means one place to see how each row is mapped, and a feed that stays in step with the shop.

Its AI configs rewrite titles and descriptions to each channel's rules and translate them into 25 European languages, with a review step before any text reaches a feed. Processing runs on German infrastructure, and the AI models are pinned to EU-hosted endpoints, which matters for Swedish and other European stores that want product data to stay in the EU.

Plans are published at Textfinity pricing: Free at $0 a month, Basic at $4.99 a month or $49.90 a year, Standard at $9.99 a month or $99.90 a year, and Premium at $14.99 a month or $149.90 a year. If you would rather not map variations yourself, have Textfinity set it up for you: send the store and the channels, and the catalogue is connected, the feeds built and registered with you in each channel's console. Agencies running several client catalogues can see the per-client set-up.

FAQ

What does product variation mean?

It means one version of a product that differs from the others by an attribute such as size, colour, material or capacity. To the shopper it is the same product. To your systems, each combination is a separate sellable unit with its own SKU, price and stock level.

How is a variation different from a separate product?

A variation shares the parent's description and differs only in attributes the shopper chooses. A separate product has a different description or use. A simple test is to write the first two sentences of the description: if they would mislead for any option, create a separate product.

Why does my WooCommerce variable product show as out of stock?

The parent's status comes from its variations. If stock management is ticked at product level, the parent quantity applies. Otherwise each variation's own stock setting decides, and a product only shows in stock if at least one variation is purchasable. Check each variation's price, stock count and backorder setting.

What do Google Shopping and Meta need for variations?

Each variation must be its own row with a unique ID, and all variations of one product must share the same item_group_id. Fill in the attributes that vary, such as color and size, and give each row its own GTIN, price, image and availability.

Can a downloadable product have variations?

Yes. In WooCommerce you can mark a single variation as downloadable, which adds fields for the files, a download limit and an expiry in days. Virtual variations drop their shipping settings.

Sources