Faceted Navigation: Taming Crawl Traps on Large Sites
Faceted filters can spin one category into millions of URLs. Learn which filters to index and how to block the rest before they burn crawl budget.
Faceted navigation is the filter menu on a category page. Color, size, brand, price, rating, sort order. Shoppers love it. Crawlers quietly choke on it, because every filter you add multiplies the number of URLs your site can generate.
Here's the trap. One category with eight filterable attributes can spin up a URL for nearly every combination of those filters, then multiply that by sort orders and pagination. Search Engine Land puts it plainly: "multiply a few categories by multiple filters, and the combinations can quickly balloon into the millions." Most of those URLs show nearly the same products. Almost none of them earn a single visit. And Googlebot will keep crawling them until you tell it not to.
We see this in most large e-commerce crawls we run. The category tree looks healthy. The product pages look healthy. Then you sort the crawl by URL count and find 300,000 parameter variations wrapped around forty real categories. That's a crawl trap, and it's one of the most common reasons a big site's important pages get crawled late, or missed entirely.
Why crawl budget is the real cost
Google defines crawl budget as two things working together. There's the crawl capacity limit, which is the maximum number of simultaneous connections Google will use plus the delay between fetches, and there's crawl demand, which depends on your site's size, update frequency, page quality, and relevance. When millions of near-identical filter URLs sit in the crawl queue, they eat into both. Google's own faceted navigation guidance is blunt about the tradeoff:
Keep in mind that having these URLs crawled means an increased resource usage on your server and, potentially, slower discovery of new URLs on your site.
That last part is what actually hurts. Slower discovery of new URLs means your fresh products, your new content, and your fixed pages wait in line behind ?color=blue&sort=price_desc&page=7. You don't get penalized for faceted URLs. You just get crawled less efficiently, and on a large site that shows up as pages that never get indexed.
The decision that comes before any tag
The mistake most teams make is reaching for a technical control before they've decided what each filter is worth. Don't. Sort the question first, then apply the tag.
Every filter falls into one of a few buckets:
- Index-worthy. People search for it and you have enough products to back a real page. "Waterproof hiking boots" or "size 11 running shoes" can be genuine landing pages with unique value.
- Duplicate. A sort order or a view toggle that reshuffles the same products. It deserves no separate URL in the index.
- Thin. A filter that returns a tiny, low-demand subset. Search Engine Land calls these out directly: filters like "on sale," "clearance," or "new arrivals" often "produce separate pages that only show a small subset of products."
- Never-crawl. Session IDs, tracking parameters, and infinite combination stacks that no one searches for.
Oncrawl's advice here matches what we tell people: "Use analytics to see which filters users actually engage with. If a combination gets solid traffic and you have enough products to support it, consider creating a dedicated subcategory page." Promote the winners into real, curated pages. Everything else gets controlled.
Block, don't noindex, for the pages you never want crawled
This is the part teams get backwards most often, so it's worth being precise.
If you don't want a filter URL crawled at all, block it in robots.txt. Google's faceted navigation doc lists robots.txt as a preferred prevention method and even gives the pattern shape, like disallow: /*?*products= paired with an allow for the canonical version. A blocked URL is never requested, so it costs zero crawl budget.
A noindex tag does the opposite of what people expect for crawl control. The tag lives inside the page's HTML, so Google has to crawl the page to read it. Google's large-site guidance says exactly this:
Don't use noindex, as Google will still request, but then drop the page when it sees a noindex meta tag or header in the HTTP response, wasting crawling time.
So the rule of thumb is simple. Use robots.txt when the goal is to stop crawling and save budget. Use noindex, follow only when you want the page crawled and link equity to flow through it, but you don't want it in the index. Those are different jobs. And whatever you do, don't stack a noindex behind a robots.txt disallow, because Google can't read a tag on a URL it isn't allowed to fetch.
Canonical tags have their place, but temper your expectations. Google notes that rel="canonical" and rel="nofollow" are "generally less effective in the long term" than robots.txt or URL fragments for controlling faceted crawling. Canonicals consolidate ranking signals, but the duplicate URL still gets crawled. Treat canonical as a signal-consolidation tool, not a crawl-budget tool.
Keep filters off URLs when they don't need to be there
The cleanest crawl trap is the one that never forms. For filters that genuinely don't need their own URL, sort orders and view toggles are the classic case, render them client-side or behind a URL fragment. Google states that "Google Search generally doesn't support URL fragments in crawling and indexing," which is exactly why a fragment based sort control never becomes a crawlable page. No URL, no crawl, no trap.
Clean up the URL patterns Google sees
If some faceted URLs do need to be crawled and indexed, make them predictable. Google's faceted navigation doc asks for a few specific things:
- Use the standard
&separator between parameters. Skip commas, semicolons, and brackets. - Keep filter order consistent so the same selection always produces the same URL, with no way to generate duplicate filters.
- Return an HTTP
404when a filter combination has no results or is nonsensical, and for pagination URLs that don't exist. That stops Google from wandering into empty combinatorial space.
Consistent encoding matters more than it sounds. If ?color=red&size=10 and ?size=10&color=red both resolve, you've just doubled every combination for no reason.
Find the waste before you fix it
You can't fix a trap you can't see. Start with two data sources.
First, your server logs. They show what Googlebot is actually requesting, which is the only ground truth for where budget goes. Oncrawl frames it well: log analysis reveals when "Googlebot is spending time on faceted navigation URLs that don't get traffic or offer search value." Pull your logs into a log file analyzer and look at the ratio of bot hits on parameter URLs versus real category and product pages. If a third or more of Googlebot's requests land on filter combinations, you have a budget problem worth fixing now.
Second, a full crawl of your own site. A crawl shows the combinatorial blast radius, how many URLs a category can actually generate, before Google ever finds them. Group the crawl by URL pattern, find the parameters that multiply fastest, and match them against the buckets above. Then draft your robots.txt rules and test them against real URLs with a robots.txt tester so you don't accidentally block a category you meant to keep.
A short working checklist
- Crawl the site and list every parameter your facets can generate.
- Sort each filter into index-worthy, duplicate, thin, or never-crawl.
- Promote the index-worthy winners into curated pages with unique content.
- Block the never-crawl parameters in robots.txt. Don't noindex them.
- Use
noindex, followonly for pages you want crawled but not indexed. - Standardize parameter order and separators, and return 404 for empty combinations.
- Move pure display filters like sort order to fragments or client-side rendering.
- Recheck the logs a few weeks later to confirm Googlebot moved on.
Faceted navigation isn't the enemy. Uncontrolled faceted navigation is. The fix is mostly a governance decision, which filters earn a URL, backed by a couple of technical controls applied in the right order. Get the decision right first, and the robots.txt rules almost write themselves.
If you want the two inputs that make this concrete, start with a crawl to see the blast radius and your logs to see where budget actually goes. From there it's triage. For the budget side of the story, our crawl budget guide covers how Google allocates crawling, and our internal linking guide covers how to make sure the pages you do want indexed get the signals they need.
Keep reading
Discovered, Currently Not Indexed: Why Google Won't Crawl
Google found the page but never crawled it. What 'Discovered, currently not indexed' really means, and how to get those URLs crawled and indexed.
Technical SEOCrawled, Currently Not Indexed: Technical or Quality?
Google crawled your page and skipped it. Here's the triage order we use to rule out the technical causes before blaming content quality.
Put this into practice.
Run a free crawl and get every issue on your site ranked by estimated impact — fixes opened as pull requests.