
Geez. A few days ago in Berlin a developer pestered me for advice after she had expended hours writing in useless ProductGroup Schema into a Shopify store for her client. Three days prior she had published the client’s store with said Schema. A week later Google search results still show “blue shirt” etc. in the search results snippet and the developer (new to all this) was convinced she had error’d the JSON-LD. Ah, no. So very wrong. Google does nothing it says it will here.
The product schema for grouped products is one of those SEO topics where the theory and reality diverge hard. This post explains the schema types, what Google actually understands and how to productively apply product schema on a real Shopify store that has separate color products grouped together.
In this post
- The three schema types
- ProductGroup explained
- Product vs ProductModel vs Variant
- What Google actually reads
- Rich snippets and price ranges
- Shopify implementation
- FAQ
The three schema types that matter
| Type | Use for | Google support |
|---|---|---|
Product | Any standalone product page | Full (rich results) |
ProductGroup | The parent of a set of variants | Partial |
hasVariant on Product | Expressing variants within a product | Full |
ProductGroup explained
ProductGroup Schema.org defines “ProductGroup” as “a class of things , where an instance of the class is called a ‘product’.” Essentially this is a way to define a family of related products that share identity. The schema.org type has a productGroupID (your SKU family) and a variesBy array (in this case color, size and material) and a hasVariant array that lists each individual variant product.
This would be super useful for Shopify stores that list different colors as separate products, but then want to have a single canonical product page that lists all colors (e.g. instead of having separate blue, green, and black products for your sock, just have one product with those variants). It would allow each color to be a Product, and for all of them to be contained in a single ProductGroup, and would generally keep everything organized and canonical.
Note that Google supports ProductGroup as a hint and appears to honor it based on the markup on the page giving the signal that a set of products are related to each other. However, they do NOT magically display information such as “available in 6 colors” based on this signal. Their documentation on the subject is vague at best.
Product vs ProductModel vs Variant
Schema.org introduced three related types: Product (something you sell), ProductModel (an abstract product definition, e.g., “kanguru jumpies” without size/color) and a new one: ProductGroup (a grouping relation). Another type that was introduced for e-commerce use and now superseded by ProductGroup is ProductModel. Use ProductGroup.
Note that for variants inside of a Product, you would use hasVariant with a nested Product object, with each one having its own SKU, color, size, etc. Google can then display per-variant pricing in rich results for simple enough products (1 product with many sizes, for example).
What Google actually reads (and ignores)
What actually gets reported in the Search Console rich results report for real operating Shopify stores:
- Product price: read and shown in snippet
- Availability: read and shown
- AggregateRating: read and shown (if you have real reviews)
- Review count: read and shown
- Price range (low + high): read, sometimes shown
- ProductGroup parent: read as signal, rarely surfaced visually
- variesBy array: read, mostly ignored in SERP
First ship all products with correct Product schema for each color URL. Then add ProductGroup as an additional organizational signal, but don’t expect just ProductGroup to render visible snippets for you.
Rich snippets, price ranges, rating aggregation
Three results actually show up in real Shopify SERPs when the schema is right:
- Star rating with review count. Needs AggregateRating with valid ratingValue and reviewCount from real reviews.
- Price with availability. Needs Offer with price, priceCurrency, and availability.
- Price range. Needs AggregateOffer with lowPrice and highPrice. Useful for grouped products where prices differ by color.
For grouped products, AggregateOffer provides the same functionality as Google showing a price range for the group without needing a ProductGroup class. Simple, correct.
Shopify implementation
Most Shopify themes come with the Product schema by default. Most basic implementations though are quite limited. The default Product schema from themes like Dawn, Horizon, and most Online Store 2.0 themes will include the price and availability, but will not include the ProductGroup or hasVariant properties for linked products.
Three ways to add grouped-product schema:
- Theme edit: add a snippet that loops your metafield-linked products and outputs
hasVariantorisVariantOfJSON-LD. Requires Liquid fluency. - SEO app: many SEO apps inject structured data. Quality varies wildly.
- Use our generator: try our schema generator tool to build correct JSON-LD and paste it into a theme custom liquid block.

If you’re already using Rubik Combined Listings to group products, the group membership is stored in metafield references. This means that the group members can be easily looped in a theme’s Liquid to emit the JSON-LD for ProductGroup/hasVariant without having to have the grouping information stored elsewhere. Grouping products and schema fields line up pretty nicely.
Rubik Variant Images also supports correct variant-image schema on product pages, where each color/image combination is assigned to the corresponding SKU main image.
See it work
See the live demo store, watch the tutorial video, or read the getting started guide.
FAQ
Does Google support ProductGroup schema?
Partially. Google looks at ProductGroup as a relation signal but rarely displays it. The standard Product schema and the AggregateOffer schema are powerful enough to cover most of the use cases that can be displayed in rich results.
Should every variant get its own Product schema?
If each variant has its own URL (separate products per color), then that means each URL will have its own Product JSON-LD with its own offer and rating.
What is AggregateOffer and when should I use it?
AggregateOffer classes express a range of prices for a product across multiple offers. Use this class when (grouped) products have different prices per color or size and you want Google to show a range of prices in the search results instead of individual prices.
Can I aggregate reviews across a product group?
Yes you can use AggregateRating at the group level. However in practice Google suggests showing ratings per product, on the URL that will appear in the search results, and in general users find it more useful to see ratings for each individual item rather than an aggregate for a group. Use an AggregateRating only if all the reviews for the group actually cover the entire group.
Does Shopify output ProductGroup schema by default?
Since Default Shopify themes only output Product schema, ProductGroup requires theme editing or an app that inserts more structured data.
How do I test my Product schema?
Use Google’s Rich Results Test and Search Console’s (SC) rich results report to highlight missing required fields and identify any incorrect values.





