# Faceted Navigation on Shopify: Which Filter Pages Should Google Index?

Source: https://www.smartecomseo.com/blog/shopify-faceted-navigation-seo/  
Published: 2026-09-15  
Updated: 2026-09-29

How Shopify Search & Discovery filter URLs work in 2026, what Shopify's canonicals and robots.txt already do with them, and when to build a real collection instead.

## Key takeaways

- On Shopify, filtered collection URLs canonicalize to the unfiltered collection by default, and URLs with two or more filters are blocked by the default robots.txt.
- Price filters always use two parameters, so price-filtered URLs are blocked from crawling by Shopify's default rules.
- Since March 2026, grouped filter values produce URLs with IDs like gid://shopify/FilterSettingGroup/123, which makes filter URLs even worse landing pages.
- When a filter value has real search demand, build a smart collection for it with its own handle, copy and links instead of indexing the filter URL.
- Pick one signal per filter type: crawlable with canonical, crawlable with noindex, or blocked in robots.txt. Stacking them hides the noindex from Google.

Filters are the best thing on a big Shopify collection page for shoppers and the most dangerous for crawl budget. A collection with six filters and 40 values can produce thousands of URLs, most showing a slightly different grid of the same products. The question every large catalog eventually asks: should any of those filter pages be in Google?

Our answer, almost always: no. When a filter combination deserves to rank, build a real collection for it. Below is how Shopify's filters work in 2026, what Shopify already does to keep them out of the index, and the decision rule we use for high-ticket and big catalogs.

## How Shopify filters work

Shopify's storefront filtering (configured in the Shopify Search & Discovery app) works on collection and search pages. Filters can be based on availability, category, price, tags, product type, vendor, variant options and metafields. Values within one filter are combined with OR; different filters are combined with AND.

Every applied filter is written into the URL as a parameter:

| Filter | URL parameter example |
| --- | --- |
| Availability | `filter.v.availability=1` |
| Price range | `filter.v.price.gte=1000&filter.v.price.lte=3000` |
| Variant option | `filter.v.option.color=Black` |
| Product type | `filter.p.product_type=Sauna` |
| Vendor | `filter.p.vendor=BrandName` |
| Product tag | `filter.p.tag=infrared` |
| Product metafield | `filter.p.m.custom.capacity=4-person` |
| Category | `filter.p.t.category=…` |

`p` means a product-level filter and `v` a variant-level one. Metafield filters follow the `filter.p.m.namespace.key` pattern.

### Two 2026 details that change the SEO picture

- **Filter values are becoming IDs, not words.** Shopify's changelog (March 16, 2026) says filters using grouped values now produce URLs like `filter.v.option.color=gid://shopify/FilterSettingGroup/123` instead of `=Blue`. On Shopify's Dawn demo store, the color swatch filter already outputs `gid://shopify/Metaobject/…` values. Shopify says older URLs "will continue to work as expected"; some SEOs have reported old text-value links no longer applying the filter. If you have external links or ads pointing at filter URLs, open them and check the product count.
- **Filters have limits.** Shopify's help center lists up to 25 filters per store, a maximum of 100 values displayed per filter on the storefront, and no filters at all on collections with more than 5,000 products.

The first point alone settles a lot: a URL ending in `gid://shopify/FilterSettingGroup/123` is not a page you want as a search result.

## What Shopify already does with filter URLs

We tested filtered URLs on Shopify's Dawn demo store and on live stores in September 2026.

**Canonical tags.** On Dawn, `/collections/bags?filter.v.availability=1` carries a canonical to `/collections/bags`. Sort URLs (`?sort_by=price-ascending`) do the same. Custom themes and apps can override this, so check yours.

**robots.txt.** Shopify's default rules block the URLs most likely to multiply:

```text
Disallow: /collections/*sort_by*
Disallow: /collections/*+*
Disallow: /collections/*filter*&*filter*
```

The third rule blocks any collection URL with two or more `filter` parameters. Price ranges always use two parameters (`gte` and `lte`), so price-filtered URLs are blocked by default. Two values from the same filter written as repeated parameters are blocked too. What stays crawlable is the single-filter URL: `?filter.p.vendor=BrandName`.

Exact spelling varies by version. The older default writes the filter rule as `*/collections/*filter*&*filter*`, which also matches Markets subfolders; the newer 2026 file we saw has `/collections/…` and a separate `/*/collections/…` rule. Read your own `/robots.txt` to confirm.

So by default: single-filter pages can be crawled and canonicalize to the collection; multi-filter pages aren't crawled at all. For most stores, that's a sensible baseline.

## Should any filter page be indexed?

Filter pages fail as landing pages for predictable reasons:

- **No editable SEO title, description or copy.** The filtered page shows the parent collection's copy, which targets a different keyword.
- **Canonical to the parent.** Shopify is telling Google not to index it. Overriding that in the theme is fragile.
- **Unstable URLs.** Parameter order, GID values and filter renames all change the address.
- **No place in navigation.** Filter links appear in a sidebar form, not as links from menus, guides and other collections.

