ELMWICH. Book the Roadmap

Guide · Technical SEO · August 2026

The filtered-URL leak: how Shopify collections quietly waste your crawl

In a recent audit, 34 filtered collection URLs held 572,345 impressions and produced 21 clicks in 90 days. This guide explains where those URLs come from, what they cost, and how to check your own store in under ten minutes.

Where the leak comes from

Every Shopify collection page can spawn URL variants without anyone deciding it should. Sort parameters create them: /collections/mens-shoes?sort_by=price-ascending is a separate URL from the collection itself. Tag filters create them: /collections/shoes/red and /collections/shoes/red+leather are their own pages. Vendor and type collections are generated automatically for every brand and product type in your catalog, whether you curate them or not.

Each variant shows roughly the same products as its parent, carries a near-identical title, and competes with the page you actually want to rank. On a store with 40 collections, a dozen tags and four sort orders, the arithmetic gets ugly fast: you can put tens of thousands of crawlable URLs in front of Google while selling eight hundred products.

The store from the number above is real. 34 filtered URLs, 572,345 impressions, 21 clicks. That is a click-through rate of 0.004 percent, on impressions that mostly belonged to the parent collections. The filtered pages were not winning traffic. They were absorbing it.

Check it yourself: search Google for site:yourstore.com inurl:sort_by, then site:yourstore.com inurl:+. Anything indexed under either pattern is a page Google spent crawl on. Then open Search Console, Performance, filter Pages containing ?, and look at the click column.

Why it costs money, not tidiness

Three mechanisms, in order of damage.

Split signals. When six URLs show the same red shoes, links and engagement divide across six candidates. Google picks one canonical and it is not always yours. I have watched a ?sort_by=created-descending variant outrank the curated collection it was sorting, complete with the wrong meta description in the results page.

Crawl allocation. Googlebot budgets attention per host. On large catalogs, every fetch of a filter permutation is a fetch your new products and updated prices did not get. Stores with slow product indexation almost always have a parameter swamp somewhere upstream.

Index dilution. Hundreds of thin near-duplicates sitting in the index change how the whole site is assessed. Quality evaluation happens at site level, and the swamp is part of your site.

What good looks like

Shopify ships a reasonable default robots.txt now, and you can see a clean production example on any large store. Open allbirds.com/robots.txt and you will find the standard pattern:

Disallow: /collections/*sort_by*
Disallow: /*/collections/*sort_by*
Disallow: /collections/*+*
Disallow: /collections/*%2B*
Disallow: /collections/*%2b*

Sort orders blocked, tag combinations blocked, including the URL-encoded plus variants people forget. If your robots.txt predates 2021 or your theme was migrated from another platform, verify these lines exist. That is the floor.

Where robots.txt is not enough

A blocked URL can still be indexed if enough internal links point at it; Google just indexes it blind, title only. Blocking also does nothing about the canonical problem on single-tag pages, which Shopify leaves crawlable on purpose.

The fix lives in the theme. Shopify's default canonical_url on a tag-filtered collection points at the filtered URL, so the duplicate certifies itself. Override it for filtered views:

{% if template contains 'collection' and current_tags %}
<link rel="canonical" href="{{ shop.url }}{{ collection.url }}">
{% else %}
<link rel="canonical" href="{{ canonical_url }}">
{% endif %}

Five lines in theme.liquid, and every tag page votes for its parent instead of itself.

Check it yourself: open any tag-filtered collection on your store, view source, and search for rel="canonical". If the href contains the tag, your theme has the default behavior and the fix above applies.

When a filter deserves to live

Blocking everything is the junior mistake in the other direction. Some filtered views map to real demand. If "red running shoes" carries volume and you sell thirty of them, that page should not be blocked; it should be promoted to a real collection with its own title, copy and internal links, indexed proudly.

The test is mechanical: take your filter dimensions, check search volume for the combination, and split the list. Combinations with demand become curated collections. Combinations without demand stay blocked. Most stores end up promoting five to fifteen pages and blocking thousands, and both halves of that decision make money.

The first 90 days

Sequence matters. Week one: robots.txt verified, canonical override shipped, both are afternoon jobs for a developer. Weeks two to four: the demand split, because it decides which URLs you are about to remove from the index and which you are about to invest in. From there, watch Search Console's Pages report as the swamp drains; on mid-size stores the crawl reallocates within four to eight weeks, and the curated collections start collecting the impressions the duplicates were absorbing.

A note on method: everything above is checkable from public data and your own Search Console. The private version, run against your store's crawl, keywords and revenue data, is the Roadmap: ten business days, fixed fee, yours to keep. Related reading: how AI assistants choose which stores to recommend.

Want this run on your store, with your data?

Three layers, ten business days, a 3× value guarantee.

Book your Roadmap · $2,500