Where Shopify creates duplicate URLs
Shopify publishes the same product or collection at more than one address in a handful of predictable places. Most of them come from how themes link to products, not from anything you did.
- Products inside collections. A product at
/products/linen-shirtcan also load at/collections/shirts/products/linen-shirt. Shopify's own Liquid docs warn that these two pages have the same content on separate URLs. - Variant links. Picking a colour or size adds
?variant=plus a long ID to the product URL. In filtered collections and search results, Shopify adds that parameter to product links on its own, pointing at the most relevant variant. - Sorted and filtered collections. Sorting adds
sort_by, and storefront filters add parameters likefilter.v.option.color=redorfilter.p.vendor=. Each combination is a new URL showing the same products. - Tag-filtered collections. Filtering a collection by product tag creates its own URLs through the
filter.p.tagparameter, and combined-tag URLs join tags with a+. - Paginated collections.
?page=2,?page=3and so on. - Vendor, type and search pages. Theme links to a vendor or product type open automatic lists like
/collections/vendors?q=…and/collections/types?q=…, and every search creates a/search?q=page. - Markets and languages. Subfolders like
/fr-ca/or/en-eu/give each product a version per market. - Products you duplicated yourself. One shirt created as five products, one per colour, each with the same description.
That list looks alarming. Most of it isn't.
What Shopify's default canonical tags already handle
Shopify adds a canonical tag to every page, and on a standard theme it already points the common duplicates back to one main URL. Its help center says auto-generated canonical tags are added to stop duplicate content showing in search results.
A check of Shopify's Dawn demo store on October 13, 2026 found the following behavior. Check your own theme before assuming it behaves the same way.
- The tested collection-scoped product URL,
/collections/all/products/puff-olive-leaf, redirected to/products/puff-olive-leaf. The destination declared the clean product URL as its canonical. - A
?variant=URL declares the clean product URL as its canonical. That matches Google's ecommerce advice to use the URL without the optional parameter as the canonical. - Sorted and filtered collection URLs declare the plain collection URL.
- Page 2 of a collection declares itself. That's correct too. Google says not to use the first page of a paginated series as the canonical for the rest.
Shopify's default robots.txt also keeps crawlers out of sorted collection URLs and combined-tag URLs (/collections/*+*), and the demo store's robots.txt checked on the same date blocks URLs with two or more filter parameters as well. Markets get their own handling. Shopify says canonical URLs and hreflang tags are set automatically from your market and language settings, so /fr-ca/ pages are treated as related versions of the same page.
A canonical tag is one signal, not a complete fix. Check for these problems as well.
- separate products you created for each colour or size (each one is its own canonical),
- a custom theme or app that edited or removed the canonical line in
theme.liquid, - internal links that keep pointing at the non-canonical version,
- a page you hid with Unlisted or noindex that was the one earning traffic.
And Google treats a canonical as a hint. Its documentation says your stated preference is "a hint, not a rule," so it can pick a different URL if your other signals disagree.
How to check which version Google picked
Use URL Inspection in Search Console on the product or collection you care about, and compare two lines in the indexing section. User-declared canonical is what your theme says. Google-selected canonical is what Google actually chose. If they match, you're done with that page.
One catch. The live test can't tell you which URL Google will treat as canonical, because Google's help says canonical selection comes from indexed data only. Go by the indexed result.
Then open the Pages report and read the reason labels before reacting to them. Google's Page indexing report help defines each one.
- Alternate page with proper canonical tag. Google's description says there is nothing you need to do. On Shopify this is usually your collection-aware product URLs and variant URLs, and a big number here is a sign the default canonicals work.
- Duplicate without user-selected canonical. Google calls this working as intended. Inspect a few examples and check that Google picked the URL you'd want ranked. If it did, leave it.
- Duplicate, Google chose different canonical than user. This is the one to read closely. Google decided another URL is the better canonical than the one your page declares. Inspect it and see which page won and why.
- URL marked 'noindex'. Fine for pages you meant to hide. A problem if a product you sell is on the list.
To see what your own theme declares, open any product in a browser, view the page source and search for rel="canonical".
Which duplicates matter and which to ignore
Most Shopify duplicates need no work. A few cost real traffic. This is the table I use to sort them.
| Duplicate type | What you'll usually see | Act? |
|---|---|---|
Product inside a collection (/collections/x/products/y) | Alternate page with proper canonical tag | Ignore, unless your theme links to it everywhere. Then fix the links. |
?variant= URLs | Alternate page with proper canonical tag | Ignore |
| Sorted and filtered collections | Blocked by robots.txt, or canonical to the plain collection | Ignore |
| Paginated collections | Each page canonical to itself | Ignore. Don't point page 2 at page 1. |
| Markets and language subfolders | Separate versions joined by hreflang | Ignore, as long as automatic hreflang stays on |
| Separate products for each colour or size | Near-identical pages competing, or Google choosing a different canonical | Act. Merge or make them distinct. |
| Canonical tag missing or edited by a theme or app | Duplicates without user-selected canonical on product URLs | Act. Restore the tag. |
| Best-selling product set to Unlisted or noindex | URL marked noindex on a page that should rank | Act first. This one costs the most. |
If you only have time for one row, take the last one.
Fix the theme links before anything else
When a collection page links to /collections/x/products/y, the theme is sending crawlers and shoppers to the duplicate and asking the canonical tag to clean up afterwards. Pointing those links at /products/y is the cheapest fix on this page. Google's guidance on duplicate URLs says linking to the URL you consider canonical helps it understand your preference.
The usual cause is one Liquid filter. Shopify's within filter takes a product URL and builds the collection version of it, so {{ product.url | within: collection }} outputs /collections/sale/products/…. Shopify's docs tell you to consider the SEO implications before you use it.
- Open your theme code and search the snippets and sections for
within. - Where it's used on a product link, remove
| within: collectionso the link prints the plain product URL. - Check a collection page afterwards and hover a product. The link should read
/products/….
Shopify's current Dawn theme already links product cards with the plain product URL and doesn't use within in its product card. You'll find it more often in older themes and heavily customised ones. Make the change on a duplicate theme first, preview it, then publish.
While you're in the code, check that theme.liquid still prints the canonical tag. In Dawn it's a single line, <link rel="canonical" href="{{ canonical_url }}">. A missing or invalid canonical can leave Google without a declared preference. A valid tag pointing to the wrong URL can create a different problem. Check the actual tag and the indexed URL Inspection result before changing the theme. I'd check this before touching anything else on the list.
When noindex helps and when it backfires
Noindex is right for pages nobody should find in Google, like a wholesale order form or a thank-you page. It's the wrong tool for duplicates of pages you sell from. Google's own advice is not to use noindex to pick a canonical within your site, because it removes the page from Search completely.
On Shopify, noindex often arrives without anyone typing a tag. Setting a product to Unlisted adds a noindex,nofollow robots tag to the product page and takes it out of sitemap.xml, collections and storefront search. The seo.hidden metafield hides a product from sitemaps and search engines too. Store owners reach for both when they want to tidy up duplicate products.
The Shopping-feed trap. On a US medical-compression store I work with, the best organic product page (most organic clicks in the first month) and a second page for the same garment were set to Unlisted with a noindex tag. That split one garment's demand across three product pages. Search Console still showed clicks for the hidden products, mostly against feed-tagged or variant URLs. Those clicks did not establish that the clean product addresses were indexed.
I found it at a routine check before publishing new guides. We rerouted every guide link and a paid placement to the live product page, and the store chose one main page for the garment. That page's clicks went from 25 to 71, comparing August 31 to September 23 with the same span a month earlier (address and feed variants included). Feed cleanup and full consolidation were still unfinished at my last check, so treat this as one store's early result.
The lesson for your own audit is simple. Before you Unlist or noindex a product to clean up duplicates, look at its clicks in Search Console with the Shopping rows in mind, and check whether it's the page Google prefers. In this store's dataset, feed and product-sync variants made hidden pages look busy. Check the included URLs and search appearances, then use URL Inspection to verify whether the page itself is indexed. If the duplicate has to go, merge it and redirect it instead.
When to merge separate products into one page with variants
Merge when the separate products are the same item in a different colour, size or pack, with the same description and the same buyer. Keep them separate when each one has its own demand and you can give it a page that's really different.
Shopify built variants for this. Its help center describes a variant as each combination of option values for a product, so one shirt in three colours and four sizes can live on a single product page with twelve variants. One page collects all the links, reviews and clicks that would otherwise be split.
When you merge, work in this order.
- Pick the product with the most organic clicks and links as the one you keep, and add the others as variants.
- Take the old products off the online store. Shopify's help notes that a URL redirect won't work while the old URL still loads a valid page.
- Create a redirect from each old product URL to the kept one (Content, then Menus, then View URL Redirects).
- Update internal links, menus and any guide that pointed to the old URLs.
- Update your Google Shopping feed so it stops sending clicks to products that no longer exist.
If you're on Shopify Plus, Shopify's Combined Listings app is another route. It groups separate products under one parent listing, with the child products shown as variants on the storefront.
Keep products separate when they answer different searches. A compression sock and a compression sleeve may share a fabric, but people search for them separately. Give each one its own copy and photos, and they stop being duplicates at all. My guide to Shopify product and collection page SEO covers how to make those pages distinct.
Where to start this week
Start in Search Console. Run URL Inspection on your top ten product pages by revenue and confirm the Google-selected canonical matches the URL you want ranked. Then scan the Pages report for any product you sell under "URL marked 'noindex'."
If both are clean, check the theme for within and for an intact canonical line, and you've covered the duplicates most likely to cost you traffic. Everything else on the table can usually wait. For the rest of the technical list, my Shopify SEO checklist and the ecommerce SEO audit checklist go further.
If you'd rather have someone look, the Sales Leak Report shows where your product and collection pages lose buyers, by email within 24 hours, with no store access needed. Duplicate and hidden product pages are among the first things I check there, and in a full ecommerce SEO audit.
Questions
Does Shopify duplicate content hurt my rankings?
Usually not. Google says some duplicate content on a site is normal and not a violation of its spam policies, and Shopify's default canonical tags point collection-aware product URLs and variant URLs back to the main product page. The cases that cost traffic are separate products made for each colour or size, a broken canonical tag, and hiding a page that was earning clicks.
Should I fix "Duplicate without user-selected canonical" in Search Console?
Google describes it as working as intended, not an error. Inspect a few of the URLs and check that the Google-selected canonical is the page you want ranked. If it is, leave it. If product URLs show up there, check that your theme still prints the canonical tag.
Why does Google show /collections/x/products/y instead of /products/y?
Usually because your theme links to the collection version, often through the within filter in Liquid. Remove the filter from product links so they point at /products/y, then check the Google-selected canonical in URL Inspection over the following weeks.
Should I noindex duplicate products on Shopify?
Not as a first move. Google advises against noindex for choosing a canonical because it removes the page from Search entirely, and Unlisted products get a noindex tag automatically. Check the page's clicks, included URL variants and search appearances first, then verify its indexing in URL Inspection. If the duplicate has to go, merge it into one product with variants and redirect the old URL.
Do Shopify Markets subfolders create duplicate content?
Shopify sets canonical URLs and hreflang tags automatically from your market and language settings, so each market version is treated as a related page. Keep automatic hreflang turned on unless you have another hreflang setup in place.