How to fix Shopify duplicate content and faceted URLs
How to fix Shopify duplicate content and faceted URLs
Collection filters, tags and vendor URLs quietly duplicate your Shopify store. Here's the canonical, robots and metafield fix that recovers wasted crawl budget.
Short answer
Shopify auto-canonicals product URLs but leaves collection filters, tags and vendor URLs to duplicate themselves. Fix in three moves: block filter parameters in robots.txt.liquid, add noindex to tag pages via theme conditional, and verify the theme sets correct canonicals on filtered collection URLs.
What Shopify duplicates by default
- Filtered collections:
/collections/x?filter.p.vendor=y - Tag pages:
/collections/all/tag-name - Vendor URLs:
/collections/vendors?q=Brand - Search URLs:
/search?q=term - Pagination in some themes:
/collections/x?page=2
Every one of these is a distinct URL Google can crawl and (sometimes) index. On a store with 500 products and 5 filters, that's thousands of near-duplicate pages competing with your canonical collection.
Fix 1 - Block filter parameters in robots.txt
Create or edit templates/robots.txt.liquid and add:
{% for group in robots.default_groups %}
{{ group.user_agent }}
{% for rule in group.rules %}{{ rule }}
{% endfor %}
Disallow: /*?*filter.
Disallow: /*?*sort_by=
Disallow: /search
{% endfor %}This tells Google not to crawl any URL containing ?filter. or?sort_by= without breaking the URLs for users.
Fix 2 - Noindex tag pages
In your theme's theme.liquid, add inside the <head>:
{% if template contains 'collection' and current_tags %}
<meta name="robots" content="noindex, follow">
{% endif %}Tag pages stay accessible and pass link equity but drop out of the index. On stores with 20+ tags per collection this alone can recover 10-20% of crawl budget.
Fix 3 - Verify collection canonicals
Filtered collection URLs should <link rel="canonical"> back to the unfiltered collection. Shopify Dawn does this correctly. Older themes (pre-2022) and heavily customised themes often don't. Test with:
curl -s https://yourstore.com/collections/x?filter.p.vendor=y | grep canonicalThe canonical should point to /collections/x, not/collections/x?filter.p.vendor=y. If it doesn't, editsections/main-collection.liquid or your equivalent to output the canonical from collection.url.
How to verify the fix worked
- Submit an updated sitemap in Search Console.
- Wait 14-28 days.
- Check the Indexed, not submitted in sitemap report - it should drop.
- Check the Excluded by 'noindex' tag and Blocked by robots.txt counts - they should rise, matching your intentional blocks.
Bonus - handle search URLs
Shopify's internal search URLs (/search?q=) create infinite low-quality index entries. Blocking them via robots.txt (as above) is enough for most stores. If you want to be extra safe, add noindex to the search template as well.
Related articles
- Ecommerce SEO · 18 min read
The UK ecommerce SEO playbook for Shopify (2026)
The complete UK Shopify SEO playbook: technical, on-page, content and local. What actually moves organic revenue for £1M-£15M UK DTC stores.
Read article → - Ecommerce SEO · 11 min read
Product page SEO for UK Shopify stores
The PDP template that ranks and converts for UK Shopify brands - copy structure, schema, reviews, UK signals and internal linking.
Read article → - Ecommerce SEO · 10 min read
Collection page SEO: templates that rank
Why Shopify collection pages under-rank and the on-page template that fixes it - intro copy, faceted-nav strategy, schema and internal linking.
Read article → - Ecommerce SEO · 12 min read
Technical SEO checklist for Shopify Plus
Crawl budget, canonicals, hreflang, Core Web Vitals, JSON-LD and international - the technical SEO checklist we run on every Shopify Plus audit.
Read article →
Related tools & resources
Free UK ecommerce calculators, definitions and benchmarks referenced in this guide.
Frequently asked questions
Partially. Shopify auto-canonicals /products/x when accessed via a collection (/collections/y/products/x) back to /products/x. It does NOT handle faceted filters (?filter.p.vendor=), tag URLs, or search URLs - those need robots.txt or noindex intervention.