Meanwhile, the searches behind them are often valuable. "4 person infrared sauna", "36 inch built-in gas grill", "8 ft slate pool table". Those are buyer keywords with clear intent. They deserve pages; they just shouldn't be filter URLs.

## The rule: build a real collection

For every filter value or combination with real search demand, create a dedicated collection. Here's the decision process we use:

1. **Check demand.** Does the phrase have meaningful search volume, or does it show up in Search Console queries for the parent collection?
2. **Look at page one.** If Google ranks category pages for the phrase, a collection can win. If page one is all buying guides, write a guide and link it to the collection. As Zack puts it: look on page one; Google shows you exactly what it rewards.
3. **Check the product set.** A collection needs enough products to be useful and to stay stable. Three products is a thin page on most catalogs.
4. **Build it as a smart collection.** Shopify's automated collections support conditions on tag, product type, vendor, title, category, price, variant title, inventory and metafields (for metafield definitions with the collection-condition option enabled). Use the same metafield that powers the filter, so the collection and the filter stay in sync.
5. **Give it everything a filter page can't have.** Its own handle (`/collections/4-person-infrared-saunas`), title tag, meta description, intro copy, FAQ and links from the parent collection and from guides.

| Signal | Filter URL | Real collection |
| --- | --- | --- |
| Own title tag and copy | No | Yes |
| Self-canonical | No, points to parent | Yes |
| In the sitemap | No | Yes |
| Linkable from menus and guides | Awkward | Yes |
| Stable URL | No | Yes |
| Tracked in Search Console as its own page | No | Yes |

This is the core of our [collection page SEO](/shopify-seo-services/collection-page-seo/) work. One product can rank for thousands of keywords, and collection pages are how you capture them. One of our client stores built 360+ pages, largely collections like "X for Motorcycles" and "X for Semi Trucks", on a catalog of only 30 products.

### Worked example: a sauna collection

Say a store sells 180 saunas and the `/collections/saunas` page has filters for type, capacity, location, wood, brand, price and availability. Here's how we'd sort the filter values:

| Filter value | Decision | Reason |
| --- | --- | --- |
| Type: Infrared | Build `/collections/infrared-saunas` | A core buyer keyword with its own page-one results |
| Location: Outdoor | Build `/collections/outdoor-saunas` | Different buyer, different questions (weatherproofing, heaters) |
| Capacity: 4-person | Build it if Search Console or keyword tools show demand | Capacity searches are common in this category, but check first |
| Wood: Cedar | Build it only if the demand is real | Some wood types are searched, others only filtered |
| Brand | Build brand collections if you're a multi-brand retailer | Brand + product type searches convert well |
| Price range | Leave as a filter | Already blocked by the default robots.txt |
| Availability | Leave as a filter, consider blocking | No search demand at all |

Combinations follow the same rule. "Outdoor infrared sauna" can justify its own collection; "outdoor infrared cedar 4-person sauna" almost never does. On most catalogs we cap combinations at two attributes unless the data says otherwise.

### Link the filter to the collection

Once the collection exists, make shoppers and crawlers find it from the parent. Two patterns work well:

- **"Shop by" links** above the grid: plain `<a href>` links to the sub-collections (by size, fuel type, capacity).
- **Collection-aware filter chips**: when a shopper selects a filter value that has its own collection, show a link to that collection alongside the filtered results.

### Filters and AI search

The same logic applies to ChatGPT, Perplexity and Google's AI features. When an assistant answers "best 4 person outdoor sauna", it cites pages that clearly describe a product set: a collection with specs, copy and FAQs. A filtered URL with the parent's generic copy gives it nothing to quote. Real collections serve both channels, which is part of how we approach [GEO for Shopify stores](/geo-agency/).

## Tag pages vs filters

Before Search & Discovery, themes filtered by tag with URLs like `/collections/saunas/infrared`. Many stores still have these links in their theme or menus. On Dawn, a tag page is self-canonical and indexable, and combinations (`infrared+outdoor`) are blocked in robots.txt. Shopify's help center also says tag URLs can't be redirected.

Treat tag pages like filters: if one has demand, replace it with a real collection and update the links; otherwise add `noindex, follow`. The snippet and the rest of the duplicate URL types are in [Shopify duplicate content, explained](/blog/shopify-duplicate-content/).

## Optional hardening

If Search Console shows single-filter URLs being crawled heavily (Settings > Crawl stats, "By purpose" and example URLs) or indexed despite the canonical, you have two tools.

### 1. Block low-value single filters in robots.txt.liquid

Add rules to Shopify's default group rather than replacing it. This follows the pattern in Shopify's own documentation:

