Product Variants: One URL or Many?
Should each product variant get its own URL? A demand-based test for colors, sizes, and materials, plus canonical and ProductGroup schema setup.


Use separate URLs for variants that carry their own search demand — a distinct color, size range, or material people actually type into Google — and keep a single URL with an in-page selector for variants nobody searches for independently, like an internal SKU or a warehouse code. Getting this wrong in either direction either splits your ranking signal across ten thin pages competing for the same query, or buries a genuinely search-worthy variant inside a JavaScript dropdown Google never indexes on its own. The fix is a short test applied per attribute, plus consistent canonical tags and ProductGroup structured data so Google understands how the pages relate no matter which pattern you pick.
Key takeaway
- Give a variant its own URL only when the attribute has independent search demand or its own price, stock level, or imagery worth surfacing separately.
- Collapse variants that differ only in an attribute nobody searches for (internal SKU, minor batch code) into one URL with a selector.
- Whichever pattern you use, self-canonical pages that target real demand and mark the group up with
ProductGroup,hasVariant, andvariesBy. - The most common failure isn’t picking the wrong pattern — it’s mixing both on the same catalog without matching canonical tags to the decision.
How do you decide whether a variant needs its own URL?
Run a simple demand test on each variant attribute before building anything: would a real shopper type this specific attribute into a search box? “Red running shoes” and “waterproof running shoes” are both real queries with their own intent — color and a functional feature that changes the product’s use case. “Size 9 running shoes” almost never is; shoppers search the shoe, then pick a size once they land on the page. Color, material, and gender/fit variants frequently clear this bar because they change what the product visually or functionally is. Size, internal batch numbers, and pack-count variants usually don’t, because the core product hasn’t meaningfully changed from a search perspective — only an order-time detail has.
The second test is inventory reality: does the variant have its own price, its own stock status, or images no other variant shares? A limited-edition colorway that sells out independently of the base product is worth its own indexable page even if search demand for “colorway” alone is thin, because you want that specific SKU’s availability and reviews tracked separately in product schema markup and in Merchant Center. A size that simply toggles a dropdown value with no independent stock tracking doesn’t need that.
| Pattern | Best for | SEO trade-off | Implementation note |
|---|---|---|---|
| Single URL, in-page selector | Size, minor spec differences, low/no independent search demand | Consolidates authority and reviews on one strong page; you lose the ability to rank a specific variant term directly | Selector should update the URL query string or fragment for usability, but the canonical stays on the base URL |
| Separate URL per variant, self-canonical | Color, material, distinct model/edition with real search volume | Each page can rank for its own query and carry its own reviews/stock; more pages to maintain and internally link | Canonical points to itself, not the parent; unique title, meta description, and at least one unique paragraph per variant |
| Separate URL, canonicalized to a primary variant | Near-identical variants kept as separate pages for cart/inventory reasons but with no independent demand | Avoids duplicate-content dilution while still letting the platform track separate SKUs behind the scenes | Pick the highest-demand or best-selling variant as the canonical target and keep it consistent over time |
Setting canonical tags so they match the pattern you chose
The single most common technical mistake on variant-heavy catalogs isn’t choosing the wrong pattern — it’s applying canonical tags that contradict it. If you decided a color variant deserves its own URL because people search for it, that page must self-canonicalize; pointing it back to a “default” color page tells Google to drop the page you just built for that exact query. Conversely, if a size variant only exists as a separate URL because your ecommerce platform forces one, canonicalizing it to the primary size stops it from competing with its own sibling pages for the same non-existent search term. Audit this with a crawler on a sample of variant URLs quarterly — platform updates and app installs are the usual cause when canonical tags drift out of sync with the pattern you originally chose.
ProductGroup, hasVariant, variesBy
Google’s structured data documentation defines a dedicated ProductGroup type specifically so search systems can understand which product pages are variants of the same parent item, using the hasVariant, variesBy, and productGroupID properties — whether the variants live on one page or many.
Source — Google Search Central, Product variant structured data documentation
Using ProductGroup structured data to tie variants together
Regardless of which URL pattern you use, mark up the relationship explicitly rather than relying on Google to infer it from internal links. The rollout looks the same across most platforms:
- Assign every variant a shared
productGroupID— this is the parent SKU or style number that ties the family together, and it does not need to repeat inside each variant’s ownProductblock if it’s declared once at the group level. - Declare which attributes actually vary using
variesBy— typically color and size — so Google knows which properties to expect to differ between the listed variants. - Nest the variants under
hasVariantif they live on one page, or useisVariantOfpointing back to the parent’s@idif each variant has its own URL. - Keep shared attributes — brand, base material, product line description — at the
ProductGrouplevel so you’re not repeating identical text across every variant’s schema block. - Validate with Google’s Rich Results Test on at least one multi-variant page and one single-variant page before rolling the markup out catalog-wide.
This matters beyond rich results. When Google can see that eight color pages belong to one ProductGroup, it’s far less likely to treat near-identical description text across those pages as unintentional duplication — a distinction that matters even more once you’re managing near-identical products at scale.
Common mistakes that split ranking signal across variant pages
The pattern that causes the most damage is generating a unique URL for every possible attribute combination — color times size times pack count — without checking whether any of those combinations carry independent demand. A shirt with 6 colors and 5 sizes doesn’t need 30 URLs; it likely needs 6, one per color, each with a size selector inside it. Every extra URL beyond what search demand justifies is a page competing with its own siblings for the same handful of queries, diluting the internal links and reviews that would otherwise concentrate on fewer, stronger pages. The second common mistake is copying the parent product’s title and description verbatim onto every variant page and changing only the color word — write at least one sentence per variant page that’s genuinely unique, even something as simple as describing how that specific color or finish looks in person, so the page has a reason to exist independently in Google’s eyes.
Frequently asked questions
Should every color variant get its own URL?
Only if the color has independent search demand or its own stock, price, or imagery worth surfacing. High-demand colors on a bestselling item usually qualify; a rarely-picked accent color on a low-traffic product usually doesn’t need a dedicated indexable page.
Does splitting variants into separate URLs hurt my rankings?
Not inherently — it only hurts when the split creates pages competing for the same query with near-identical content and no independent demand. Done deliberately, with unique content and correct canonicals, separate URLs can rank for terms a single consolidated page never would.
What’s the difference between ProductGroup and regular Product schema?
Product describes a single sellable item. ProductGroup sits above it, using hasVariant and variesBy to tell Google that several Product entries are variations of the same underlying item, sharing attributes like brand and base description.
Can I use a JavaScript selector and still let Google index individual variants?
Yes, but only if the selector updates the URL (via a query parameter or separate path) when a variant is chosen, and that URL is crawlable and linked from somewhere on the site — a selector that only changes on-page content without changing the URL leaves those variants unindexable on their own.
How do I fix a catalog that already has duplicate variant URLs?
Start by grouping variants by real search demand using your existing keyword and search-console data, then apply self-canonical tags to the ones worth keeping separate and canonicalize the rest to their best-selling sibling. Add ProductGroup markup as you go rather than waiting for a full catalog rebuild.
Do out-of-stock variants need to stay indexable?
If the variant still has independent search demand and will restock, keep it indexable and clearly marked out of stock rather than removing it — pulling the page loses the ranking history you’ve already built for that exact term.
The bottom line
Variant URL structure isn’t a platform default you inherit and leave alone — it’s a decision that should track real search demand, attribute by attribute, and stay consistent between your URL pattern, your canonical tags, and your structured data. Get the demand test right, keep canonicals aligned with the pattern you chose, and use ProductGroup markup to make the relationship explicit rather than implied. This sits alongside the other structural decisions covered in our ecommerce SEO guide, and it pairs directly with getting the underlying product page SEO fundamentals right first.
If your catalog’s variant structure is fighting itself in search results, our SEO services team can audit it and fix the canonical and schema setup in one pass.