# 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.

Updated 2026-09-14 · Source: https://porteur.ai/guides/faceted-navigation-seo

## 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.

> Rule: only index facet URLs that map to a query buyers search for, and make everything else unauthorised for crawling or indexing.

## 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 type | When to index | When to hide | Example URL | Title on indexable page |
| --- | --- | --- | --- | --- |
| Brand | Buyers search brand plus category | Brand adds no value alone or duplicates a brand category | /laptops?brand=acme | Acme laptops: 15 models in stock |
| Attributes with intent, like colour or size | You see demand for “{category} {attribute}” | Attribute does not change the intent or creates thin duplicates | /dresses?colour=black | Black dresses: 120 styles |
| Price ranges | Fixed ranges that match demand like “under $500” | Arbitrary sliders or infinite steps | /phones?price=under-500 | Phones under $500 |
| Ratings or reviews | If shoppers search “best rated {category}” and you have stock depth | If it produces same list as the base category | /coffee-machines?rating=4-plus | Best rated coffee machines |
| Availability or shipping speed | Only when it is a strong intent on your site | When it duplicates category without new items | /sofas?delivery=next-day | Sofas 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.

> Warning: do not block with robots.txt and also set noindex on the same URLs. If blocked, Google cannot see your noindex or canonical tags.

## 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

| Pattern | Example | SEO impact | Notes |
| --- | --- | --- | --- |
| Clean indexable facet | /dresses/black | Good | Self canonical, unique copy, linked in nav |
| Clean parameter facet | /phones?price=under-500 | Good | Allow crawl, self canonical, unique copy |
| Near‑duplicate facet canonicalised | /laptops?colour=black | Safe | Noindex and canonical to /laptops when colour has no demand |
| Robots‑blocked sort | /laptops?sort=price-asc | Safe | Disallow in robots.txt, do not link it |
| Endless sliders | /sofas?min_price=123&max_price=987 | Risky | Block by pattern, avoid linking these states, values typical not measured |
| Multi‑select explosions | /shoes?size=7,8,9&colour=blue,black | Risky | Either block multi‑select combos or collapse to one canonical state |
| Fragment‑only UX | /tshirts#size=m | Safe for UX | Does 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

### Should I index every brand filter?

No. If a brand has its own category or buyers search brand plus category on your site, create an indexable page with a clean URL and content. Otherwise, keep brand as a non‑indexable filter, canonical to the base category, or block it in robots if you never want it crawled.

### How many indexable facet pages is too many?

Start with the top two or three per major category, based on demand and stock depth. Add more only when you can give each a unique title, intro, and internal links, and when it earns impressions. You are aiming for depth over breadth, not a long tail made at scale without value.

### Should I use rel canonical or robots.txt to control everything?

Use both where they fit. Canonical and noindex work on pages Google can crawl. Robots.txt stops crawling by pattern. Block useless classes like sort, sliders, and sessions in robots. Use noindex and canonical for facet pages that users can reach via links, but that you do not want in results.

### Can I rely on JavaScript to render filtered products?

If a page should rank, render the product list server side or hydrate fast. Google can render JavaScript, but you want the content and links available on the first fetch. For UX only facets that must not be crawled, fragments with JS are fine.

### Do I need structured data on facet pages?

Use Product and Breadcrumb structured data where it reflects the visible products on the page. Keep it consistent with the selection. If you list products with offers, availability, price, and reviews, include those properties. Do not fake ratings or create self‑serving review markup on categories.

### What about pagination on filtered pages?

Paginated lists can be indexable. Rel next or prev are not used by Google since 2019. Keep each page indexable with its own canonical, or offer a view‑all where it loads fast. Link pages clearly, and avoid letting pagination create loops with parameters.

## Read next

- [Canonical tags: what they do and the mistakes that cost rankings](https://porteur.ai/guides/canonical-tag): What a canonical tag does, when to use one, the mistakes that cost rankings, and how to check and fix canonicals on a small site.
- [Alternate page with proper canonical tag: what Search Console means](https://porteur.ai/guides/alternate-page-with-proper-canonical-tag): What this Search Console status means, when to ignore it, when it hides the wrong page, and the exact checks and fixes to set the right canonical.
- [How to use Google Search Console in ten minutes a week](https://porteur.ai/guides/how-to-use-google-search-console): A quick weekly routine: set four filters, compare 28 days, check pages then queries, and fix three findings, without getting lost in noise.
- [The Search Console performance report, column by column](https://porteur.ai/guides/search-console-performance-report): Every column in the Google Search Console performance report explained with the traps that trip small sites, and how to act on each.
- [URL parameters](https://porteur.ai/glossary/url-parameters): URL parameters are key=value after a question mark. Handle them to avoid duplicate pages, index bloat and wasted crawl, and to keep clean rankings.
- [Category page SEO: the page that ranks for the product type](https://porteur.ai/guides/category-page-seo): Build a category page that wins broad queries: clear H1, intro, subcategory links, top products, clean filters, solid pagination, and fast loads.
- [Next.js SEO: what the framework does for you and what it does not](https://porteur.ai/guides/nextjs-seo): What Next.js gives you for SEO and what still needs your work: metadata, sitemap, robots, rendering, redirects, URLs, images, fonts and links.
- [The 404 page: the status code, and what the visitor sees](https://porteur.ai/guides/how-to-design-a-404-page): Why a 404 must return 404, how soft 404s pollute your index, what belongs on the page for visitors, and when a redirect is the better answer.

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: https://porteur.ai/
