---
title: "Faceted Navigation SEO: Control Filter URLs at Scale"
description: "Control faceted navigation SEO with a URL-state matrix for indexable filters, sort states, empty results, crawl paths, and infinite combinations."
canonical: "https://nikoalho.fi/writing/faceted-navigation-seo/"
language: "en"
---

> Canonical source: [https://nikoalho.fi/writing/faceted-navigation-seo/](https://nikoalho.fi/writing/faceted-navigation-seo/)

[← writing](https://nikoalho.fi/writing/)

Technical SEO Published 2026 · 07 · 21 Updated 2026 · 07 · 21

# Faceted navigation SEO: decide which filter URLs deserve to exist

Control faceted navigation with an explicit URL-state matrix for indexable landings, useful filters, sort states, empty sets, and infinite combinations.

![Niko Alho](https://nikoalho.fi/assets/niko-alho-avatar-96.webp)

**Niko Alho**Operator in Turku · firsthand systems

![Editorial illustration for Faceted navigation SEO: decide which filter URLs deserve to exist](https://nikoalho.fi/visuals/faceted-navigation-seo-960.webp)

ON THIS PAGE

[01 Classify five facet states](#classify-five-facet-states) [02 Build an indexable facet owner only when it earns one](#build-an-indexable-facet-owner-only-when-it-earns-one) [03 Stop exposing interface states as crawl paths](#stop-exposing-interface-states-as-crawl-paths) [04 Understand what canonical can and cannot do](#understand-what-canonical-can-and-cannot-do) [05 Understand what noindex can and cannot do](#understand-what-noindex-can-and-cannot-do) [06 Use robots rules for a measured fetch problem](#use-robots-rules-for-a-measured-fetch-problem) [07 Return honest states for empty and invalid combinations](#return-honest-states-for-empty-and-invalid-combinations) [08 Keep sitemaps limited to owner URLs](#keep-sitemaps-limited-to-owner-urls) [09 Link curated facets from a real hierarchy](#link-curated-facets-from-a-real-hierarchy) [10 Test facets by pattern and order](#test-facets-by-pattern-and-order) [11 Monitor demand, crawl, and inventory together](#monitor-demand-crawl-and-inventory-together) [12 Use the smallest useful indexable set](#use-the-smallest-useful-indexable-set)

PROGRESS

0%

ON THIS PAGE 12 sections

[01 Classify five facet states](#classify-five-facet-states) [02 Build an indexable facet owner only when it earns one](#build-an-indexable-facet-owner-only-when-it-earns-one) [03 Stop exposing interface states as crawl paths](#stop-exposing-interface-states-as-crawl-paths) [04 Understand what canonical can and cannot do](#understand-what-canonical-can-and-cannot-do) [05 Understand what noindex can and cannot do](#understand-what-noindex-can-and-cannot-do) [06 Use robots rules for a measured fetch problem](#use-robots-rules-for-a-measured-fetch-problem) [07 Return honest states for empty and invalid combinations](#return-honest-states-for-empty-and-invalid-combinations) [08 Keep sitemaps limited to owner URLs](#keep-sitemaps-limited-to-owner-urls) [09 Link curated facets from a real hierarchy](#link-curated-facets-from-a-real-hierarchy) [10 Test facets by pattern and order](#test-facets-by-pattern-and-order) [11 Monitor demand, crawl, and inventory together](#monitor-demand-crawl-and-inventory-together) [12 Use the smallest useful indexable set](#use-the-smallest-useful-indexable-set)

**TL;DR** The useful bits

-   13-min read
-   5 URL states

1.  01 A facet is an interface control; it becomes an SEO landing page only when the business deliberately assigns it demand, inventory, a stable URL, and links.
2.  02 Prevent crawlable URL generation for sort, view, session, and combinatorial states that have no search purpose.
3.  03 Canonical and noindex do not reclaim the crawl requests required to discover and process exposed combinations.
4.  04 Indexable facets need standard URL rules, self-canonical ownership, useful inventory, curated internal links, and 404 behavior for empty sets.
5.  05 Monitor the graph with logs, crawls, Search Console, inventory, and internal-search demand — not URL counts alone.

A/01 Direct answer

How should faceted navigation be handled for SEO?

Classify every facet state before choosing a directive. Create indexable owner URLs only for combinations with distinct demand, stable useful inventory, maintainable content, and deliberate internal links. Keep interface-only filters usable without exposing an infinite crawlable URL graph, and return 404 for combinations with no results.

Evidence Google's faceted-navigation documentation recommends preventing crawling when facet URLs do not need indexing. For indexable facets it specifies stable URL syntax and ordering, standard separators, and 404 responses for empty combinations.

**Faceted navigation SEO** is the control system that decides which filtered listing states become durable search landing pages and which remain user-interface states. The filter UI is not the problem. Unbounded crawlable combinations without ownership are.

A catalog with 10 colors, 12 sizes, 30 brands, 8 materials, 6 price bands, and several sort orders can expose far more URL states than products. Most combinations do not satisfy a new intent. Some return no inventory. Others show the same products in a different order.

The fix starts before robots directives: decide which states deserve to exist as URLs, links, and indexable documents.

## Classify five facet states

Use five operational states instead of one rule for every parameter.

**Indexable landing set.** A selected combination satisfies distinct demand, carries useful inventory, has a standard URL, receives curated internal links, and can be maintained as an owner.

**Useful filter state.** The filter helps a buyer but does not satisfy a separate search intent. It can remain functional without being promoted into the indexable architecture.

**Sort or view state.** The products remain the same while order or presentation changes. This is an interaction, not a new resource.

**Empty combination.** The selected attributes cannot produce a useful result. The server should validate the state and return a real missing response rather than an unlimited successful empty template.

**Infinite or near-duplicate combination.** Multiple orderings, repeated parameters, arbitrary values, or nested selections create a crawl space with no product purpose. Prevent the graph at source.

This classification controls link generation, response status, canonical behavior, sitemap membership, and monitoring. Do it before choosing noindex or robots.txt.

FACET CONTROL MATRIX

### Decide the URL state before choosing the directive.

| Facet state | Demand | Inventory | Discovery | Treatment |
| --- | --- | --- | --- | --- |
| Durable landing set | Distinct, proven | Enough stable products | Curated HTML links | **Indexable owner URL** |
| Useful user filter | No separate intent | Changes often | Interface control | **Available, not promoted for indexing** |
| Sort or view state | None | Same products | Form or button | **Do not create crawlable links** |
| Empty combination | None | Zero products | Should not persist | **404 after validation** |
| Infinite combination | None | Near-duplicate | Generated parameters | **Prevent crawling at source** |

Canonical and noindex are not substitutes for deciding which combinations should exist, receive links, and return products.

## Build an indexable facet owner only when it earns one

An indexable facet page needs the same operating qualities as any category owner:

-   a distinct, demonstrated query intent;
-   enough relevant inventory to be useful;
-   reasonable inventory stability;
-   one normalized URL and parameter order;
-   a successful response and self-canonical;
-   a unique, accurate title and H1;
-   contextual selection guidance where useful;
-   crawlable internal links from relevant categories, guides, or navigation;
-   inclusion in a curated sitemap only when the URL is a durable owner;
-   a removal or consolidation policy if the inventory disappears.

Search volume alone is not enough. A page for an attribute combination that is empty half the year creates a poor owner. Inventory alone is not enough either. A database can return products for thousands of combinations nobody asks for.

Use internal search, filter usage, merchandising data, query impressions, paid-search terms, sales conversations, and customer support questions to find combinations that may deserve promotion.

## Stop exposing interface states as crawl paths

The strongest crawl-control measure is not generating unnecessary crawlable links.

Sort controls, view toggles, price sliders, session states, and repeated multi-select combinations usually do not need standard anchors to every possible URL. Use forms, buttons, or client-side state where the action is an interface change rather than navigation to a durable resource. Maintain keyboard and accessibility behavior while making the resource model honest.

Also normalize generated URLs:

-   use one parameter name per facet;
-   use a stable parameter order;
-   avoid several URL encodings for the same selection;
-   reject repeated and invalid values;
-   avoid paths where the same facet can be expressed in both path and query syntax;
-   remove session, analytics, and presentation parameters from internal links.

Google specifically warns that alternate parameter order and non-standard separators can create duplicate crawl paths. A consistent URL function is a prerequisite for every later directive.

## Understand what canonical can and cannot do

`rel="canonical"` can nominate an owner among duplicate or near-duplicate documents. It does not prevent a crawler from discovering or fetching alternates.

Canonicalizing every filter to the parent category is therefore not a crawl-control system. It may also be semantically wrong. A curated “red running shoes” landing page with distinct demand and maintained content should not point its ownership away merely because it uses a filter engine underneath.

Use a parent canonical when the filtered state is genuinely an alternate representation of the same listing and the crawler still needs to access it. Align internal links and sitemap entries with the nominated owner. Do not block the alternate in robots.txt if the crawler needs to inspect its canonical relationship.

See the [canonical tag protocol](https://nikoalho.fi/writing/canonical-tags/) for the full signal cluster.

## Understand what noindex can and cannot do

Noindex can keep a fetched page out of search results after the crawler processes the directive. It does not stop the crawl request that made processing possible.

That makes noindex useful for some public, reachable states that should not appear in search. It is a poor first response to an infinite parameter graph. If the site links to millions of noindex combinations, crawlers still have to discover and revisit some of that graph to observe the instruction.

Do not combine robots blocking with an expectation that a newly added noindex will be seen. A blocked crawler cannot fetch the page-level directive.

## Use robots rules for a measured fetch problem

Robots.txt can prevent crawling of matched URL patterns. It does not guarantee that a known URL disappears from an index, and it prevents the crawler from reading the page’s canonical or noindex.

Use it after the URL policy is clear:

1.  prevent unnecessary link and URL generation;
2.  preserve crawlable access to selected indexable facet owners;
3.  identify a stable parameter pattern with no indexing purpose;
4.  confirm that blocking it will not hide required assets or owner pages;
5.  measure requests in logs before and after release;
6.  monitor for blocked URLs that remain known through external or legacy links.

The [robots.txt versus noindex guide](https://nikoalho.fi/writing/robots-txt-vs-noindex/) covers these boundaries.

## Return honest states for empty and invalid combinations

An empty result is not automatically a missing page. A valid filter can temporarily have no stock and still help a user broaden their choice. The server needs a business rule.

For impossible, invalid, or permanently empty combinations, return `404`. Remove them from internal links and sitemaps. Google recommends a `404` response for faceted combinations with no results, which prevents effectively infinite successful empty pages.

For a temporarily empty curated landing page, decide whether the owner remains useful. If it stays live, explain availability, link to close alternatives, and monitor how long it remains empty. Do not keep a self-canonical `200` page indefinitely because inventory once existed.

Reject arbitrary parameter values. A route should not return `200` for `?color=anything-an-attacker-can-type` while showing the base category.

## Keep sitemaps limited to owner URLs

An XML sitemap is an owner inventory, not a dump of every crawlable filter.

Include selected, canonical, indexable facet landing pages only when they are stable enough to maintain. Exclude sort states, non-canonical alternates, noindex filters, redirects, errors, internal search, and arbitrary combinations.

Use a separate facet sitemap only when it helps operations at scale and every included URL follows the same owner policy. Segmentation can make Search Console patterns easier to interpret; it does not make weak pages stronger.

The [XML sitemap guide](https://nikoalho.fi/writing/xml-sitemap-seo/) provides the eligibility matrix.

## Link curated facets from a real hierarchy

An indexable facet that exists only in a sitemap is not integrated into the shopping architecture.

Link it where the decision is useful:

-   parent category copy or subcategory navigation;
-   a buying guide explaining the attribute;
-   related category modules;
-   merchandising collections;
-   breadcrumbs when the facet is a genuine hierarchy level.

Avoid sitewide clouds of every brand, color, and use case. Internal links should express a bounded decision graph, not recreate the database schema in the footer.

Anchor text should name the destination naturally. Link to the standard owner URL, not a tracking or alternate parameter form.

## Test facets by pattern and order

A single clean filter is not enough. Test representative patterns:

-   one selected facet;
-   two and three facets in different selection orders;
-   repeated facet values;
-   invalid values;
-   empty inventory;
-   sort plus filter;
-   pagination plus filter;
-   removed products and categories;
-   encoded and case variants;
-   mobile and desktop UI paths;
-   routes generated by apps or JavaScript.

For each, record final URL, status, canonical, robots directive, response content, rendered links, sitemap state, product count, and owner expectation.

The acceptance condition is not “all filters canonicalize.” It is “every tested state behaves according to its classification, regardless of selection order or interface.”

## Monitor demand, crawl, and inventory together

Faceted navigation changes with the catalog, so static launch QA is insufficient.

Monitor:

-   server-log requests by facet pattern and bot;
-   unique crawled parameter combinations;
-   indexable owners with zero or low inventory;
-   empty combinations returning `200`;
-   non-owner facets receiving internal links;
-   selected canonicals and index coverage by pattern;
-   internal-search and filter usage that reveal new demand;
-   organic landings, revenue, and product availability for curated owners;
-   new route patterns introduced by themes, plugins, or apps.

The useful alert is not “parameter URLs increased.” It is “a new filter release created 80,000 crawlable combinations, 74% empty, while none has distinct demand.” Connect the technical graph to inventory and commercial intent.

## Use the smallest useful indexable set

The goal is not to index as many filter pages as possible. It is to create the smallest maintained set that covers real category demand while keeping the rest of the interface fast and usable.

Start with one category. Export its available facets, search demand, filter usage, inventory stability, current links, and crawl patterns. Promote a small number of obvious owners. Prevent the worst combinatorial paths. Then measure discovery, crawling, indexing, landings, and revenue before expanding the model.

That produces a facet system the team can explain and test — not a collection of directives added after the URL graph escaped.

MAP THE LIVE URL GRAPH

Use the Field Kit to capture facet patterns, evidence, owner rules, and production retests.

[Get the Technical SEO Field Kit →](https://nikoalho.fi/resources/technical-seo-checklist/)

Questions people actually ask

FAQ · 5

Q01 What is faceted navigation in SEO? +

Faceted navigation lets users narrow a listing by attributes such as brand, size, color, price, or compatibility. Each selection can change the product set and may create a URL, which can multiply crawl and indexing states unless the site defines which combinations are actual landing pages.

Q02 Should filter pages be indexed? +

Only selected filters that satisfy distinct demand, stable useful inventory, a maintainable landing experience, a standard owner URL, and deliberate internal links. Most sort, view, session, and multi-select combinations are interface states rather than search landing pages.

Q03 Should faceted URLs use noindex or robots.txt? +

Neither is a universal default. Noindex requires crawling before the directive can be processed. Robots.txt can reduce crawling but prevents crawlers from seeing page-level signals in the blocked response. First prevent unnecessary crawlable URL generation, then use directives for a documented state and test their effects.

Q04 Should filtered pages canonicalize to the unfiltered category? +

Only if they are genuine duplicate or near-duplicate alternates and consolidation is the intended relationship. A canonical does not stop discovery or crawling, and a materially distinct landing page should not canonicalize away its own intent.

Q05 What should an empty filter combination return? +

When the combination has no products and no durable landing-page purpose, return a real 404 after validating the filter state. Avoid successful empty templates that create effectively unlimited soft-404 URLs.

Sources & further reading

1.  \[01\]
    
    [Managing crawling of faceted navigation URLs](https://developers.google.com/search/docs/crawling-indexing/crawling-managing-faceted-navigation)
    
    Google Search Central · 2025
    
    DOC
2.  \[02\]
    
    [How to specify a canonical URL with rel=canonical and other methods](https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls)
    
    Google Search Central
    
    DOC
3.  \[03\]
    
    [Build and submit a sitemap](https://developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap)
    
    Google Search Central
    
    DOC

INBOX · TWICE A MONTH

Notes from the lab, in your inbox.

The same pipelines I run for paying clients — written up first for subscribers.

Written for operators, not marketers

![Niko Alho](https://nikoalho.fi/assets/niko-alho-avatar-192.webp)

Niko Alho

I run agentic SEO and build custom AI for B2B companies. Based in Turku.

[About →](https://nikoalho.fi/about/)

KEEP READING

## More on technical seo.

-   [![Editorial illustration for Ecommerce technical SEO: control inventory, variants, and trust](https://nikoalho.fi/visuals/ecommerce-technical-seo.webp)
    
    Technical SEO 2026 · 07 · 21
    
    Ecommerce technical SEO: control inventory, variants, and trust
    
    Build ecommerce SEO around durable category and product owners, controlled facets, explicit lifecycl…
    
    read →](https://nikoalho.fi/writing/ecommerce-technical-seo/)
-   [![Editorial illustration for Shopify technical SEO: a control-layer checklist](https://nikoalho.fi/visuals/shopify-technical-seo.webp)
    
    Technical SEO 2026 · 07 · 21
    
    Shopify technical SEO: a control-layer checklist
    
    Audit Shopify SEO by platform, admin, theme, app, and edge ownership. Fix crawl, canonical, schema,…
    
    read →](https://nikoalho.fi/writing/shopify-technical-seo/)
-   [![Editorial illustration for Canonical tags: align every signal to one URL owner](https://nikoalho.fi/visuals/canonical-tags.webp)
    
    Technical SEO 2026 · 07 · 18
    
    Canonical tags: align every signal to one URL owner
    
    A testable canonicalization protocol for redirects, rel=canonical, internal links, sitemaps, variant…
    
    read →](https://nikoalho.fi/writing/canonical-tags/)

[More writing →](https://nikoalho.fi/writing/)

Direct with Niko · 20-min intro, no pitch [Book a slot →](https://nikoalho.fi/book/)

## Structured data

```json
{
  "@context": "https://schema.org",
  "@type": "WebSite",
  "@id": "https://nikoalho.fi/#website",
  "url": "https://nikoalho.fi/",
  "name": "Niko Alho",
  "description": "Agentic SEO and custom AI builds for B2B companies.",
  "inLanguage": "en",
  "publisher": {
    "@id": "https://nikoalho.fi/#person"
  },
  "potentialAction": {
    "@type": "SearchAction",
    "target": {
      "@type": "EntryPoint",
      "urlTemplate": "https://nikoalho.fi/search/?q={search_term_string}"
    },
    "query-input": "required name=search_term_string"
  }
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "Person",
  "@id": "https://nikoalho.fi/#person",
  "name": "Niko Alho",
  "givenName": "Niko",
  "familyName": "Alho",
  "url": "https://nikoalho.fi/about/",
  "image": "https://nikoalho.fi/og/default.png",
  "jobTitle": "Agentic SEO & Custom AI Consultant",
  "email": "mailto:contact@nikoalho.fi",
  "telephone": "+358401539426",
  "address": {
    "@type": "PostalAddress",
    "addressLocality": "Turku",
    "addressCountry": "FI"
  },
  "knowsAbout": [
    "Search Engine Optimization",
    "Agentic SEO",
    "Topical Authority",
    "Retrieval-Augmented Generation",
    "Large Language Models",
    "Custom AI Builds",
    "B2B SaaS Content Strategy",
    "Schema.org Structured Data",
    "Generative Engine Optimization"
  ],
  "knowsLanguage": [
    "en",
    "fi"
  ],
  "worksFor": {
    "@id": "https://nikoalho.fi/#organization"
  },
  "sameAs": [
    "https://www.linkedin.com/in/nikoalho/",
    "https://github.com/alhoniko"
  ]
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "ProfessionalService",
  "@id": "https://nikoalho.fi/#organization",
  "name": "Niko Alho — SEO & AI Automation",
  "alternateName": "Niko Alho",
  "description": "Agentic SEO and custom AI builds for B2B companies.",
  "url": "https://nikoalho.fi/",
  "image": "https://nikoalho.fi/og/default.png",
  "logo": "https://nikoalho.fi/assets/logo-mark.svg",
  "email": "mailto:contact@nikoalho.fi",
  "telephone": "+358401539426",
  "priceRange": "$$$",
  "founder": {
    "@id": "https://nikoalho.fi/#person"
  },
  "employee": {
    "@id": "https://nikoalho.fi/#person"
  },
  "knowsLanguage": [
    "en",
    "fi"
  ],
  "address": {
    "@type": "PostalAddress",
    "addressLocality": "Turku",
    "addressCountry": "FI"
  },
  "areaServed": [
    {
      "@type": "City",
      "name": "Turku"
    },
    {
      "@type": "City",
      "name": "Helsinki"
    },
    {
      "@type": "Country",
      "name": "Finland"
    },
    {
      "@type": "Place",
      "name": "European Union"
    },
    {
      "@type": "Place",
      "name": "Worldwide (remote)"
    }
  ]
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "TechArticle",
  "@id": "https://nikoalho.fi/writing/faceted-navigation-seo/#article",
  "headline": "Faceted navigation SEO: decide which filter URLs deserve to exist",
  "name": "Faceted navigation SEO: decide which filter URLs deserve to exist",
  "description": "Control faceted navigation with an explicit URL-state matrix for indexable landings, useful filters, sort states, empty sets, and infinite combinations.",
  "image": "https://nikoalho.fi/og/faceted-navigation-seo.png",
  "url": "https://nikoalho.fi/writing/faceted-navigation-seo/",
  "datePublished": "2026-07-21T00:00:00.000Z",
  "dateModified": "2026-07-21T00:00:00.000Z",
  "inLanguage": "en",
  "isAccessibleForFree": true,
  "wordCount": 1611,
  "articleSection": "Technical SEO",
  "keywords": "faceted navigation seo, faceted search seo, filter urls seo, ecommerce filters seo, crawl budget faceted navigation",
  "author": {
    "@id": "https://nikoalho.fi/#person"
  },
  "publisher": {
    "@id": "https://nikoalho.fi/#person"
  },
  "mainEntityOfPage": {
    "@type": "WebPage",
    "@id": "https://nikoalho.fi/writing/faceted-navigation-seo/"
  },
  "about": {
    "@type": "Thing",
    "name": "Technical SEO"
  },
  "speakable": {
    "@type": "SpeakableSpecification",
    "cssSelector": [
      "h1",
      ".tldr",
      ".article-body > .prose > p:first-of-type"
    ]
  }
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "position": 1,
      "name": "Home",
      "item": "https://nikoalho.fi/"
    },
    {
      "@type": "ListItem",
      "position": 2,
      "name": "Writing",
      "item": "https://nikoalho.fi/writing/"
    },
    {
      "@type": "ListItem",
      "position": 3,
      "name": "Faceted navigation SEO: decide which filter URLs deserve to exist",
      "item": "https://nikoalho.fi/writing/faceted-navigation-seo/"
    }
  ]
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "What is faceted navigation in SEO?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Faceted navigation lets users narrow a listing by attributes such as brand, size, color, price, or compatibility. Each selection can change the product set and may create a URL, which can multiply crawl and indexing states unless the site defines which combinations are actual landing pages."
      }
    },
    {
      "@type": "Question",
      "name": "Should filter pages be indexed?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Only selected filters that satisfy distinct demand, stable useful inventory, a maintainable landing experience, a standard owner URL, and deliberate internal links. Most sort, view, session, and multi-select combinations are interface states rather than search landing pages."
      }
    },
    {
      "@type": "Question",
      "name": "Should faceted URLs use noindex or robots.txt?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Neither is a universal default. Noindex requires crawling before the directive can be processed. Robots.txt can reduce crawling but prevents crawlers from seeing page-level signals in the blocked response. First prevent unnecessary crawlable URL generation, then use directives for a documented state and test their effects."
      }
    },
    {
      "@type": "Question",
      "name": "Should filtered pages canonicalize to the unfiltered category?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Only if they are genuine duplicate or near-duplicate alternates and consolidation is the intended relationship. A canonical does not stop discovery or crawling, and a materially distinct landing page should not canonicalize away its own intent."
      }
    },
    {
      "@type": "Question",
      "name": "What should an empty filter combination return?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "When the combination has no products and no durable landing-page purpose, return a real 404 after validating the filter state. Avoid successful empty templates that create effectively unlimited soft-404 URLs."
      }
    }
  ]
}
```
