All guides

product variant structured data

Product variant structured data: connect every option without confusing Google

A practical guide to ProductGroup schema, variant URLs and keeping colour, size, price and availability consistent across your store.

Five colour variants of one sneaker connected to a central parent product

A product page can look perfectly clear to a shopper and still send mixed signals to a machine. The page title names the blue jacket, the selected swatch is green, the URL does not change and the structured data reports the cheapest size as available. Each fact may exist somewhere in the catalogue, but together they do not describe one purchasable item.

Product variant structured data is the discipline of making that relationship explicit: these items belong to one family, they vary by known properties and every offer describes the option a buyer can actually select.

Begin with the catalogue, not JSON-LD

Write down one row per sellable variant before touching the markup. Include its SKU or ID, parent group ID, canonical URL, colour, size, material, price, currency, availability, image and recognised identifier such as GTIN or MPN.

This table usually exposes the real problem. Two variants may share an SKU, a discontinued colour may still be marked available, or the feed may use “navy” while the page says “midnight blue.” Schema cannot repair uncertain source data; it can only publish it more neatly.

Choose a stable parent identifier that all members share. Keep the variant identifier unique. If a change in colour and size creates a different stock item, that combination needs its own identity in your data.

Model the family and its members

Google documents ProductGroup for the parent family and Product for each variant. On the group, variesBy names the properties that create the options—commonly colour, size, material or pattern. hasVariant connects the individual products, and productGroupID provides the common family identifier.

Each Product should then carry the facts that belong to that precise option. A blue medium shirt should not inherit the red shirt’s image or the small shirt’s availability simply because all three share a page.

The structure is easier to reason about in plain language:

  • one ProductGroup is the style or model;
  • each Product is a buyable combination;
  • variesBy explains what changes;
  • hasVariant or the shared group ID explains what belongs together;
  • each Offer reports the price and stock state for that variant.

Do not add a variation property merely because your platform supports it. If every version has the same material, material is a product fact—not the dimension by which the group varies.

Pick a URL pattern you can keep consistent

Google supports two common designs: a single page where the selected variant changes through parameters or fragments, and separate pages for individual variants. Either can work. The operational test is whether Google can reach the variant state and whether the URL, visible selection, canonical tag and structured data agree.

For separate variant pages, each URL should open with the promised option selected. Avoid canonicalising every meaningful colour page to a generic parent if you expect those URLs to represent distinct products in search.

For one-page selectors, make sure the initial HTML and the rendered state do not contradict each other. Google warns that dynamically generated product markup can make shopping crawls less frequent and less reliable, especially for fast-changing price and availability. Server-rendering the selected state is the safer path when your platform allows it.

Keep the page, schema and feed in lockstep

Treat the selected variant as a contract across four surfaces:

  1. the URL and canonical;
  2. the visible product title, image, price and availability;
  3. the Product and Offer structured data;
  4. the Merchant Center item and item group.

A crawler should be able to pick one URL and find the same SKU, colour, price and stock state everywhere. Formatting differences are not automatically errors, but identity and purchasing facts are.

Test examples, not just templates. Sample a top seller, a sale item, an unavailable option and a product with many combinations. Open the live rendered HTML, validate it in Google’s Rich Results Test and inspect the merchant listing reports in Search Console. A valid result means the syntax is eligible; it does not guarantee a rich result.

A clean implementation sequence

First, repair duplicate and missing identifiers in the catalogue. Second, settle the URL and canonical behaviour for selected options. Third, render ProductGroup and Product data from that same source. Fourth, align Merchant Center items and group IDs. Finally, monitor a fixed sample whenever price, stock or catalogue templates change.

That order matters. If the source record is wrong, adding more destinations only distributes the error faster.

Use the product variant schema audit prompt to review an implementation one family at a time.

Sources

Questions people ask

What is product variant structured data?

It describes a family of products and the options within it. ProductGroup represents the parent family, while Product entries describe purchasable variants such as a particular colour and size.

Does every product variant need its own URL?

Google supports stores where variants share one page and stores where variants have distinct URLs. The important requirement is that each supported variant can be selected, crawled and described consistently.

Should unavailable variants stay in the markup?

A real variant can remain described, but its availability must match the visible page and purchasing experience. Do not mark an unavailable option as in stock.

Related guides

Run your first audit
in about a minute

Free account, no card. Paste your URL and get a real, scored report of your AI and search visibility.

Measuring rankings in