```liquid
{% for group in robots.default_groups %}
  {{- group.user_agent }}

  {%- for rule in group.rules -%}
    {{ rule }}
  {%- endfor -%}

  {%- if group.user_agent.value == '*' -%}
    {{ 'Disallow: /collections/*filter.v.availability*' }}
    {{ 'Disallow: /*/collections/*filter.v.availability*' }}
  {%- endif -%}

  {%- if group.sitemap != blank -%}
    {{ group.sitemap }}
  {%- endif -%}
{% endfor %}
```

Block filters that never have search demand (availability, sometimes price). Don't block a filter whose URLs are already indexed and getting clicks until the replacement collection is live and linked.

### 2. Add noindex to filtered states

A `noindex` only works on URLs Google can crawl, so this only matters for single-filter URLs. In `theme.liquid`, inside `<head>`:

```liquid
{%- liquid
  assign is_filtered = false
  if template.name == 'collection'
    for filter in collection.filters
      if filter.active_values.size > 0
        assign is_filtered = true
      endif
      if filter.type == 'price_range'
        if filter.min_value.value != nil or filter.max_value.value != nil
          assign is_filtered = true
        endif
      endif
    endfor
  endif
-%}
{%- if is_filtered -%}
  <meta name="robots" content="noindex, follow">
{%- endif -%}
```

Shopify's `filter` object exposes `active_values` for list and boolean filters and `min_value` / `max_value` for price ranges. Test it on an unfiltered collection first to make sure the main page doesn't pick up the tag.

> **Don't stack every signal:** Blocking a URL in robots.txt means Google can't see its `noindex` or canonical. Pick one approach per filter: crawlable with canonical (the default), crawlable with `noindex`, or blocked. Mixing them makes Search Console reports harder to read.

**Sitting on filter pages that should be collections?** We map your filter values to search demand and build the collection pages that deserve to rank, with copy and internal links. [See large catalog SEO](/shopify-seo-services/large-catalog-seo/)

## Mistakes we see on big catalogs

- **Menu links to filter URLs.** "Shop black sofas" pointing at `?filter.v.option.color=Black` sends internal links to a page that canonicalizes away. Build the collection and link that.
- **A pasted plain-text robots.txt.liquid.** It drops Shopify's default filter and sort rules the next time Shopify updates them, or immediately if the pasted copy was incomplete.
- **Self-canonical filter pages.** Editing the theme so filtered URLs canonicalize to themselves, "to get them indexed", usually produces thousands of thin pages and a messy Page indexing report.
- **A filter for every metafield.** The store limit is 25 filters. Keep the ones shoppers use; each extra filter adds URLs without adding sales.

## Monitoring

- **Page indexing report:** search the examples for `filter.` and `sort_by`. A few are fine; hundreds mean something is linking to them.
- **Crawl stats:** if parameter URLs dominate the sample, look for internal links to filtered URLs (menus, banners, "shop black" buttons).
- **Performance report:** filter pages by `filter.` to see whether any earn clicks. Those are your first candidates for real collections.

Faceted navigation is one piece of running a big catalog. For the rest, work through the [Shopify SEO checklist for big catalogs](/blog/shopify-seo-checklist/) or see how we approach [large catalog SEO](/shopify-seo-services/large-catalog-seo/).

## FAQs

### Should Shopify filter pages be indexed?

Almost never. Shopify filter URLs share the parent collection's title and copy, canonicalize to the parent by default, and can change when filters are renamed or grouped. When a filter value matches a real buyer search, create a dedicated collection for it with its own handle, title tag, copy and internal links, and let the filter stay a filter.

### Does Shopify block filter URLs in robots.txt?

Partly. The default robots.txt disallows collection URLs containing two or more filter parameters, sort_by URLs and tag combinations with a plus sign. URLs with a single filter parameter remain crawlable, but on standard themes they carry a canonical to the unfiltered collection. Check your live /robots.txt, because customized templates can differ.

### What do filter.p.m and filter.v mean in Shopify URLs?

They are Shopify storefront filter parameters. filter.p applies to product-level data and filter.v to variant-level data. filter.p.m.namespace.key filters by a product metafield, filter.v.option.color by a variant option, filter.v.price.gte and filter.v.price.lte by price, and filter.v.availability by stock status.

### Can I block Shopify filter URLs with robots.txt.liquid?

Yes. Add a robots.txt.liquid template that loops over robots.default_groups and appends your own Disallow rules to the group for all user agents, as Shopify's documentation shows. Block only filters with no search demand, such as availability, and don't block URLs that already earn clicks until a replacement collection is live.

### Are Shopify tag pages the same as filters?

Not quite. Tag pages use the older /collections/handle/tag URL format and are self-canonical and indexable by default, while Search & Discovery filters use filter parameters and canonicalize to the collection. Shopify says tag URLs can't be redirected. Treat both the same way: build real collections for keywords with demand and noindex the rest.