Faceted navigation SEO: which filters to index and how to hide the rest

Faceted filters spawn near infinite URLs. Most should never be crawled or indexed. This guide shows how to choose the few that deserve search traffic, how to block the rest, and how to verify it in Search Console.

By , founder of Porteur · Updated 14 September 2026 · Markdown

Why faceted navigation causes index bloat

Every new filter can multiply URLs. Colour, size, brand, price, rating: soon you have thousands of combinations. Most have no demand. Google can waste crawl on them, miss the pages that sell, and duplicate your own content.

You want two things. People find the few filtered views they actually search for. Crawlers skip the rest so product and category pages get crawled and ranked.

What Google says about faceted filters, as of 2026

Google’s e‑commerce guidance is clear: filters create many URLs. Make indexable only the facet combinations with search demand. Keep the rest out with robots.txt disallow of the parameter patterns or with noindex. Avoid infinite combinations. Keep the canonical on the unfiltered page. Use fragments only for facets that must not be crawled.

Keep parameters minimal and consistent. Give each real page one URL. Variants get their own URL only when buyers search for them, else they canonical to the parent product. Categories are real pages with links and breadcrumbs. Pagination uses indexable pages or a view‑all page, not rel next or prev, which Google dropped in 2019.

Decide per facet: indexable, or hidden

Work facet by facet. Give each a policy and stick to it. Use your own query data, and the shop’s category strategy.

Facet typeWhen to indexWhen to hideExample URLTitle on indexable page
BrandBuyers search brand plus categoryBrand adds no value alone or duplicates a brand category/laptops?brand=acmeAcme laptops: 15 models in stock
Attributes with intent, like colour or sizeYou see demand for “{category} {attribute}”Attribute does not change the intent or creates thin duplicates/dresses?colour=blackBlack dresses: 120 styles
Price rangesFixed ranges that match demand like “under $500”Arbitrary sliders or infinite steps/phones?price=under-500Phones under $500
Ratings or reviewsIf shoppers search “best rated {category}” and you have stock depthIf it produces same list as the base category/coffee-machines?rating=4-plusBest rated coffee machines
Availability or shipping speedOnly when it is a strong intent on your siteWhen it duplicates category without new items/sofas?delivery=next-daySofas with next day delivery

Indexable facet pages need their own page components: a unique H1, intro copy that explains the selection, and internal links. They should not feel like the base category with a tag flipped. Example: /dresses/black with a heading “Black dresses”, short intro, links to top sub‑styles, and the product grid.

Pick one URL pattern and parameter order

Your crawl health depends on stable URLs. A single facet view must map to one URL, not many. Keep parameters short, named, and always in the same order. Use hyphens in values. Avoid case changes.

  • Good: /laptops?brand=acme&colour=black&price=under-500
  • Bad: /laptops?colour=Black&b=Acme&maxprice=500 and /laptops?b=Acme&colour=Black&mp=500
  • Preferred order: brand, attribute, price, sort. Your order can differ, keep it consistent across the site.

If your platform supports subfolders for key facets, use them for the few indexable ones. Example: /dresses/black, not /dresses?colour=black. Keep the parameter version canonical to the folder version, and use internal links to the folder version only.

Robots, noindex, canonical: what to use when

