Faceted Navigation SEO: How Filters Wreck Ecommerce Rankings
Oct 2, 2026 · 7 min read

Filters help your customers. For a search engine they are usually a machine that prints thousands of addresses nobody ever typed into Google and nobody will ever rank for. The technical name is faceted navigation — filtering by several independent attributes at once: brand, size, colour, price, availability.
The problem is not that filters exist. The problem is that most shops generate a separate URL for every filter combination, leave it indexable, and hope Google works it out.
How five filters turn into tens of thousands of URLs
The maths is unforgiving. Take one category with:
- 20 brands
- 8 sizes
- 12 colours
- 5 price bands
- 2 availability states
That is 20 × 8 × 12 × 5 × 2 = 19,200 combinations. Before sorting. Before pagination. Add three sort orders and an average of five pages per listing and you are past 280,000 addresses — for a single category.
Then there is the part that makes it worse: the same content reachable through a different parameter order. ?brand=nike&colour=black and ?colour=black&brand=nike are one page for your server and two URLs with identical content for a crawler.
What actually breaks
Crawl budget goes to nonsense. Googlebot spends a limited amount of time on your site. When 90% of requests land on "black t-shirts, size XL, €20–30, out of stock", new products and edited categories reach the index later. For a shop that rotates stock weekly, that is a direct revenue problem, not a theoretical one.
Signals get diluted. Links pointing at a category get split across dozens of filtered variants. Instead of one strong category page you have a hundred weak ones. In practice this shows up as the problem I describe under ecommerce internal linking: no category collects enough internal links to move anywhere.
Cannibalisation starts. The category "Running shoes" and the filtered listing "Running shoes → Nike" target overlapping queries. Google picks one, often the weaker one, and the position wobbles. More on that in the piece on keyword cannibalization.
Thin pages pile up in the index. A filter combination that returns two products, or none, is an empty page from a quality point of view. A handful does not matter. Thousands change how the whole site looks.
Which filtered pages deserve to stay indexable
Not every filter is waste. Some combinations match real demand and earn their own page.
Indexing makes sense when:
- There is actual search demand. People search "women's Nike running shoes". Nobody searches "women's Nike running shoes size 38 black under €90". Check it in Search Console or a keyword tool — I wrote separately about pulling topics out of Search Console.
- The page has enough products. Under five items it is not a listing, it is an accident.
- It is one attribute, not three. Category plus brand, yes. Category plus brand plus colour plus price, no.
- You can write it a real title and description. If all you can produce is a template sentence with variables filled in, it probably does not belong in the index. The same logic applies to ecommerce meta descriptions in general.
Everything else — sorting, pagination beyond the first page or two, availability toggles, price sliders, multi-attribute combinations — stays out of the index.
Six technical fixes, in the order they matter
1. Canonical to the parent category
Filtered URLs that should not be in the index get a canonical pointing at the clean category. ?brand=nike&colour=black → canonical to /running-shoes/.
One warning: a canonical is a hint, not an order. When the filtered page's content differs noticeably from the category, Google ignores the canonical and indexes the page anyway. So a canonical alone is not enough. I cover when canonicals hold and when they get overruled in canonical tags and duplicate content.
2. Noindex on combinations with no value
Where you do not want the page in the index but you do want Googlebot to see it and follow the links, use noindex, follow. Typically for sort orders, pagination from page three onwards, and any combination of two or more attributes.
Noindex works more reliably than a canonical, with one condition: the page has to be crawlable. Block it in robots.txt and Googlebot never sees the noindex.
3. Robots.txt for parameters that never make sense
Parameters like ?sort=, ?view= or ?session= can be blocked outright:
`` Disallow: /?sort= Disallow: /?view= Disallow: /*&sort= ``
This saves crawl budget most efficiently, because the crawler never fetches those addresses at all. But the warning from the previous point applies — blocked pages that are already indexed will not drop out, because the robot cannot see the instruction to remove them. Noindex first, let it get crawled, block later. Other common mistakes are in my article on robots.txt and sitemap errors.
4. Filters with no URL of their own
The cleanest fix for filters that should never rank: run them in JavaScript without changing the address, or use a fragment (#), which search engines ignore. The customer filters, no new URL is created, the index stays clean.
The downside is real: the customer cannot send anyone a link to the filtered view. So this suits secondary filters — availability, price — not the main ones.
5. Clean URLs for the combinations you do want indexed
Combinations that are supposed to rank should not live on query parameters. /running-shoes/nike/ beats /running-shoes/?brand=nike. It has a clear structure, you can link to it, and you can write it its own copy. On rewriting addresses without losing positions, see URL structure and slugs.
6. Internal links only to what should rank
If a link exists in the HTML, Googlebot follows it. Links to combinations that should stay out of the index belong behind rel="nofollow" or get generated in JavaScript after a click. No valuable category page should carry a hundred links to filtered variants in its body.
How to measure how bad it is
Three checks you can run today:
site:yourdomain.comin Google. Compare the number of indexed pages against your product and category count. If you have 800 products and 14,000 indexed URLs, you know where the gap came from.- Search Console → Page indexing. Look at "Duplicate, Google chose different canonical" and "Crawled – currently not indexed". Filtered URLs settle there first.
- Settings → Crawl stats. It shows how many requests the crawler makes per day and on which file types. When requests climb and indexed pages do not, crawl budget is being spent on parameters.
Seonal crawls the public pages of your site and finds the specific cases — duplicate titles on filtered listings, missing canonicals, categories sharing one meta description. For the findings that matter I write the finished replacement text; you approve it and push it live through the WordPress plugin, the API, or a CSV export. What the audit catches and what it cannot see is spelled out in free SEO audit.
What to do first
Ranked by impact against effort:
- Block sorting and view parameters (
sort,view,per_page). Biggest volume of junk, smallest risk. - Put
noindex, followon any combination of two or more filters. - Set canonicals on single-filter URLs that have no demand of their own.
- Pick 10 to 30 combinations with real search demand, give them a clean address, their own title and their own description.
- Link to those from the category page and the menu.
After you deploy, expect nothing to happen immediately. The index clears over weeks, on larger shops over months. The count of indexed URLs starts falling well before positions start rising. Whether the fix worked shows up in a 28-day before-and-after comparison — I wrote about measuring the impact of fixes separately.
Anyone promising that tidying your filters moves rankings within days is lying to you. What actually happens is that you first see less rubbish in Search Console, and only later a change in category traffic.
This is written by a tool you can buy
The article was proposed and written by Seonal — the same one that finds the errors on your site, fixes them and measures the result. The audit is free.