WriteMySEO / Blog / Faceted Navigation Creates More URLs Than You Think
SEO technology

Faceted Navigation Creates More URLs Than You Think

Filter combinations multiply exponentially. How to count your real crawl space, choose which facets deserve indexing, and pick the right control for each URL pattern.

A catalog with 4,000 products can easily expose tens of millions of crawlable URLs. Nobody decides to do this. It happens because filters compose, and composition is multiplicative while your product count is additive.

The damage is not a penalty. Google's large-site crawl budget guidance names faceted navigation as a common source of low-value URLs, and the mechanism is straightforward: crawl capacity is finite, so requests spent re-fetching ?color=blue&size=m&sort=price&page=7 are requests not spent discovering your new products or picking up your updated category copy. The symptom shows up later as slow indexing of pages you care about, not as a ranking drop on the pages you don't.

Why the URL count explodes faster than the facet count

Count the state space, not the links in the sidebar. Each facet with k selectable values contributes k+1 states per URL — every value plus "not applied." With single-select facets, the combinations for one category are the product of those states.

Six facets with five values each is 6⁶ = 46,656 combinations. Not six facets' worth of pages. Multiply by 20 categories and you are at 933,120 before anything else happens. Then the multipliers stack:

The practical test: crawl your own site with a crawler configured to follow parameters, cap it at a few hundred thousand URLs, and see whether it terminates. If it does not, you have an unbounded space, and no amount of rel=canonical will fix a crawler that never runs out of new URLs to fetch.

What Google actually does with these URLs

Some documented behavior worth being precise about:

The reasonable inference — not documented, but consistent with what crawl logs show on large catalogs — is that Google learns patterns and throttles low-value parameter spaces on its own, eventually. You do not control the timeline, and "eventually" on a site with an unbounded crawl space can be long enough to delay indexing of new inventory.

Which facets deserve to be indexable

A facet combination earns indexation when it satisfies all four of these, not three:

  1. Real query demand for the phrase the page would target ("waterproof hiking boots," not "boots sorted by price descending").
  2. Enough stable inventory that the page will not be empty next month. Thin or zero-result filter pages are a liability.
  3. Differentiated content — a distinct H1, title, and ideally a paragraph of copy, not just a re-sorted grid.
  4. A stable URL you are willing to keep and redirect if the taxonomy changes.

In practice this means a whitelist: category plus one approved facet, occasionally category plus two for a handful of high-demand combinations. Everything else is functional UI, not a landing page.

What each control mechanism actually does

MechanismPrevents crawlPrevents indexingConsolidates signalsNotes
robots.txt DisallowYesNoNoURL can still appear as a bare link; on-page tags never read
noindex meta/headerNoYesNoPage must stay crawlable for this to keep working
rel=canonicalNoUsuallyYesA hint; Google may pick differently
301 to normalized URLReducesYesYesBest fix for parameter-order and default-value noise
nofollow on filter linksReduces discoveryNoNoDoes nothing about links from elsewhere or sitemaps
Filters applied without changing the URLYesYesN/ANo URL, no crawl space
Sitemap inclusionIncreasesNoNoOnly whitelisted URLs belong here

The decision rule follows from the table. Bounded and potentially valuable (a facet you might promote later, or one that attracts external links): keep it crawlable, self-referencing or canonicalized, and let Google consolidate. Bounded but worthless (sort orders, view toggles): normalize away with a 301 to the canonical form. Unbounded (price ranges, multi-select stacks, session or tracking parameters): block the pattern in robots.txt and stop emitting hrefs to it.

# robots.txt — block unbounded combinations, keep single-facet pages crawlable
Disallow: /*?*price_min=
Disallow: /*?*sort=
Disallow: /*&*color=      # any color param that is not first = multi-facet

That last line only works if your application enforces a canonical parameter order. Which is the point: the rules are cheap once normalization exists, and unmaintainable without it.

Normalize the URL grammar before anything else

Define one canonical string form and 301 everything else to it:

This single change often removes the majority of a crawl space, because most of the bulk is permutations and defaults rather than genuinely distinct filter states. Pagination stays crawlable with self-referencing canonicals — Google announced in 2019 that it no longer uses rel=next/prev for indexing, so paginated pages need to be reachable by ordinary links.

How to measure whether it is working

Server logs are the only source that shows what crawlers actually requested. Verify Googlebot by reverse DNS before counting anything, then bucket verified requests by URL pattern:

# share of verified Googlebot requests that carry a query string
awk '{n++; if ($7 ~ /\?/) q++} END {printf "%.1f%%\n", 100*q/n}' googlebot-verified.log

Track three numbers monthly:

In the Pages report, watch "Crawled — currently not indexed" and "Duplicate, Google chose a different canonical." Rising counts on filter URLs mean your canonical hints are being read and rejected, which is your cue to stop hinting and start blocking or removing the URLs entirely.

What to do first

  1. Crawl your own faceted templates with parameters followed and a hard URL cap. Note whether it terminates. That tells you bounded vs. unbounded.
  2. Ship parameter normalization with 301s: fixed order, no defaults, no empties. Measure the parameterized share of Googlebot requests before and after.
  3. Write the whitelist of indexable facet pages using the four criteria above. Everything on it gets unique titles, internal links, and sitemap entries.
  4. For unbounded patterns, remove the hrefs and block the pattern in robots.txt. Do not rely on noindex for a space that is infinite — you would be paying crawl budget forever to deliver the instruction.
  5. Re-check discovery-to-first-crawl time on new products in 30 and 60 days. That is the metric that justifies the work.
crawlingfaceted navigationrobots.txtcanonicalization

WriteMySEO produces marketing content, not legal, medical, financial, or compliance advice. Figures cited reflect publicly reported industry data at time of writing and shift over time.

Get started

We write this well about your industry, every month.

AI-drafted, human-reviewed SEO content on a flat subscription. Blog posts, metadata, schema, and internal links, shipped on a monthly rhythm.

See plans

More from the blog