Every filter state in a named class with one consistent rule, search exposure only where demand and stock hold, and no shopper control removed to tidy the crawl graph.

A shopper sees a handful of useful filters, size, color, brand, price, but a crawler can see every combination, sort order, and empty result as a separate URL, including thousands nobody meant to publish. We inventory the full filter grammar, decide which combinations actually earn search exposure, and align the routing and crawler directives so shoppers keep every control while the index only sees the combinations worth finding. We preserve the filter journey shoppers need, rein in the URL generators behind it, and give search exposure only to combinations that earn a lasting place in the catalog.

A Zeo figure adjusts knobs on a large filter panel while another figure closes duplicate paths through a URL maze behind it.

Some of the 500+ brands we've worked with

See all references
  • DenizBank
  • Amazon
  • Mustela
  • Edenred
  • Yandex
  • Axa Hayat Emeklilik
  • BMW
  • Shell
  • Hyundai
  • PepsiCo
  • Red Bull
  • Decathlon
  • MediaMarkt
  • Bayer
  • Sanofi
  • EY
  • KPMG
  • GE
  • 3M
  • Domino’s
  • Lexus
  • Trendyol
  • Hepsiburada
  • Pegasus Airlines

We start by documenting how filter URLs are made, then decide which states should become durable search destinations.

  1. Inventory the full filter grammar

    We trace every facet, value, sort, multi-select, pagination state, locale, and platform layer that can create or link a URL. Assigning a real owner to each parameter and confirming the estimate isn't missing a whole generator.

    A parameter register with real examples, owners, and an honest estimate of how many states exist.

  2. Separate navigation from search value

    We compare combinations against real demand, stable inventory, existing category ownership, and a distinct shopper task. Making the index, navigation-only, canonicalize, block, redirect, or retire call for each state class.

    Each state class gets one decision (index, navigation-only, canonicalize, block, redirect, or retire).

  3. Align routing, links, and crawler directives

    For every class, we specify how routing, internal links, HTTP status, robots, noindex, canonical, sitemap inclusion, pagination, parameter order, and empty results must work together. Deciding which instruction takes precedence when two rules genuinely conflict for the same URL class.

    One precedence-based rule matrix shows the expected treatment and examples without asking one directive to undo another.

  4. Publish only combinations that can hold their value

    Each approved combination receives one stable URL, a useful assortment, a clear title and heading, contextual copy, internal links, structured data, and an inventory lifecycle. Verifying that demand and stock still support a permanent, indexable page before the combination is built.

    The output is a short backlog of owned landing pages. Your platform can generate every facet pairing, and should not.

  5. Test the weird states before rollout

    We run normal, reordered, multi-select, sorted, paginated, empty, low-stock, localized, and malformed examples through the live template. Judging whether a boundary-test failure blocks the broader rollout or is an acceptable, documented exception.

    A boundary report that catches traps and conflicts before a broad rule reaches the whole catalog.

AI enumerates and scores the URL space; people decide which states deserve a page.

AI crawls the live site to enumerate every facet, sort, and parameter combination actually generating a URL, scores filter-state combinations against demand and inventory signals so a person reviews a ranked shortlist instead of a raw parameter list, checks sampled URLs against the draft matrix to expose contradictory routing, linking, and index directives before release, prepares title, heading, and structured-data fields for approved combinations, and generates the full matrix of reordered, malformed, and low-stock edge cases to run through the live template. It never opens the index itself. We do not index an uncontrolled parameter universe or publish keyword-swapped combinations with no distinct shopper value, we do not invent product counts, availability, attributes, or hidden filter states, and we will not remove or conceal useful shopper controls to make the crawler graph look tidier.

Four working artifacts turn an unruly filter system into a contract that product, engineering, merchandising, and SEO teams can maintain.

  • Architecture map

    Facet decision register

  • Decision matrix

    Crawl & index rule matrix

  • Prioritized backlog

    Valuable combination backlog

  • Evaluation sheet

    Boundary assertion report

We call it done when: The facet register, rule matrix, combination backlog, and boundary report are done when every state class names its examples, shopper purpose, search treatment, page owner, and review owner, the internal links, HTTP status, robots, noindex, canonical, sitemap inclusion, parameter order, pagination, and empty-state behavior agree for every class, every backlog candidate has distinct demand, one page owner, stable product rules, a minimum inventory threshold, and a defined lifecycle, and every representative state either matches its expected rule live or names the generator, owner, release, and rollback behind the failure.

This work suits stores that need shoppers to narrow a catalog without letting each filter choice open another uncontrolled crawl path.

A good fit when

  • Facets, sort controls, query parameters, and multi-select options produce more URL variants than the team can account for.
  • A few combinations could serve a clear search need, but they sit inside a much larger pool of duplicates, thin assortments, and zero-result states.
  • Internal links, routing, HTTP status, robots rules, noindex, canonicals, and sitemaps give crawlers conflicting instructions for the same filter state.

Better handled as other work when

  • The plan is to index every possible combination, even when it lacks distinct demand, dependable inventory, or an accountable page owner.
  • You can change one directive but cannot inspect and test the links, routing, status, canonical, and empty-state behavior around it.

If one of these is closer to your situation, start here instead: E-commerce SEO

We call it done when: Every filter state belongs to a named class with one compatible crawl, index, canonical, link, and empty-state rule. Valuable combinations have real demand and stock behind them. And shoppers never lose a useful control just to save crawl budget.

  • Semrush

    checks durable demand before a filter becomes a landing page

  • Screaming Frog

    enumerates filter parameters, combinations, directives, and empty result states

  • Botify

    shows which filter states consume crawl attention repeatedly

  • Oncrawl

    compares crawler visits with indexable facet rules and inventory

  • Google Search Console

    identifies filter combinations already receiving distinct search demand

  • Google Analytics

    checks whether contained filters still help shoppers narrow products

Bring a crawl, parameter list, or a handful of the strangest filter URLs. We'll help you find the rule that's actually generating the mess.
Untangle the filter maze

Should every filter URL be blocked in robots.txt?

No. A block may stop crawling without resolving index signals, and it can prevent crawlers from seeing the canonical or noindex needed for that state. The correct treatment depends on the complete routing, linking, crawl, and index contract.

When does a filter combination deserve its own indexable page?

When it serves distinct, durable demand, keeps a stable and useful assortment above its inventory threshold, has one accountable page owner, and can support the required content, internal links, and lifecycle.

What happens when an approved combination becomes empty or low-stock?

We set minimum inventory and unavailable-state rules against live stock, test those edge states, and remove search exposure when the combination can no longer deliver the assortment it promises.

Can filter URLs hurt crawl budget on a large catalog?

They can, especially on a large catalog. A small set of facets can generate more URLs than Google can usefully crawl. We contain that with the state-class rules first, so the crawl budget conversation starts from a controlled set.