What is ProductGroup in Schema.org?
ProductGroup is the Schema.org type that groups the variants of a single product, the versions that differ only in things like size, color or material. The group is not sold: it acts as a template with what they all share, says how they vary and links each variant, which is a Product with its own offer and identifier.
Key takeaways
- ProductGroup is the parent product in the markup: it is not bought, but it gathers what all its variants have in common, such as the brand or the general description.
- Google requires a name, recommends variesBy, hasVariant and productGroupID, and requires a unique identifier for each variant and each group.
- On a single page with a selector, the group has one canonical URL; if each variant has its own page, the whole group is repeated on each one.
- Each variant has to open already selected from its own URL, with its image, price, availability and buy button.
A shirt sold in two colors and three sizes is six things you can buy and a single product idea: the shirt. In the markup, each of the six is a Product and the idea that gathers them is a ProductGroup. It is a Schema.org type, and its name is the vocabulary's own. The ProductGroup is not sold: it is the parent that says what the variants have in common and how they differ. It matters because it is how Google understands that six product pages, or six options inside a single one, are the same item and not six products competing with each other. What counts as a variant in your catalog, and when a size or a pack is one, is explained in the entry on product variants; this entry covers the type that describes them in structured data.
How it works
Schema.org defines ProductGroup as a group of products that vary only in well-described ways, such as size, color or material, and hangs it from Product: it is a kind of product. It adds a clarification that explains its design: the group itself is not offered for sale, but the variants it represents are. It works as a prototype or a template, and the properties set on the group represent characteristics shared by all its variants, except three that belong only to the group: variesBy, hasVariant and url.[1]Schema.org. ProductGroup
It has three properties of its own. hasVariant points to each variant, and its inverse, isVariantOf, lets the variant point back to the group. productGroupID is a text identifier for the group. variesBy says which properties the variants vary on, for example size or color.[1]Schema.org. ProductGroup
Google added its variants documentation on February 20, 2024, along with the isVariantOf property in the product documentation, and clarified then that it supports variants with different URLs.[2]Google Search Central. Latest documentation updates According to that documentation, variant markup makes your products eligible to show with their variant information in merchant listing experiences, and putting what is shared on the group, such as the brand or the reviews, cuts down on repeated information.[3]Google Search Central. Product variant (ProductGroup, Product) structured data What it asks of the group:
| Property | What Google says |
|---|---|
name |
Required. The name of the group, such as "Wool coat", and on each variant a more specific one, such as "Wool coat, green, size S" |
productGroupID |
Recommended. The group's identifier, also called the parent SKU. If you also give it on each variant with inProductGroupWithID, it has to match |
variesBy |
Recommended. The properties that tell the variants apart, with their full Schema.org URL: color, size, suggested age, suggested gender, material and pattern |
hasVariant |
Recommended. Each variant as a nested Product; or, the other way around, each variant points to the group with isVariantOf |
brand, description, review, aggregateRating |
Recommended when they are the same for all variants. A brand set on the group does not need repeating on each one |
url |
Only for single-page stores: the URL of the group with no variant selected |
Table based on Google's variants documentation.[3]Google Search Central. Product variant (ProductGroup, Product) structured data Since May 20, 2026, that documentation also includes hasAdultConsideration, to mark products with adult content.[2]Google Search Central. Latest documentation updates
Google distinguishes two store designs. In the single-page one, all variants are chosen without reloading, usually with URL parameters, and the group has a single canonical URL, the one with no variant preselected. In the multi-page one, each variant or each color has its own page; then no one URL represents the group, and the full definition of the group is repeated on every page, because it has to carry what is common to all. Each page carries the complete markup of its own variants and, for those on other pages, a variant that carries only url, so Google can find them.[3]Google Search Central. Product variant (ProductGroup, Product) structured data In both designs, the variants can be nested inside the group or listed separately; Google recommends nesting them on a single page because it is the most compact and natural representation, and supports the others because some content management systems generate them more easily.[3]Google Search Central. Product variant (ProductGroup, Product) structured data
And two technical conditions that decide whether the markup is any use. Each variant needs a unique identifier, with sku or gtin (GTIN), and each group needs its own. And the store has to be able to open each variant already selected from its own URL, with that variant's image, price and availability and the option to add it to the cart, so Google can crawl and identify it.[3]Google Search Central. Product variant (ProductGroup, Product) structured data
In a store
Fictitious example. An invented store has one page per color of its linen shirt, and the size is chosen on each page with a parameter. This is the markup of the blue page, trimmed: the full group, its two blue variants and a variant with only the URL of the white page. The white page would repeat the same group with its white variants and a link back to the blue ones.
{
"@context": "https://schema.org",
"@type": "ProductGroup",
"name": "Calella linen shirt",
"description": "Long-sleeve linen shirt, straight cut.",
"brand": { "@type": "Brand", "name": "Calella" },
"productGroupID": "CAL-LINEN",
"variesBy": ["https://schema.org/color", "https://schema.org/size"],
"hasVariant": [
{
"@type": "Product",
"sku": "CAL-LINEN-BL-M",
"name": "Calella linen shirt, blue, M",
"color": "Blue",
"size": "M",
"offers": {
"@type": "Offer",
"url": "https://www.example.com/linen-shirt/blue?size=m",
"price": "39.90",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock"
}
},
{
"@type": "Product",
"sku": "CAL-LINEN-BL-L",
"name": "Calella linen shirt, blue, L",
"color": "Blue",
"size": "L",
"offers": {
"@type": "Offer",
"url": "https://www.example.com/linen-shirt/blue?size=l",
"price": "39.90",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock"
}
},
{ "url": "https://www.example.com/linen-shirt/white?size=m" }
]
}
Three things to read in it. The group carries no url, because in a multi-page store it has none of its own. The brand and the general description go once, on the group, and hold for all the variants. And the price goes in each variant's offer, never on the group, because the group is not sold.
What people often get wrong
Putting the price and availability on the ProductGroup, as if it were the product being bought. Schema.org is explicit: the group is not offered for sale, its variants are what is sold.[1]Schema.org. ProductGroup The offer goes inside each variant, with its price and its stock, and the group keeps what does not change.
How to check it
- Open the source code of a page with variants and look for
"@type": "ProductGroup". Check that it hasname,variesByandproductGroupID, and that each variant has its ownskuorgtinwith no repeats.[3]Google Search Central. Product variant (ProductGroup, Product) structured data - If the variants have
inProductGroupWithID, check that it matches the group'sproductGroupID.[3]Google Search Central. Product variant (ProductGroup, Product) structured data - Open each variant's URL in a private window and see whether the page loads with that variant selected: its image, its price, its availability and an active buy button.[3]Google Search Central. Product variant (ProductGroup, Product) structured data
- If your store has one page per variant or per color, open two and check that both carry the full group and a link to the other's variants.[3]Google Search Central. Product variant (ProductGroup, Product) structured data
- Check which rich results Google sees: run the URL through the Rich Results Test and see whether it finds the variants and with what errors or warnings.
Related concept: product variants
Product variants are a catalog idea and ProductGroup is their description in the markup. The variants live in your platform, with their options, inventory and codes; ProductGroup is how you tell a search engine about them. The first is decided when the product is created, and the second has to reflect it without inventing anything: if the store sells nine combinations, the group links nine variants. The entry on product variants explains how they are modeled on the platforms and in Google Merchant Center, and where a variant ends and another product begins.
To go further, the structured data reading path orders the rest of the terms, and the Offer entry explains what each variant's offer carries.
Synonyms
- English
- product group schema, product variant structured data
- Español
- grupo de productos, marcado de variantes
Sources
Change history
- First English version.
This definition is published under CC BY 4.0. Reuse this definition freely, crediting Clione with a link to this page.
Related terms
Product variants
What product variants are, how Shopify, Google and Merchant Center model them, and when a size or a color is a variant and not a separate product.
Product
What the Schema.org Product type is, which properties it carries, what Google requires for product snippets and merchant listings, and how to check it.
Offer
What the Schema.org Offer type is, how to write price, currency and availability, what Google requires, and how Offer differs from AggregateOffer.
SKU
What a product SKU is, how it differs from a GTIN and an MPN, how to create one per variant on Shopify or BigCommerce, and where Google asks for it.
GTIN
What a GTIN is, its formats (GTIN-13 or EAN, GTIN-12, GTIN-8, GTIN-14), who assigns it, how it goes on a product page and why you never make one up.
Canonical URL
What a canonical URL is, how Google uses it to pick the address of a product page with several URLs and how to check which one it chose in your store.
Make your catalog easy for bots to read
Clione fills every product page with what bots read best: the JSON-LD graph with its structured data, the meta description and the FAQs. You review and press Push; then we check your live store so it all stays published.