Short answer. Google wants a variable product as one row per variation, each with its own id, price, image, colour and size, all sharing the parent’s id as item_group_id. A feed that sends the parent instead has no price and no attributes; a feed that sends variations without a group id lists your sizes as unrelated products. The plugin does the grouping for you; what remains is giving every variation a price, a specific attribute value and, where colours differ, its own image.
What a variable product is, to WooCommerce and to Google
In WooCommerce a variable product is a parent with options (attributes such as Size and Colour) and a set of variations generated from them, each with its own price, stock, image, SKU and, since 9.2, its own GTIN. The parent is a container: it has no price of its own, and WooCommerce notes that variations without prices do not show in the store.
Google has no notion of a container. Its product data specification wants one item per sellable thing, and it ties the items of one product together with item_group_id, which is required for variants in free listings and in Shopping ads for Brazil, France, Germany, Japan, the United Kingdom and the United States. It then tells the items apart by their variant attributes: color, size, material, pattern. For apparel, colour and size are required, not optional.
The two ways a variable product goes wrong in a feed
The parent is exported as the product. One row, the parent’s id, the parent’s image, no colour, no size, and a price field that is empty, because the parent has none. Merchant Center answers with “Missing value [price]” and, for clothing, missing attribute errors. Some exports paper over the price by writing the lowest variation price, which then mismatches the page when a shopper lands on a dearer size.
The variations are exported without a group. One row per variation, but each with the parent’s id (which Google reports as “Reused value [id]” and keeps only one row) or each with its own id and no item_group_id (which Google accepts and treats as six unrelated shirts). In the second case nothing is red in Merchant Center; the products simply compete with each other, and Google may show the sold-out size.
What the feed should carry, per variation
This is a real item from a WooCommerce demo store running our free plugin, description shortened. The blue V-neck is one of several colours of product 10; each colour is its own row with its own id, and the link opens the store with that colour selected.
<item> <g:id>26</g:id> <g:title>V-Neck T-Shirt - Blue</g:title> <g:description>…</g:description> <g:link>https://demo.feedrobin.com/product/v-neck-t-shirt/?attribute_pa_color=blue</g:link> <g:image_link>https://demo.feedrobin.com/wp-content/uploads/2019/01/vnech-tee-blue-1.jpg</g:image_link> <g:price>15.00 USD</g:price> <g:availability>in_stock</g:availability> <g:condition>new</g:condition> <g:item_group_id>10</g:item_group_id> <g:identifier_exists>false</g:identifier_exists> <g:color>Blue</g:color> <g:product_type>Tshirts</g:product_type> </item>
Five things to notice, because they are the five things a hand-built export usually gets wrong. The id is the variation’s, not the parent’s. The item_group_id is the parent’s post id and is the same on every colour. The link carries the attribute query, so Google’s crawler sees the blue shirt, not the default one. The image_link is the variation image, falling back to the parent’s when none is set. And color holds the term name as the shop displays it, not a slug, taken from the attribute named Colour (the plugin also reads Color and Farbe, and Size or Größe for sizes). Price is the variation’s, including tax; a sale price appears only while the sale is running. The demo products have no barcodes, so identifier_exists is false; a filled GTIN field would produce g:gtin instead.
The WooCommerce settings that make it work
Use global attributes named for what they are. Products → Attributes: create Colour and Size as global attributes and use them for variations. A custom attribute called “Shade” is a colour to you and nothing to a feed.
Give every variation a specific value. A variation set to “Any Colour” has no colour in the feed. Where the option truly does not matter (a gift-wrap yes/no), keep it out of the attributes used for variations.
Price every variation. WooCommerce hides unpriced variations from the store; a feed that reads them anyway sends an empty price. Set the price on each, or remove the variation.
Set variation images where colours differ. The variation image is what the feed sends for that row; sizes of one colour can share it. A variation without an image inherits the parent’s product image.
Fill the GTIN per variation (WooCommerce 9.2 and later has the field on each) so Google can match the exact size and colour to its catalogue. Our guide to the GTIN field covers what to enter and what to do when there is no barcode.
Checking the result
Paste the feed URL into the free feed check. Ungrouped variants are one of the things it reports, found by a fact a file cannot hide: rows that share a product page without sharing a group id. Missing prices, missing colours and sizes on a clothing catalogue, and reused ids are on the same report, each linked to the page that explains what Merchant Center will say about it.
Questions merchants ask
Should I send the parent product or the variations?
The variations, one row each, with the parent’s id as item_group_id on every row. The parent has no price of its own and no size or colour, so a parent row is a product Google cannot price or match. Do not send both: the parent row would be a duplicate of the group with no attributes.
What if a variation is set to “Any Colour”?
Then there is no colour value for that row, and the feed cannot invent one. For apparel that means a missing required attribute in Google’s biggest markets. Give every variation a specific value for the attributes Google reads, and keep “Any” for attributes that do not matter to shoppers.
My variations share one photo. Is that a problem?
Not for approval, but Google matches variants to searches partly by image, and asks for the image to show the variant where colours differ. Set a variation image for each colour; sizes can share the colour’s photo.
Do variations need their own GTIN?
Yes, when the products have barcodes: each size and colour has its own. WooCommerce 9.2 and later has a GTIN field on each variation, and the feed sends it per row. Reusing one barcode across variations is reported by Google as a reused value.
Sources
WooCommerce’s Variable Products documentation; Google’s attribute pages for item_group_id, color, size and price, and its product data specification. The feed sample is from a live WooCommerce demo store running FeedRobin Product Feed for WooCommerce, captured 20 September 2026.