You have three levers. Robots.txt disallow prevents crawling of URL patterns. Noindex removes URLs from the index. Canonical suggests the preferred URL for duplicates. They work together when you plan them per facet.

  • Robots.txt disallow pattern: use for whole classes you never want crawled, like session IDs, sort orders, sliders, or free‑text search filters. Example: Disallow: /*?sort=*, Disallow: /*?q=*, Disallow: /*?min_price=*, Disallow: /*?size=*&colour=* to block multi‑select combos if needed.
  • Noindex: use when the crawler may reach a URL via links, but you do not want it in results, and you still want Google to see its canonical hint. Place a meta robots noindex on the page. Do not block it in robots.txt or Google will not see the tag.
  • Canonical: use when a facet URL is a duplicate or near duplicate of the base category. Keep canonical on the unfiltered page for non‑indexable facets. Example: /laptops?colour=black canonical to /laptops.
  • Indexable facet pages: remove noindex, allow crawling, set a self‑referencing canonical, and add unique title, H1, intro, and schema matching the selection where relevant.

When to use fragments for filters

Fragments are the part after a hash. Example: /laptops#colour=black. Google does not send fragments to the server and does not use them as a separate URL for crawling. Use fragments only for filters that must never be crawled and never be indexable. They are fine for UX only facets like quick size toggles.

Do not put indexable content behind fragments. If you want a filter to rank, give it a crawlable URL and page content that matches the selection. Example: /sofas/grey with a heading and copy, not /sofas#colour=grey.

A simple decision tree for each facet

  1. Check demand

    Look at Search Console queries for the category. Check for phrases like “black dresses” or “sofas under 500”. Note the top two or three.

  2. Choose the URL form

    For the few with demand, prefer a subfolder or clean parameter page you can template. For others, keep them as parameters or fragments.

  3. Set the control

    Indexable: allow crawl, self canonical, no noindex. Non‑indexable: either noindex and canonical to the base, or block the parameter in robots.txt when you never need Google to see them.

  4. Make the page real

    Add a unique title and H1. Write one or two intro lines. Link to it from the parent category. Keep pagination working. Load products server side.

  5. Test and monitor

    Fetch with Search Console’s URL inspection. Check the canonical Google chose. Watch the Performance report for the target queries.

Examples: good, risky, and safe patterns

PatternExampleSEO impactNotes
Clean indexable facet/dresses/blackGoodSelf canonical, unique copy, linked in nav
Clean parameter facet/phones?price=under-500GoodAllow crawl, self canonical, unique copy
Near‑duplicate facet canonicalised/laptops?colour=blackSafeNoindex and canonical to /laptops when colour has no demand
Robots‑blocked sort/laptops?sort=price-ascSafeDisallow in robots.txt, do not link it
Endless sliders/sofas?min_price=123&max_price=987RiskyBlock by pattern, avoid linking these states, values typical not measured
Multi‑select explosions/shoes?size=7,8,9&colour=blue,blackRiskyEither block multi‑select combos or collapse to one canonical state
Fragment‑only UX/tshirts#size=mSafe for UXDoes not create crawlable URLs, will not rank

Platform notes and Shopify specifics

Some platforms limit URL shapes. Work within the rules but keep the policy the same: few indexable, most hidden, one canonical target.

  • Shopify uses fixed product and collection paths: /products/handle, /collections/handle, and /collections/handle/products/handle with an automatic canonical to /products/handle.
  • Shopify sitemaps are automatic. You can edit robots.txt since 2021 with robots.txt.liquid. Use it to disallow sort and price slider parameters, and any multi‑select explosions.
  • Title and description fields exist per product and collection. Use collection pages for your indexable facet pages when possible, or create custom collections like /collections/black-dresses mapped from a rule. Link to them from the parent category.
  • Most Shopify themes ship Product and Breadcrumb structured data. Check it. Add one image per variant and alt text. Keep category copy short and clear, and do not let tags or vendor pages create thin URLs.

How to check what Google has indexed

You need to confirm three things: which facet URLs are indexed, which are excluded, and which canonical Google picked. Use Search Console, not guesswork.

  • Performance report: filter queries for the target phrases, like “black dresses”. See which pages get impressions and clicks.
  • URL inspection tool: paste one indexable facet page, check the “User‑declared canonical” and “Google‑selected canonical”. They should match.
  • Pages report: look at Excluded by noindex tag and Blocked by robots.txt. Your non‑indexable facet URLs should sit here, not in Indexed.
  • site: search: run site:yourstore.com inurl:?colour= to spot crawled states. Pair it with -inurl to narrow. This is indicative only.
  • Logs or crawl stats: in the Crawl stats report, check for spikes from parameters you meant to block. Adjust robots patterns if needed.

A fixed set will look like this: your /dresses/black page shows as indexed with a self canonical. The parameter version /dresses?colour=black is discovered but excluded by noindex with a canonical to /dresses. Sort orders never show, as robots has them disallowed.

Questions

Sources

Check my site, free

Want a second set of eyes on your filters and URLs? Paste a category URL and get a free Porteur check in about thirty seconds with three findings.

  • Free check, no card
  • Read-only, your own accounts
  • Readable by your agent

Read next