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.
Why this matters
Index the combinations with demand; canonicalize the rest to a parent.
Before you start
- A crawl of filtered URLs
- Access to filter link rendering
How to apply it
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.
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.
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.
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.