In short. Represent the family with ProductGroup, describe each variant with Product, and supply unique identifiers and directly selectable variant URLs.
Definition: Product variant structured data describes versions of a product that differ by attributes such as size or color. It represents the family with
ProductGroupand individual variants withProduct, linking them throughhasVariantorisVariantOf.
Key facts
- As of 17 October 2026, Google's product variant documentation requires a unique identifier for each variant and each product group.
- Schema.org's
ProductGroupdefinition describes a group whose members differ in specified ways; the group itself is not directly offered for sale. - Schema.org defines
sku, the Stock Keeping Unit, as a merchant-specific identifier for a product or service, or the product referenced by an offer.
Which properties belong to the group and the variants?
Structured data is a standardized format for describing page content. Google's variant guide places shared attributes, such as brand and material, on ProductGroup. Each variant's Product carries its specific name, image, size and color. An Offer describes that variant's price and availability.
variesBy lists the attributes that distinguish the variants. Google expects full Schema.org URLs, such as https://schema.org/color and https://schema.org/size. hasVariant nests variant products inside the group. Alternatively, separate Product objects reference the group's @id through isVariantOf, as Google's unnested example shows.
The following JSON-LD, a structured data format, is shortened from Google's coat example. The names, identifiers and commercial values are demonstration data from that documentation.
{
"@context": "https://schema.org/",
"@type": "ProductGroup",
"name": "Wool winter coat",
"productGroupID": "44E01",
"variesBy": ["https://schema.org/size", "https://schema.org/color"],
"hasVariant": [
{
"@type": "Product",
"sku": "44E01-M11000",
"name": "Small green coat",
"image": "https://www.example.com/coat_small_green.jpg",
"color": "Green",
"size": "small",
"offers": {
"@type": "Offer",
"url": "https://www.example.com/coat?size=small&color=green",
"priceCurrency": "USD",
"price": 39.99,
"availability": "https://schema.org/InStock"
}
},
{
"@type": "Product",
"sku": "44E01-X1100000",
"name": "Large light blue coat",
"image": "https://www.example.com/coat_large_lightblue.jpg",
"color": "light blue",
"size": "large",
"offers": {
"@type": "Offer",
"url": "https://www.example.com/coat?size=large&color=lightblue",
"priceCurrency": "USD",
"price": 49.99,
"availability": "https://schema.org/BackOrder"
}
}
]
}
How do group identifiers differ from variant identifiers?
Google's identifier requirements distinguish the parent identifier from each variant's identifier. productGroupID identifies the family. inProductGroupWithID on a variant can provide the same family identifier; when both properties appear, their values must match. Each individual variant also needs its own unique identifier, for example through sku.
In Google's example, 44E01 identifies the coat family, while 44E01-M11000 identifies the small green coat. The unnested example uses @id: "#coat_parent" to connect objects within the markup through isVariantOf.
How does the page structure change the markup?
Google's technical guidelines require a distinct URL that directly preselects each variant. Loading it must show the correct image, price and availability and allow that variant to be added to the cart.
For a single-page shop, where selectors change the variant without reloading the page, the group has one canonical URL, typically the base product URL without a preselected variant. Google's example includes the variants together in markup that stays unchanged when the selection changes.
For variants spread across separate pages, each page needs complete, self-contained markup for its entities. The full ProductGroup definition is repeated on each variant page. Google instructs these sites to omit the group's url property; its example supplies full details for local variants and URL references for variants on other pages.
Related terms
FAQ
Must you repeat the brand on every variant?
Google's property definitions say that you can place a shared brand on ProductGroup without repeating it on each Product.
How can you check the implementation?
The same guide's implementation workflow recommends the Rich Results Test to find critical errors, followed by URL Inspection on deployed pages. You also need the required Product properties for merchant listings or product snippets alongside the variant properties.
Sources
- Google Search Central, "Product variant structured data (ProductGroup, Product)", updated 8 September 2026
- Schema.org, "ProductGroup", undated
- Schema.org, "sku", undated
Check how a page reads to answer engines. Open the GEO score analyzer