Duplicate URLs on Shopify, and how canonical tags handle them
Why one Shopify product can live at five URLs, what the canonical tag does about it, what Shopify already handles for you, and the few fixes that are still worth making.
On a Shopify store, one product can be reached at several different addresses. That’s by design, and Shopify handles most of it well. But when themes, apps or your own links lean on the wrong version, search engines spend their time on copies, and the signals that should build up on one page get split across several.
Where duplicates come from
The same linen shirt might be served at all of these:
/products/linen-shirt /collections/shirts/products/linen-shirt /collections/sale/products/linen-shirt /products/linen-shirt?variant=4211 /products/linen-shirt?utm_source=newsletter
Collections multiply in the same way:
- Sorting:
?sort_by=price-ascendingshows the same products in a different order. - Filters:
?filter.v.option.color=Beigeand friends, which can combine endlessly. - Tag pages:
/collections/shirts/linen, and combinations like/collections/shirts/linen+summer. - International versions:
/en-ca/products/linen-shirtwith Shopify Markets or extra languages.
What the canonical tag does
A canonical tag is a line in the page’s head that names the preferred URL for that content. Shopify themes output it from the canonical_url Liquid object, which points collection-scoped product URLs at the plain /products/ address.
<link rel="canonical" href="https://yourstore.com/products/linen-shirt">
Google treats the tag as a strong hint, not a command. It also weighs which URL your internal links point to, which one is in your sitemap, and which one other sites link to. When those signals agree, the canonical sticks. When they disagree, Google may pick a different URL from the one you declared.
Check a URL
Paste any path from your store to see its canonical version, whether Shopify’s default robots.txt lets crawlers in, and why:
What actually needs fixing
- Internal links to collection-scoped product URLs. Some themes, especially older ones, build product card links with Liquid’s
withinfilter, so every collection page links to/collections/…/products/…. The canonical tag cleans up after it, but your strongest internal signal now points at the duplicate. Linking toproduct.urlwithoutwithinfixes it. - Thin tag pages. A single-tag page like
/collections/shirts/linenis crawlable and usually canonical to itself. If it’s just a filtered grid with no copy of its own, it competes with the main collection without adding anything. Either give it a reason to exist or stop linking to it. - Campaign links pasted into your own site. UTM parameters belong on links from emails and ads, not in your navigation or blog posts.
- Changed handles without redirects. Renaming a product handle creates a new URL. Keep Shopify’s “Create a URL redirect” option ticked so the old address and its links carry over.
How to verify in Search Console
- Run a product URL through URL Inspection and compare the “User-declared canonical” with the “Google-selected canonical”. They should match.
- In the Pages report, “Alternate page with proper canonical tag” is normal: Google found a duplicate and respected your canonical.
- “Duplicate, Google chose different canonical than user” is the one to investigate. It usually means your internal links or sitemap point somewhere other than your canonical tag.
For the crawling side of the same problem, see A plain-English guide to Shopify robots.txt.
- Technical SEO
- Canonical tags
- Duplicate content
- Shopify