The problem
On Shopify, a product called “Linen Shirt” is available at /products/linen-shirt. It’s also available at /collections/shirts/products/linen-shirt, /collections/sale/products/linen-shirt, and once for every other collection that includes it.
A product that sits in eight collections ends up with nine URLs. If your theme’s product cards link to the collection-aware versions (and many themes do), Google discovers all nine.
Why canonicals aren’t enough
Shopify adds a canonical tag that points every version to /products/linen-shirt, which helps. But a canonical tag is a hint, not a directive. Google still has to crawl each copy to see the tag. When your internal links consistently point to a non-canonical URL, you’re sending mixed signals.
On large catalogs this shows up in Search Console as a growing number of “Alternate page with proper canonical tag” and “Duplicate without user-selected canonical” entries, and as crawl budget spent on copies instead of new products.
The fix in Liquid
Find the product card snippet. It’s usually card-product.liquid, product-card.liquid or product-grid-item.liquid. Look for:
{{ product.url | within: collection }}
and change it to:
{{ product.url }}
That’s the whole fix. Products still appear in your collections as before. Only the link destination changes, so every internal link now points to the canonical URL.
How to check it worked
- Crawl the store with Screaming Frog and filter internal links containing
/collections/and/products/. The count should be close to zero. - In Search Console, watch the “Duplicate” reasons under Pages. They should level off and then fall over 4–8 weeks.
- Check that breadcrumbs and “back to collection” links still work.
This is one of the first fixes in almost every technical SEO sprint I run on a Shopify store.
