Variants often create near-duplicate URLs for the same item. Choose one page with variant selection and a single canonical, or separate URLs when demand and unique content justify them. Never canonicalize a variant to a different product, and keep the base URL stable across site and feed.
One product page, or one self-canonical page per variant.
Intent intent heading schema report page effort effort heading link verify audit serp audit caching markup redirect audit target signal measure audit schema audit serp measure.
Render priority schema breadcrumb page measure crawler canonical intent query markup section heading markup signal render layout verify metadata layout page anchor breadcrumb index effort target.
Alt cluster report snippet markup alt redirect markup intent cluster redirect route signal locale section content image heading layout signal heading query layout template route alt.
Get the full breakdown
The extended brief explains when this works, when it does not, and the trade-offs. Join the waitlist and it unlocks for every tip when sign-in opens; MCP access is the paid part.
List every product and its variant URLs. Identify which variants have unique content, demand or inventory differences that justify a page.
Check: The inventory shows each variant URL, its traffic and whether it has unique content.
Consolidate or self-canonicalize
For consolidated products, canonicalize variants to the base URL and keep selection in the UI. For separate pages, self-canonicalize and write distinct titles and copy.
Check: No variant canonicalizes to a different product, and each retained variant page self-canonicalizes.
Align feeds and markup
Use the same base URL in the sitemap, Merchant Center feed and ads. Add ProductGroup with hasVariant for consolidated products.
Check: Feed, sitemap and canonical agree for ten sampled products.
Variant URLs use `?variant=` by default and resolve to the product canonical; keep that behavior and do not create separate pages per variant without unique content.
nextjs-app
Use one dynamic product route and set `alternates.canonical` to the base product path regardless of the selected variant parameter.