Fixing Faceted Navigation on Category Pages
Faceted navigation is the filter panel on a category page: size, colour, brand, price, material. Done well, it helps shoppers get from two hundred products to the six they want. Done badly, it hides useful options, offers filters that return nothing, and produces filtered pages that all carry the same title and compete with the category itself.
The Ecommerce Audit checks how faceted navigation is handled on your store pages. This guide is about the page side: which filters to offer, how they should behave, and how to turn the few filtered views people really search for into proper landing pages.
Two sides of the same problem
Filters cause two separate kinds of trouble, and it helps to keep them apart.
- The crawl side. Every combination of filters, sort orders and page numbers can produce a new URL. On a large shop that can mean millions of addresses for a few thousand products, and search engines spending their time on them. This is covered in Fixing faceted URL explosion and the Ecommerce Crawl fixes, including robots.txt patterns and log analysis.
- The page side. What a shopper sees and uses, and what a search engine finds when it lands on a filtered view: whether the filters make sense, whether a filtered page has a clear purpose, and whether it competes with or supports the category. That is what this guide covers.
The two meet in one decision: which filtered views should exist as indexable pages. Get that decision right on the page side and the crawl side becomes much easier to control, because you know exactly which URLs you want and which you do not.
What goes wrong on the page
| Symptom | What the shopper experiences | What search engines see |
|---|---|---|
| Filters that return zero results | A dead end after clicking | Empty pages, sometimes reported as soft 404s |
| Filtered views with the category's title and H1 | No confirmation that the filter worked | Many pages with identical titles competing with the category |
| Filter labels in supplier language | "Colour family: GRY-02" means nothing | Filter values that match nothing people search for |
| Too many filters, in no order | Scrolling through fifteen groups on a phone | A large block of links on every category page |
| Filters that only work with JavaScript clicks | Usually fine, until a script fails | No crawlable path to the filtered views you did want found |
| Valuable filtered views with no text or links | Works, but no guidance | A thin page that is hard to rank even when people search for exactly that |
Notice the last row. Some filtered views match real searches. "Black leather ankle boots" or "oak dining tables that seat 8" are the kind of phrases shoppers type, and a filtered view is often the best page on your site to answer them. The mistake is treating every filter the same way, either letting all of them be indexed or blocking all of them.
Choosing filters shoppers actually use
Filters should be built from how people choose, not from whatever attributes happen to exist in the product feed. Useful evidence:
- Site search terms. If people type "wide fit" into your search box on the boots category, "Width" should probably be a filter.
- Filter usage in analytics. Many filter apps and analytics setups record which filters are clicked. A filter nobody touches in six months is clutter.
- Customer questions. Repeated questions about one attribute, such as "which of these are dishwasher safe?", suggest a missing filter.
- Search Console queries for the category URL. Attribute words that appear often, such as a colour, material or size, are candidates for both a filter and a landing page.
Order and labels
Put the two or three filters that split the range most usefully at the top, and collapse the rest. Use the words customers use: "Heel height" rather than "Heel_H", "Seats" rather than "Capacity (persons)". Show product counts beside each value and hide or disable values that would return nothing with the current selection. Keep one sort control, separate from the filters, with a sensible default such as best sellers or relevance.
How filters should behave
Filters have to be predictable for people and understandable for machines. A few rules cover most shops:
- Selected filters are visible. Show them as removable chips above the grid, with a "Clear all" link, so the shopper always knows what they are looking at.
- The URL reflects the selection, consistently. The same selection should always produce
the same URL, with parameters in a fixed order.
?colour=black&size=7and?size=7&colour=blackshould not both exist. - The heading confirms the filter. On a filtered view, change the H1 or add a line under it, such as "Ankle boots: black, size 7 (23 products)".
- The back button works. Filtering with scripts must update the browser history so Back returns to the previous selection, not to the previous page.
- Controls are accessible. Use real checkboxes or buttons with labels, not styled
divelements. Announce result counts to screen readers with a polite live region, and make sure keyboard users can open, use and close the filter panel. The Accessibility fixes cover the patterns in more detail.
Links or buttons?
For filtered views you want search engines to find, the page needs an ordinary <a href>
link to them somewhere, whether in the filter panel, a "Popular searches" block or the category text.
For everything else, buttons or checkboxes that update the grid by script are fine, and they help keep
low-value combinations out of the crawl entirely. Many shops use exactly this split.
Turning the right filters into landing pages
A filter landing page is a filtered view promoted to a proper page: a clean URL, its own title and heading, a short introduction and a place in your internal links. Good candidates share three features:
- People search for that exact combination, which you can see in Search Console queries or keyword tools.
- The combination returns enough products to be useful, not one or two.
- It is stable, so the page will still make sense in six months.
Usually that means one filter applied to a category (a colour, a material, a brand, an obvious size or style), and occasionally two. Price bands, sort orders, stock toggles and three-filter combinations rarely qualify.
For the fictional Northgate Footwear at example.co.uk, the result might look like this:
| Filtered view | Decision | Handling |
|---|---|---|
| Ankle boots + Black | Landing page | /ankle-boots/black/, own title,
intro, self-canonical, linked from the category |
| Ankle boots + Leather | Landing page | /ankle-boots/leather/, same treatment |
| Ankle boots + Black + Size 7 | Not a page | Canonical to /ankle-boots/black/, no crawlable link |
| Ankle boots + Price ยฃ50โยฃ75 | Not a page | Script filter or noindex; canonical to /ankle-boots/ |
| Ankle boots, sorted by price | Not a page | Canonical to /ankle-boots/ |
The canonical tag on a filtered view that is not a page is a hint, not an instruction. It works best when the filtered view is genuinely a subset of the page it points to and when your own internal links do not undermine it by linking heavily to the filtered version.
<!-- On /ankle-boots/?colour=black&size=7 -->
<link rel="canonical" href="https://www.example.co.uk/ankle-boots/black/">
Platform notes
Shopify
Storefront filtering, usually managed with Shopify's Search & Discovery app, adds parameters such
as filter.v.option.color to collection URLs. These cannot be given their own title or text
through the standard admin. The usual way to build a landing page for "black ankle boots" is a separate
collection (automated by colour tag or product option) with its own handle, description and SEO fields,
linked from the parent collection. Older themes use tag URLs such as /collections/ankle-boots/black;
check your live /robots.txt to see which filtered patterns Shopify blocks by default.
WooCommerce
Filtering is normally provided by a plugin, and plugins differ widely: some create query parameters, some create clean paths, some work entirely by script. Check what URLs yours generates before choosing landing pages. A product attribute archive or a dedicated category often makes a better landing page than a filtered URL.
Custom and headless builds
Keep a whitelist of the attribute values that have landing pages, render those with server-side titles, headings and text, and generate links to them. Treat every other selection as client-side state, with the canonical pointing to the nearest whitelisted page or the category.
The fix, step by step
Step 1
List the filters and how shoppers use them
For your top categories, write down every filter group and value currently on offer, then add evidence beside each one: how often it is clicked, which terms people type into site search on that category, and which attribute words appear in Search Console queries for the category URL. Note any values that return zero products, and any group whose labels come straight from supplier data. The Ecommerce Audit findings for faceted navigation give you the starting list of affected pages.
Step 2
Remove, rename and reorder filters
Drop filter groups nobody uses, merge near-duplicates such as "Colour" and "Colour family", and rename every value into the words customers use. Move the two or three most decisive filters to the top and collapse the rest on mobile. Show a product count beside each value and hide or disable values that would return nothing. Keep sorting in its own control rather than mixing it into the filter panel, so shoppers understand the difference.
Step 3
Make each filter behave predictably
Show
the current selection as removable chips with a clear all option, and update the heading or a line under
it to confirm what is being shown and how many products match. Make the same selection always produce
the same URL with parameters in a fixed order. Check the browser Back button returns to the previous
selection. Replace any clickable div filters with labelled checkboxes or buttons so keyboard
and screen reader users can use them.
Step 4
Pick the filtered views worth a landing page
From the evidence in step one, choose single-filter views, and very occasionally two-filter views, that people clearly search for, that return a useful number of products and that will stay stable. Most categories end up with between none and a handful. Record each one in a simple list with its category, filter values and the clean URL it will use. Everything not on the list is treated as a shopper tool rather than a page.
Step 5
Give each landing page its own title, heading and text
For each chosen view, set a title tag and H1 that describe it the way
people search, such as Black Ankle Boots for Women | Northgate, and write a short introduction
specific to that selection. Make the page canonical to itself. Link to it with a normal HTML link from
the parent category, either in the filter panel or a short list of popular options, so shoppers and crawlers
can both reach it directly.
Step 6
Point every other filtered view at its category
For filtered views not on your list, add a canonical tag pointing to the nearest landing page or to the unfiltered category, and make sure titles do not claim to be separate pages. Where possible apply these filters with buttons rather than crawlable links. If you also block patterns in robots.txt for crawl reasons, apply that only to URLs where you are not relying on crawlers reading a canonical or noindex tag.
Step 7
Test on mobile, with a keyboard and in Search Console
Use the filters on a phone and with only a keyboard, checking that selections, counts, clear all and Back all work. Inspect one landing page and one ordinary filtered view with URL Inspection and confirm the canonical Google selects matches your intention. Rerun the Ecommerce Audit on the categories you changed, then watch the Pages report for duplicate and alternate canonical entries settling over the following weeks.
1. Should filtered category pages be indexed?
A small number should, and most should not. Filtered views that match real searches, return enough products and stay stable, such as a category filtered by one colour or material, can make excellent landing pages if you give them their own title, heading and introduction. Views built from several filters, price bands, sort orders or stock toggles rarely match anything people search for and are better pointed at the category with a canonical tag or kept out of the crawl.
2. How many filters should a category page have?
As many as help people choose, which is usually fewer than the product data allows. Base the list on what shoppers search for and click, and remove groups that are rarely used. On mobile, show the two or three most decisive filters first and collapse the rest. A long, unordered panel with fifteen groups makes it harder to find the useful ones, and every extra group adds more links and URL combinations to manage.
3. Is it bad for SEO if filters work with JavaScript only?
Not in itself. Applying filters by script without creating crawlable links is a common way to stop low-value combinations being crawled at all. The catch is that any filtered view you do want found needs a normal HTML link somewhere, such as a list of popular options on the category page. Also make sure the script updates the URL and browser history properly, so shoppers can share, bookmark and go back through their selections.
4. What title should a filtered page have?
If it is one of your chosen landing pages, give it a descriptive title in the words people search, such as the colour or material followed by the product type and your shop name, plus a matching H1. If it is an ordinary filtered view that points its canonical at the category, the title matters much less for search, but it should still confirm the selection to the shopper, for example by adding the filter values to the heading on the page.
5. Can I use canonical tags instead of robots.txt for filter URLs?
For the page side, canonical tags are usually the better tool because they let search engines see the page, understand it is a variation of the category, and consolidate signals. They are hints, though, and on very large shops crawlers may still spend a lot of time fetching filtered URLs. That is where robots.txt rules come in, and the crawl-side guides explain the trade-off. Avoid relying on a canonical tag on a URL you have also blocked.
6. How do I create a filter landing page on Shopify?
Shopify storefront filters add parameters to collection URLs, and those filtered views cannot have their own SEO title or description in the standard admin. The usual approach is to create a separate collection for the combination, such as black ankle boots, using automated conditions on a tag or product option. Give it its own handle, description and search engine listing fields, then link to it from the parent collection so shoppers and crawlers can find it.
7. Why does Search Console show many filtered URLs as duplicates?
Messages such as "Duplicate without user-selected canonical" or "Alternate page with proper canonical tag" in the Pages report are common on shops with filters. The second one is normally fine and means Google is respecting your canonical. The first means filtered views have no canonical, or Google disagrees with it. Add canonicals to filtered views, stop linking heavily to low-value combinations, and check that the page you point to really contains the filtered products.
The Ecommerce Audit checks faceted navigation alongside product page completeness, category page depth, Product and review schema, product images, internal links and product page speed across your top pages.
Open Ecommerce Audit Fixes โ