Product Structured Data
ProductGroup & Variants Schema Markup
If your product comes in multiple colours, sizes, or materials, ProductGroup structured data is the right choice. It groups all variants under one parent entity, allowing Google to show colour swatches, size options, and variant-specific pricing directly in Shopping results.
Generate Product Variants Schema FreeSingle product, no variants? Use Product Snippet schema instead.
Product Variants in Google Shopping
Popular products
🧥
★★★★☆
+more
🧥
★★★★★
+more
Colour swatches
Variant pricing
Per-variant stock
Size options
What Product Variants schema unlocks
Colour swatches in Shopping
Google shows colour dots on the Shopping card — shoppers filter by colour before clicking through.
Variant-specific pricing
Each variant shows its own price and availability — sold-out variants and price ranges display correctly.
Reduced duplicate markup
Shared attributes (brand, description, pattern) live on the ProductGroup — variants only specify what differs.
Apparel, footwear, furniture and more
Any product with selectable options — colour, size, material, pattern — benefits from ProductGroup schema.
Key properties for Product Variants schema
ProductGroup holds shared attributes. Each variant is a Product nested inside hasVariant — or linked back via isVariantOf in flat mode.
| Property | Level | Status | Notes |
|---|---|---|---|
| name | Group | Required | Product family name (e.g. "Wool Winter Coat"). |
| url | Group | Required | Canonical URL for the product family page. |
| variesBy | Group | Required | Dimensions that vary. Use schema.org URIs: color, size, material, pattern, suggestedAge, suggestedGender. |
| hasVariant | Group | Required | Array of Product objects, one per variant. |
| productGroupID | Group | Recommended | Your unique identifier for this group. |
| image | Group | Recommended | Hero image for the product family. |
| aggregateRating | Group | Recommended | Group-level rating. Applies across all variants. |
| name | Variant | Required | Variant-specific name (e.g. "Wool Coat — Red, M"). |
| offers | Variant | Required | Price, currency, and availability for this variant. |
| color / size | Variant | Recommended | The attribute values that differentiate this variant. |
| url | Variant | Recommended | URL for this specific variant, if one exists. |
| image | Variant | Recommended | Image of this specific variant. |
| sku / gtin13 | Variant | Recommended | Variant-level identifiers for Shopping matching. |
Frequently asked questions
No. ProductGroup schema supports both a single page with all variants selectable and separate pages per variant. For separate pages, each variant Product should have its own url property. For a single page, the ProductGroup and all variants can share the same URL.
Google officially supports these URIs: https://schema.org/color, https://schema.org/size, https://schema.org/suggestedAge, https://schema.org/suggestedGender, https://schema.org/material, and https://schema.org/pattern. Other text values are accepted but may not trigger Shopping swatches.
In nested structure, variant Products sit inside ProductGroup via hasVariant. In flat structure, the ProductGroup and each variant Product are separate JSON-LD objects, with each variant linking back via isVariantOf. Both are valid — our generator supports both with a toggle.
Yes. Add ProductGroup JSON-LD to your product.liquid template. Each Shopify variant maps to a Product object inside hasVariant. Use the variant URL (with ?variant= parameter) as the url for each variant, and the main product URL for the ProductGroup.
Google recommends placing aggregateRating at the ProductGroup level when the rating applies to the product as a whole. Only add variant-level ratings if individual variants have genuinely distinct review sets — which is rare.
Also in this series
Generate valid Product Variants schema
Add variants, choose nested or flat output, and get clean JSON-LD in seconds. No account needed.