A product that comes in several colours or sizes forces three decisions that are often made by different people: how many URLs the variants get, which of those URLs is canonical, and how the variants are described in structured data and in the Merchant Center feed. When the three disagree, Google gets mixed signals about which page represents the product, and shoppers can land on a page showing a different colour or price from the one they clicked.
The ecommerce SEO guide covers variants briefly, alongside categories, faceted navigation and product data.
The three ways shops build variant URLs
| Setup | How it works | Verdict |
|---|---|---|
| One URL, variant chosen in the browser | Selecting a colour or size changes the page but not the URL. | Avoid. Google's variant markup expects each variant to be preselectable through a distinct URL,1 and Merchant Center wants a link with the correct variant selected.2 |
| One page, a parameter per variant | The base URL shows the product with nothing preselected. ?colour=green&size=s loads the same page with that variant selected. | Google's single-page model. The base URL is the canonical for the whole group.1 |
| A separate page per variant | Each colour, or each model, has its own page and its own content. | Google's multi-page model. Each page carries full, self-contained markup.1 |
Schema.org defines a ProductGroup as a group of products that vary only in certain well-described ways, such as size, colour or material.3 That definition is a useful test. If two items differ in more than those few dimensions, for example a laptop with a different processor and screen, they are closer to separate products than variants, and the case for separate pages gets stronger.
Most platforms already produce the parameter form. On Shopify, a variant deep link adds ?variant= and the variant's ID to the product URL, and a product can have at most three options, with each combination of option values being one variant.4 What the platform does with the canonical on those URLs is the part to check in your theme.
Deciding between one page and many
I default to one page per product group with parameter URLs for the variants. It concentrates links and reviews on one URL, it keeps the number of indexable pages down, and it matches how most shoppers search, which is for the product and then for a size. I move a dimension to separate pages only when both of these hold:
- People search for the variant by name. A colour that appears in searches ("green wool coat") or a model size with its own name may qualify. A clothing size almost never does.
- The page would differ in ways that matter to a shopper: different photos, specifications, description or price.
A mixed setup is common and fine. A coat might get one page per colour, because colours are searched and photographed differently, with sizes selected by parameter within each colour page. Decide this per dimension, and write it down, because the canonical, markup and feed rules all follow from it.
Category listings raise the same question from the other side. Baymard Institute's 2025 product list benchmark, which scored more than 170 leading ecommerce sites in the US and Europe, found 42% did not combine a product's variations into one list item. Its research treats combining them as the way to help shoppers judge the range and find the variation they want.5 One listing tile per product group, linking to the base URL, also fits the single-page model and sends internal links to the canonical.
Canonicals for each setup
For a single-page setup, there must be only one distinct canonical URL for the whole product group, and the example given is the base URL with no variant selected.1 Every parameter URL for a variant should carry a rel="canonical" pointing at that base URL.
For a multi-page setup, the single-canonical requirement does not apply, because no single URL represents the group.1 The documentation does not spell out the canonical for each variant page. My approach is that every variant page you want indexed canonicalises to itself. Pointing a colour page's canonical at a different colour tells Google you do not want the first page in the index, which defeats the point of building it.
Whichever setup you use, keep the signals consistent. Redirects and rel="canonical" are strong canonical signals and sitemap inclusion is a weak one, and different canonical URLs should not be specified for the same page using different methods.6 In practice that means the sitemap lists the canonical URLs only, internal links from category pages point at the canonical URLs, and the feed's canonical_link (covered below) agrees with the page.
Put the canonical in the server-rendered HTML and leave it alone when a shopper picks a variant. The HTTP Archive's 2025 Web Almanac found that rendering changed the canonical on 3.02% of mobile sites in its crawl.7 A variant picker that rewrites the canonical in JavaScript is one easy way to join them.
ProductGroup markup, field by field
Google's variant markup uses a ProductGroup for the shared product and a Product for each variant. The group needs a name, and the recommended properties include productGroupID (the parent SKU), variesBy to list the dimensions that change, and hasVariant to nest the variants, along with properties such as brand and description.1 variesBy takes schema.org property URLs such as colour, size, material, pattern, suggested age and suggested gender.1
This markup makes products eligible to show variant information in merchant listing experiences.1 Product rich results support pages focused on a single product or on several variants of the same product,8 which is why a variant page that drifts into listing unrelated products causes problems.
How the same decisions show up in Merchant Center
Merchant Center has its own variant model, and it maps closely onto the markup. The item_group_id attribute is required for free listings with product variants, and for Shopping ads for variants in several countries including the United Kingdom and the United States.9 The parent SKU is the recommended value. Keep it stable once assigned, and do not submit one at all for products that are not variants.9
Other product feeds use the same model, so one well-kept parent SKU serves all of them. In Microsoft Merchant Center, itemGroupId groups the variants of a product, typically items that vary by colour, material, pattern or size, and must be unique within a catalogue and no longer than 50 characters.10 OpenAI's product feed for ChatGPT uses a group_id shared by all variants, with one row per variant carrying its own price, availability, URL and images.11
| On the page | In the feed | What has to agree |
|---|---|---|
productGroupID on the ProductGroup | item_group_id on every variant | Same parent SKU value |
sku or gtin on each variant | id (and gtin) per item | One unique ID per variant |
| The URL that loads a variant preselected | link | A link to the landing page with the correct variant selected.2 |
rel="canonical" | canonical_link | The base URL with no variant preselected12 |
| Colour, size and other varying attributes | color, size, material and so on | All the standard variant attributes, with landing page details that match the submitted values.9 |
The two link attributes are the part most often confused. Merchant Center's link should take the shopper to the exact variant, for example ?color=red.2 Its canonical_link attribute tells Google which URL to use when matching the product to the Search index. Use it when your links contain tracking or variant parameters. It should have no preselected variants, and the help page's example has two dress variants sharing one base URL.12 It is optional: if the landing page already declares a canonical, you do not need to submit it, and if the two differ, Google chooses using its own signals.12
On a multi-page setup, the feed still groups the variants under one item_group_id, and each item's link and canonical_link would normally both be its own variant page. Grouping in the feed and separate canonical pages on the site are compatible.
Mismatches to check for
- A variant link that loads the default colour, so the shopper sees a different product from the one in the ad or listing. Merchant Center asks that the landing page details match the submitted title, colour, price, availability and image.9
- Variant parameter URLs blocked by a robots.txt rule written for category filters.
- A
productGroupIDon the page that differs from the feed'sitem_group_id, often because one system uses the parent SKU and the other an internal product ID. - Bundles and multipacks grouped as variants. Item group IDs are only for products that are variants.9
- A feed
linkthat redirects. Microsoft Merchant Center says the URL may not be redirected,10 so point every feed at the final variant URL, not a tracking or legacy address. - Colour pages built for search that canonicalise back to a parent page, so none of them can be indexed.
- A sitemap that lists every variant parameter URL on a single-page setup, which sends a weak signal against the canonical you declared.
Variant URLs and filter URLs often share parameter names, so decide both together. The method for choosing which filtered pages to index is in the post on faceted navigation.
Common questions
01Should each product colour have its own page?
02What should the canonical be on a variant URL like ?size=m?
03Is item_group_id required in Merchant Center?
04Should the Merchant Center link point at the base product or the variant?
05Do I need both ProductGroup markup and an item_group_id?
Sources
- Platform docs9
- Regulator1
- Industry study2
- 01Product Variant Structured Data (ProductGroup, Product)Google Search CentralPlatform docs
- 02Link [link]Google Merchant Center HelpPlatform docs
- 03ProductGroupSchema.orgRegulator
- 04Support product variantsShopifyPlatform docs
- 05Product List UX Best Practices 2025Baymard InstituteIndustry study
- 06How to specify a canonical with rel="canonical" and other methodsGoogle Search CentralPlatform docs
- 07SEO: 2025 Web AlmanacHTTP ArchiveIndustry study
- 08How to add merchant listing structured dataGoogle Search CentralPlatform docs
- 09Item group ID [item_group_id]Google Merchant Center HelpPlatform docs
- 10Products Resource (Microsoft Merchant Center Content API)Microsoft AdvertisingPlatform docs
- 11Products: Agentic CommerceOpenAI DevelopersPlatform docs
- 12Google Search index link [canonical_link]Google Merchant Center HelpPlatform docs
Written by Mani Bharij, SEO & AI Search Consultant in London. More on this subject in the Ecommerce SEO guide.