Shopify duplicate product URLs: collection paths and canonicals
The canonical tells Google which product URL to keep. Your theme's links decide how often Google meets the other one. Here is how to check your store and fix it without breaking navigation.

01Where the duplicate URL comes from
A Shopify product can be reached at two addresses:
/products/handle, the product's own URL;/collections/collection-handle/products/handle, a "collection-aware" URL.
The second form appears when a collection page links to products with the collection in the path. Themes usually do this with the Liquid within filter, so the product page knows which collection the shopper came from.
| Signal | What it tells Google | What it does not do |
|---|---|---|
Canonical on the collection URL pointing to /products/handle | Which URL you want indexed | Stop Google from crawling the collection URL |
| Product cards linking to the collection URL | That this URL matters. Every collection page repeats the signal | Respect your canonical. Links and canonical now disagree |
Sitemap listing /products/handle | Your preferred URL, once more | Outweigh hundreds of internal links to the other form |
The canonical protects you. The internal links decide how often Google meets the duplicate. Fix the links, and keep the canonical.
02What we saw on four live stores
On October 14, 2026 we requested a collection-path product URL on four Shopify stores, including our own ShopXN.net.
| Store | Links on the collection grid | Requesting /collections/all/products/… |
|---|---|---|
| ShopXN.net | Plain /products/ links | 301 redirect to /products/handle |
| A coffee brand | Plain /products/ links | 301 redirect to /products/handle |
| A fashion retailer | 698 collection-path links on one collection page | 200, canonical pointing to /products/handle |
| An apparel brand | Plain /products/ links | 404, with a canonical pointing to itself |
The fashion retailer is protected by its canonical, but every collection page sends Google hundreds of links to URLs it has been told not to index. The apparel brand's 404 is harmless only if nothing links to those URLs. You cannot assume which group your store is in, because themes, apps and custom code change the behavior. Test your own store.
03Check your store in ten minutes
1. Read a collection page's links
Open a collection page, view the source and search for /collections/ followed by /products/ inside link URLs. If product cards use that form, the theme generates collection-aware links.
2. Request one collection-path URL
Use curl -I or the browser's network panel, and note whether it returns 200, 301 or 404.
3. If it returns 200, read the canonical
It must be the full /products/handle URL, not the collection version.
4. Look in Search Console
In Page indexing, open "Alternate page with proper canonical tag" and "Duplicate, Google chose different canonical than user". Count how many sample URLs contain /collections/…/products/.
5. Check the sitemap
Shopify's generated product sitemap lists /products/ URLs. If collection-path URLs appear in any sitemap, an app or custom sitemap is adding them.
Worked example: a store with 40 collections showing 24 products each has up to 960 collection-aware product links on first pages alone. On a store with 300 products, each in three collections, there are up to 900 duplicate URL variants for 300 products. Removing the within filter from one snippet removes all of those links at once.
04How to fix it, and what to leave alone
| Situation | Do | Don't |
|---|---|---|
| Cards link to collection paths | Remove | within: collection from the product card link, so it uses product.url | Remove products from collections. Membership is not the problem |
| Collection-path URLs return 200 | Keep the canonical to /products/handle | Let an app overwrite it with a self-referencing canonical |
| Many collection paths in Search Console | Fix links first, then wait for recrawl | Block /collections/*/products/ in robots.txt. Google could no longer see the canonical |
| Collection-path URLs return 404 | Redirect any that external sites link to | Leave linked URLs broken |
| Breadcrumbs depend on collection context | Test breadcrumbs and "back to collection" after the change | Ship the change without checking product page navigation |
Related duplicates that are separate problems
- Variant parameters (
?variant=). These normally keep the product canonical. See variant structured data. - Filter and sort parameters on collections. Different defaults apply. See Shopify filter URLs and SEO.
- Market and language versions. These are intended duplicates connected by hreflang. See the international SEO guide.
05Copy this developer ticket and fill in the brackets
Theme ticket: product cards link to canonical product URLs
Problem: product cards on collection pages link to /collections/[handle]/products/[handle] Evidence: [n] such links on /collections/[example]; Search Console shows [n] alternate/duplicate rows Change: in [snippets/card-product.liquid or equivalent], link with product.url (remove "| within: collection") Keep: canonical on collection-path URLs = https://[domain]/products/[handle] Test after change: - collection grid source contains no /collections/*/products/ links - product page breadcrumb / back link still works: [yes/no] - /collections/[handle]/products/[handle] returns [200 + canonical | 301] Do not: add robots.txt rules for collection product paths Recheck: Search Console Page indexing on [date + 4 weeks]
06Questions
Does Shopify create duplicate content automatically?
It can create two URLs for the same product, depending on how the theme links products. The canonical usually tells Google which one to keep. The theme's links decide how often Google meets the duplicate.
Should I remove products from extra collections?
No. Belong to as many collections as helps shoppers. The duplicate comes from the link format, not from membership.
Will fixing this increase rankings?
It removes wasted crawling and conflicting signals. It does not create demand. Expect cleaner Page indexing reports, not an immediate traffic jump.
Why does Search Console say "Google chose different canonical than user"?
Google found strong signals for another URL, often internal links or a redirect pointing elsewhere. Compare the declared canonical with where your links actually point.
Sources and what still needs a direct check
- ShopXN public requests to four Shopify stores on October 14, 2026. Status codes, canonical tags and grid links. Other stores anonymised.
- Shopify Help Center, Finding and submitting your sitemap. Product sitemap contents.
- Google Search Console Page indexing report status names.
Still to check yourself
- The exact snippet your theme uses for product cards. Names differ between themes.
- Whether any app (filters, search, recommendations) builds its own product links.
- Whether external sites link to collection-path URLs you are about to change.
Next: run the five checks and continue with the technical SEO audit checklist, where URL identity is checks 05–08. To have the change made and verified across templates, our SEO audit records each finding with evidence and a fix order.