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.
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
- Variation or separate product?
- What can differ between variations
- Setting up variations in WooCommerce
- Stock per variation
- How variations appear in Google Shopping and Meta
- Where variation feeds go wrong
- A checklist before you publish a variation feed
- Why variation data is worth the effort
- Running variation feeds with Textfinity
- FAQ
- Sources
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:
| Situation | Use | Why |
|---|---|---|
| Same T-shirt in four colours and five sizes | Variations of one product | Only attributes differ; one description fits all |
| Same running shoe in leather or canvas | Variations | Material is an attribute, the product family is the same |
| A phone in 128 GB and 256 GB | Variations | Capacity and colour change, the model does not |
| A jacket and the matching trousers | Separate products | Different descriptions, different use |
| A basic and a pro version with different features | Separate products | The 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:
| Field | Parent | Variation |
|---|---|---|
| Title and description | Yes | Inherited |
| Brand and category | Yes | Inherited |
| SKU / product ID | No | Unique per variation |
| GTIN (EAN, UPC) | No | Unique per variation |
| Price | Sometimes | When it differs by size or option |
| Image | Main image | Colour-specific image |
| Stock | No | Per variation |
| Colour, size, material | No | Yes |
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.
- 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.
- 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.
- 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.
- 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.
- 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.

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:
- 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.
- Does every variation have a price? A variation without a price is not purchasable.
- 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:
| Column | Row 1 | Row 2 |
|---|---|---|
| id | TSHIRT-BLUE-S | TSHIRT-BLUE-M |
| item_group_id | TSHIRT-01 | TSHIRT-01 |
| title | Cotton T-shirt, blue, size S | Cotton T-shirt, blue, size M |
| color | Blue | Blue |
| size | S | M |
| gtin | (unique EAN) | (unique EAN) |
| availability | in_stock | out_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
sizeorcolorvalue, 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.
- Every variation row has a unique
id. - All rows of one product share one
item_group_id, and no other product uses it. - Each variation has its own GTIN where the manufacturer assigned one.
color,sizeand any other varying attribute are filled in on every row.- Prices are set per variation when they differ, and match the shop page.
- The image on each row shows that colour, not a generic parent image.
- Availability reflects stock for that variation, not the parent.
- 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.
- 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
- Design Guidelines for Selling Products with Multiple Variants, Nielsen Norman Group
- Variants, Shopify Help Center
- Create product variations, PrestaShop Help Center
- Product Variants, OpenCart documentation
- Product variants, Odoo 20.0 documentation
- Produktvarianter eller separata produkter?, Abicart
- Variable Products Documentation, WooCommerce
- WooCommerce Product Editor settings documentation
- WooCommerce Product Variations Inventory: Stock by Size, Upzone
- Consider variable products without purchasable variations, WooCommerce pull request
- Product Variant Structured Data (ProductGroup, Product), Google Search Central
- item_group_id attribute, Google Merchant Center Help
- Ultimate Guide: Ecommerce Product Variations Optimization, Yoast
