
What are product variants?
Product variants are the sellable versions of one product that differ by an attribute like size, color, material, or capacity. How you expose those variants to search engines decides whether one strong page ranks or whether you shred your authority across dozens of thin, near-duplicate URLs that cannibalize each other.
This is one of the most common places ecommerce sites quietly bleed rankings. The wrong variant architecture inflates your crawl budget, spawns duplicate content, and splits the internal links and backlinks that should be concentrating on a single canonical page.
The three ways to handle variants (and when each wins)
There are really only three structural choices, and every platform ends up doing one of them:
- One canonical URL, on-page selectors. The shopper picks size/color with dropdowns or swatches; the URL never changes (or changes only in a fragment/query that canonicals back to the base). One page absorbs all the ranking signals. This is the default you should reach for.
- Separate indexable URL per variant. Each color/size is its own crawlable, canonicalized page. Only justified when variants have genuine standalone demand — think "iPhone 15 blue" as a real search, or variants with distinct specs, images, and reviews.
- URL parameters that canonical to the parent. Variants live at
?color=blue&size=mbut every parameter URL declares the clean base URL as canonical. Common on Shopify and WooCommerce out of the box.
A concrete example: one URL vs. per-variant URLs
Say you sell a t-shirt in 6 colors and 5 sizes. That's 30 combinations. Handle it wrong and Google can discover 30 crawlable URLs of basically identical copy.
Recommended — single canonical:
https://example.com/products/classic-tee
<link rel="canonical" href="https://example.com/products/classic-tee">
<!-- variant selection stays client-side or as a parameter that self-canonicals -->
https://example.com/products/classic-tee?variant=blue-m
<link rel="canonical" href="https://example.com/products/classic-tee">Only when a variant has real demand — separate self-canonical page:
https://example.com/products/classic-tee-blue
<link rel="canonical" href="https://example.com/products/classic-tee-blue">
<!-- distinct title, images, description, and its own reviews -->The mistake is doing the second one by accident for all 30 combos with copy-pasted descriptions. That's 29 duplicate pages competing with your best one.
Variant handling compared
| Approach | Indexable URLs per product | Duplicate-content risk | Crawl-budget cost | Best for |
|---|---|---|---|---|
| Single canonical, on-page selectors | 1 | Very low | Low | Fashion, most catalogs, variants with no standalone search demand |
| Parameter URLs self-canonicaling to base | 1 (parameters folded in) | Low if canonicals are correct | Medium (params still crawled) | Shopify/Woo defaults, filterable options |
| Separate indexable page per variant | Many | High if descriptions are shared | High | Variants with distinct demand, specs, images, and unique copy |
| Noindex on variant URLs | 1 canonical + noindexed variants | Low | High (still crawled, just not indexed) | Rarely optimal — canonical is usually cleaner than noindex |
How to check variant handling on your own site
- Crawl the site with Screaming Frog. Filter for URLs matching a single product's slug. If one product surfaces 15+ crawlable URLs with matching titles and word counts, your variants are exploding into duplicates.
- Check the canonical tag on a variant URL. Load
?variant=or?color=URLs and view source. Confirm therel="canonical"points to the base product, not to itself (unless the variant is intentionally standalone). - Use Google Search Console's URL Inspection tool on a variant URL. Look at "User-declared canonical" vs. "Google-selected canonical." If they disagree, Google is overriding you and you have a signal problem.
- Search
site:example.com "product name"in Google. Count how many near-identical variant pages are actually indexed. More than one for a product with no variant-level demand means duplication is leaking into the index. - Validate your product feed in Google Merchant Center. Confirm variants are grouped under one
item_group_idso Shopping treats them as one product family, not competing listings.
Common mistakes and how to fix them
- Every size/color gets its own indexed URL with the same description. Fix: consolidate to one canonical product page with on-page selectors, or set variant URLs to canonical to the base.
- Variant URLs canonical to themselves by accident. Shopify's
/products/x?variant=123is fine, but themes that rewrite variants into full slugs can self-canonical each one. Fix: audit the canonical output per variant and point them home. - Out-of-stock variants 404 or redirect. Killing a URL when a size sells out wastes the ranking equity and any backlinks. Fix: keep the page live, mark the variant unavailable, and keep the canonical intact.
- Feed variants aren't grouped. Without a shared
item_group_id, Merchant Center treats your 30 combos as 30 unrelated products. Fix: set the group ID and provide variant attributes (color, size). - Faceted filters generate crawlable variant combinations.
?color=blue&size=m&sort=pricemultiplies infinitely. Fix: canonical, or block low-value parameter combinations from crawling.
FAQ
Should each product variant have its own URL?
Only if the variant has real standalone search demand and genuinely unique content — distinct title, images, specs, and ideally its own reviews. For the vast majority of catalogs, one canonical URL with on-page selectors ranks better because it concentrates all your signals on a single page instead of diluting them.
How do canonical tags fix variant duplication?
A canonical tag tells Google "this variant URL is a version of that master product page — index and credit the master." All the ranking signals from variant URLs consolidate onto the canonical, so you rank one strong page instead of many weak duplicates. See the full canonical tag reference for the mechanics.
Do variants hurt crawl budget?
They can. Every crawlable variant and filter combination is a URL Googlebot may fetch. On a large catalog, uncontrolled variant and facet URLs can consume most of your crawl budget while your genuinely new products wait to be discovered. Canonicalization and parameter control keep it in check.
How should variants appear in my product feed?
Group all variants of a product under one item_group_id and provide the differentiating attributes (color, size, pattern). Shopping surfaces then present them as a single product with selectable options rather than competing listings.
Is noindex a good fix for duplicate variants?
Usually not the best one. Noindex keeps the URL out of the index but Google still crawls it and it doesn't consolidate ranking signals the way a canonical does. Reach for canonicalization first; use noindex only when a URL should never earn equity.
Related terms
Keep going with these ecommerce siblings: Product Page SEO, Product Structured Data, and the deeper field guide on variant handling and product-page SEO.
Claude Vincent is a technical SEO consultant focused on crawlability, rendering, and AI-search visibility. He writes the field guides and case studies at SEO ProCheck, with a bias toward the durable, unglamorous work that decides whether search engines and AI answer engines can actually read and cite a site.
About SEO ProCheck
Technical SEO consulting and GEO strategy with 20 years of enterprise experience. Case studies, resources, and tools for search and AI visibility.
Work With Me
Technical SEO audits, GEO strategy, site migrations, and international SEO. Hourly consulting for teams who need hands-on support, not just reports.







