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 useful controls such as size, color, brand, and price. A crawler can see every selection, sort order, parameter sequence, and empty result as another URL, including thousands nobody intended to publish.

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

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.

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

    AI assist
    Crawling the live site to enumerate every facet, sort, and parameter combination actually generating a URL.
    Human gate
    Assigning a real owner to each parameter and confirming the estimate isn't missing a whole generator. Parameter register reviewed by an owner
  2. Separate navigation from search value

    We compare combinations against real demand, stable inventory, existing category ownership, and a distinct shopper task.

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

    AI assist
    Scoring filter-state combinations against demand and inventory signals so a person reviews a ranked shortlist instead of a raw parameter list.
    Human gate
    Making the index, navigation-only, canonicalize, block, redirect, or retire call for each state class. Index decision set per state class
  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.

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

    AI assist
    Checking sampled URLs against the draft matrix to expose contradictory routing, linking, and index directives before release.
    Human gate
    Deciding which instruction takes precedence when two rules genuinely conflict for the same URL class. Every rule-matrix conflict is resolved
  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.

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

    AI assist
    Preparing title, heading, and structured-data fields for approved combinations from the agreed template.
    Human gate
    Verifying that demand and stock still support a permanent, indexable page before the combination is built. Every backlog item is approved individually
  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.

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

    AI assist
    Generating the full matrix of edge-case URL examples, reordered, malformed, low-stock, to run through the live template.
    Human gate
    Judging whether a boundary-test failure blocks the broader rollout or is an acceptable, documented exception. Boundary report cleared before scale-out

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

    Accepted when

    Every state class includes examples, its shopper purpose, search treatment, page owner, and review owner.

  • Decision matrix

    Crawl & index rule matrix

    Accepted when

    Internal links, HTTP status, robots, noindex, canonical, sitemap inclusion, parameter order, pagination, and empty-state behavior agree for every class.

  • Prioritized backlog

    Valuable combination backlog

    Accepted when

    Every candidate has distinct demand, one page owner, stable product rules, a minimum inventory threshold, and a defined lifecycle.

  • Evaluation sheet

    Boundary assertion report

    Accepted when

    Representative states match the expected rule live. Failures name the generator, owner, release, and rollback.

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

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.