Shopify SEO. Catalogue architecture
Shopify Variants vs Separate Products: Which One Ranks, and How to Switch
Written by Ram Kr Shukla
Quick answer
Use variants of one product when the versions differ only by colour, shade or size and nobody searches for each one by name. Use separate products when the versions are genuinely different products (formula, function, compatible model, price tier) or each has search demand you can measure. If separate products have to stay, give each a title and copy about its own version, let the collection page own the generic category term, and canonicalise only versions with no demand of their own. Shopify’s ?variant= URLs canonicalise to the clean product URL on standard themes, so variants don’t create duplicate pages by themselves.
Every Shopify store answers this question the day it loads its catalogue, and usually nobody notices it’s an SEO question. Someone adds a lip product in 12 colours. They can create one product with 12 variants, or 12 products. Both work at checkout. Google treats them very differently.
This is the decision part of my Shopify SEO work, with the numbers from one store that picked separate products for every shade and paid for it in search. It goes much deeper on one trap than my overview of the duplicate content Shopify creates by default. If you want the general method for spotting pages that compete, that’s in the keyword cannibalisation guide. Here it’s only catalogue architecture: variants, separate products, Combined Listings, variant URLs, and how to move from one setup to the other.
What Shopify Actually Does With Each Choice
Start with the mechanics. Half the advice online gets them wrong.
One product with variants
You get one product handle, so one URL: /products/your-product. When a shopper picks a colour, the theme adds a parameter, so the address becomes /products/your-product?variant=40123456789. That parameter preselects the option and tells the cart what to add. It isn’t a new page.
The canonical tag on that parameter URL points back to the clean product URL. I checked it on Shopify’s own Dawn demo store: a ?variant= URL, and the same product reached through a /collections/all/products/ path, both carry a canonical to the plain /products/ URL. That’s the theme’s canonical_url Liquid object doing its job. At least one guide ranking for this topic says variant URLs canonicalise to themselves. On a standard theme they don’t. A heavily customised theme can break it, so view the source of one of yours and check.
Limits matter if you’re merging a big family. Shopify’s help page on adding variants allows up to 2,048 variants and three options per product, 250 media items per product, and one media item per variant. The same page warns that some third-party themes don’t support more than 100 variants. One ranking guide still says 100 for standard plans and 2,048 only for Plus. That’s out of date.
Separate products
Each version gets its own handle, URL, title tag, meta description, H1, Product structured data and a canonical pointing at itself. Google sees 12 pages that are all allowed to rank. That’s the attraction. The cost: those 12 pages usually share almost all their copy, and they all chase the same generic term.
What It Looked Like on One Store I Audited
One Indian cosmetics store on Shopify, a D2C beauty brand, sold a complexion product in 19 shades. Each shade was its own Shopify product with its own handle and a self-referencing canonical. The copy was close to identical. Two of the shade pages ran 2,866 and 2,898 words, and most of the difference was the shade name.
I pulled Search Console for the trailing 28 days, India only, non-brand queries. For that product’s category head term, 33 of the store’s URLs picked up impressions. Together: 26,390 impressions and 9 clicks. The top six URLs were all shades of the same product. The collection page, the one page built to answer a generic category search, got 152 of those impressions. Under 1%.
The other families had the same shape. A highlighter sold as 4 separate products: 15,146 impressions at a 0.13% click-through rate. Another family of 8: 951 impressions, zero clicks. On one generic category query, Google picked a single shade page to show, a fair skin tone shade, and it collected 7,457 impressions. Zero clicks. Most people typing a generic term don’t want that one shade, so they scroll past it.
Then the handles. One product family had 22 distinct handles live at the same time. An older handle and a newer one carrying a shade code were often both serving the same shade, and the medium shade alone was live on four. Each duplicate split the signal again.
Two more details changed how I’d plan a fix. The single strongest product URL on the whole site was one shade page: 46,173 impressions and 1,116 clicks, because that shade suits a lot of searchers. And 91 parameter URLs were showing in search with 15,668 impressions between them, including one ?variant= URL on a shade page that took 6,881 impressions by itself. Search Console generally reports a result under the URL Google treats as canonical, so on that URL Google had gone its own way. Google’s duplicate URL documentation lists a canonical tag as a strong signal, and that leaves Google room to choose another URL.
None of this gets fixed by rewriting 19 shade descriptions. It’s a URL architecture problem, not a copy problem.
Why Separate Products Hurt the Head Term
For a generic query Google wants one best answer from your site. Hand it 19 near-identical product pages plus a collection page and it hedges. It rotates between shades, spreads links and click data across them, and none of them climbs to where people actually click. The collection, which should own a category term, gets drowned out by its own products.
Shade pages are also weak answers to generic searches. A shade is a choice the searcher hasn’t made yet. Show them one specific shade and most of them decide it’s the wrong result, which is exactly what 7,457 impressions and zero clicks look like.
And every version page needs its own title, its own copy, and its own upkeep. On the same store, product title tags were cut off at 70 characters and the part that disappeared was the shade name, so 19 results looked the same on the results page. That one has its own write-up: fixing truncated Shopify title tags.
The Decision Framework: Three Questions
Run each product family through these in order. With Search Console open it takes a few minutes a family.
For the store above the answers were plain. Same formula across all 19 shades, so question one is no. A few shades had searched names and most didn’t. The merchandising need was swatches on the collection page. That’s one product with 19 variants, the collection page owning the category term, and the product page owning product plus shade searches through a shade guide written in text.
How common catalogue cases usually land
These are general patterns, and the three questions overrule them whenever your data says otherwise.
- Shades of one foundation or complexion formula: variants. Split out a shade only if it’s famous enough to have big search demand of its own.
- Lip product colours: variants by default. Named shades that people search for get named prominently on the product page first.
- Apparel colours and sizes: variants. Sizes almost never have separate demand.
- Pack sizes and bundles of the same item: variants.
- Scents or flavours with different ingredients: it depends on demand. Different ingredients and different reviews push toward separate products.
- Accessories made for a specific device model: usually separate products, because people search by model.
If Separate Products Have to Stay
Sometimes they will. The inventory system expects one SKU per product, a marketplace connector breaks on variants, or nobody wants a migration before the festive season. You can still limit the damage.
If you want a structured way to find which families on your store compete for the same query before you touch anything, the method in identifying cannibalisation in Search Console works on product URLs too.
Shopify Plus Combined Listings: What It Does for SEO
Combined Listings is Shopify’s answer to this exact trade-off, and it’s only on Plus. Here’s how Shopify’s Combined Listings help page and developer documentation describe it:
- A parent product groups existing child products. Each child is a full product, typically one per colour or material, and on the storefront the children display as if they were variants of the parent.
- Children keep their own images and URL handles, and can carry their own title and description.
- The parent can’t be purchased and has no inventory or sales data. It starts in Draft, and you can set it to Active or Unlisted.
- Limits: up to 60 child products and three options per parent. The help page puts the variant ceiling at 2,048 across all children; the developer page says 2,000.
- Free Shopify themes need version 15.0.0 or later. Other themes need custom code. It doesn’t work with product bundles or subscriptions.
The SEO consequence is the part most write-ups skip. Combined Listings doesn’t merge URLs. Every child is still its own product URL that can rank and compete. What changes is the shopper’s experience: one product page with a selector, and per Shopify’s theme documentation the UI updates to the child’s price, images and description when the buyer changes the option. Neither the help page nor the developer docs say what canonical a child or the parent outputs. Check your own theme’s source before you assume anything.
So Combined Listings fits a family where each version has real search demand of its own (question two is yes) and you still want one buying experience. It doesn’t fix a head-term split by itself. On the 19-shade store it would have kept 19 competing URLs and tidied the interface. The collection page would still need to own the generic term.
One more thing. If you set the parent to Active, it’s another URL. Decide what it’s for. If it’s the page you want ranking for the product name, the children shouldn’t all lead their titles with that same name.
Variant URLs: How ?variant= Behaves in Search
Google’s guidance lines up with Shopify’s default. Its e-commerce URL structure page asks that each variant can be identified by a separate URL, either a path segment or a query parameter, and says that if you use optional query parameters, the URL without them should be the canonical. That’s what Dawn does.
What that gives you: one indexed page per product, a shareable link that opens on the right shade, and any links to a variant URL consolidating on the parent. What it won’t do on its own is rank the page for each version’s name. The page has to mention every version in visible text. A selector made only of swatch images gives Google nothing to match.
Three practical rules. Don’t block ?variant= in robots.txt, because Google has to crawl a URL to see its canonical. Link to the clean product URL internally. And mark up the family: Google’s product variant structured data supports ProductGroup with hasVariant and variesBy on a single page, one canonical URL for the whole group, and query parameter URLs that preselect each variant. The wider approach is in my piece on structured data at scale.
Then keep an eye on it. In Search Console, filter the Pages report to URLs containing ?variant=. A handful is normal. A ?variant= URL with thousands of impressions means Google picked it over your canonical, usually because it’s the URL everyone links to.
How to Migrate From Separate Products to Variants Without Losing Rankings
This is where stores get hurt. Shopify has no button that merges products, so a migration really means: build the new product, move everything that matters onto it, retire the old ones, redirect. Do it outside your peak sales weeks. If you’re redirecting at scale across a catalogue, read how to redirect thousands of URLs without losing traffic first, and for the URL map on a large store, crawl Shopify without 429 errors.
Shopify’s URL redirect documentation is where the 404 rule comes from, and it also covers the CSV import. Stores can hold up to 100,000 redirects, or 20 million on Plus, so the limit won’t be your problem. Forgetting the older handles will.
After launch, make every internal link point at the final URL rather than relying on the redirect. My notes on internal linking architecture cover how to route authority to the pages you want ranking.
When Splitting Variants Into Separate Products Is Right
The reverse move is sometimes the correct one. If a variant is really a different product (a different formula, a different compatible model), or one version has standalone demand big enough to justify its own page, split it out. Write that page as its own product with its own copy. Keep the rest of the family as variants.
Whichever way you go, the generic category term belongs to the collection. In my fashion Shopify case study, the store had 200,000+ URLs indexed at the start, and collection pages ended up carrying 70%+ of organic revenue. Product pages are for product searches. For the product page itself, the 12 product page elements still apply, and if filters are creating more duplicates on top of this, see faceted navigation SEO.
Shopify Variants vs Separate Products: FAQ
Is it better for SEO to use variants or separate products on Shopify?
For most stores, variants. If the versions differ only by colour, shade or size and nobody searches for each one by name, one product with variants concentrates links, reviews and clicks on one URL. Separate products make sense when the versions are genuinely different products or each has measurable search demand of its own.
Does Google index Shopify ?variant= URLs?
It can, but it usually shouldn’t need to. Standard Shopify themes output a canonical on ?variant= URLs pointing to the clean product URL. Google can still choose a different URL, so a heavily linked variant URL sometimes shows in results. Linking to the clean URL internally keeps it rare.
Do Shopify variants have their own URLs?
Only as a parameter on the product URL, like /products/name?variant=123. They don’t get their own handle, title tag or meta description. If a version needs those, it has to be a separate product, or a child product in Combined Listings on Shopify Plus.
What is Shopify Combined Listings and is it good for SEO?
It’s a Shopify Plus app that groups separate child products under one parent so they display like variants. Each child keeps its own URL handle, so it suits families where each version has search demand of its own. It doesn’t merge URLs, so it won’t fix a head term split across versions by itself.
Should I canonicalise separate colour products to one main product?
Only for versions with no search demand of their own. A cross-product canonical folds the page into the main product, so it stops ranking for its own colour or shade. If shoppers search the version by name, keep it self-canonical and make its title and copy specific to that version.
How do I merge separate Shopify products into one product with variants?
Build a new product with an option for the version and one variant per old product, carrying over SKUs, stock and images. Move the reviews, archive the old products so their URLs return a 404, then add 301 redirects to the new product. Finally update internal links, menus and feeds.
Will I lose rankings if I merge products into variants?
Expect some movement for a few weeks while Google processes the redirects. You keep most of the value when every old URL redirects to the merged page, the strongest URL survives, reviews come across and internal links are updated. The point of the merge is that one page then holds the head term.
How many variants can a Shopify product have?
Up to 2,048 variants and three options per product, according to Shopify’s help centre. Some third-party themes don’t support more than 100 variants, so check your theme before you merge a large family into one product.
Not sure how your catalogue is set up?
I map every product family against its search data and tell you which ones to merge, split or leave alone, with the redirect map to do it.
Shopify SEOGet an SEO auditTags: Shopify SEOProduct VariantsE-commerce SEOTechnical SEO
Written by Ram Kr Shukla
SEO and growth consultant and Fractional Chief Digital Officer with 20+ years in SEO and growth across 50+ brands, from global marketplaces to D2C stores on Shopify. Google Analytics and Google Ads certified. Works daily in Search Console, GA4 and Screaming Frog on catalogue and URL architecture problems like this one.




