Handle faceted navigation with canonicals

Facets multiply URLs into thousands of near-duplicates. Decide which combinations deserve indexing, give those unique titles and copy with self-canonicals, and canonicalize the remainder to the closest indexable parent. Block infinite parameter spaces and monitor crawl stats for facet-heavy URLs.

mediumIn codeimpact effort

Why this matters

Index the combinations with demand; canonicalize the rest to a parent.

Get the full breakdown

The extended brief explains when this works, when it does not, and the trade-offs. Join the waitlist and it unlocks for every tip when sign-in opens; MCP access is the paid part.

Join the waitlist

Before you start

  • A crawl of filtered URLs
  • Access to filter link rendering

How to apply it

  1. Inventory facet combinations General best practice

    List every facet and its parameters, then crawl the site to see how many unique URLs the navigation creates. Group them by template.

    Check: The crawl lists at least one URL per facet combination and the total count per template.

  2. Classify indexable combinations

    Keep combinations with search demand and unique inventory. Give each an indexable landing page with its own title and copy, and canonicalize it to itself.

    Check: Each approved facet URL returns 200 with a self-referencing canonical and a unique title.

  3. Canonicalize and block the rest

    Point remaining combinations to the closest indexable parent with a single canonical, and disallow infinite parameter spaces in robots.txt. Remove links to empty results.

    Check: Sampled non-indexable facet URLs canonicalize to the parent and return 200; robots.txt disallows the infinite parameter pattern.

Get the prompt for your agent

A ready-to-paste prompt for your agent that implements this tip and verifies the result in your repo.

Join the waitlist

Source: seo-mcp playbook · curated entry · report an error

Framework notes

nextjs-app

Set `alternates.canonical` in `generateMetadata` based on the URL search params, so filtered variants inherit the parent canonical by default.

shopify

Collection filters render as query parameters; set the canonical in `theme.liquid` to the collection URL without filter parameters.

Official references

Let your agent apply this + 161 more tips.

Pre-order — $19