Layered Navigation SEO
The single biggest crawl-budget sink on most Magento catalogs. With ~10 filterable attributes, layered nav can produce hundreds of thousands of crawlable URL variants from filter combinations alone — the SEO Suite stops them with one observer.
How it works
When the feature is enabled and the current category-page request carries any unrecognised query param (i.e. a filter), Byte8\SeoSuite\Observer\ApplyLayeredNavRobotsObserver calls pageConfig->setRobots('NOINDEX,FOLLOW') on layout_generate_blocks_after. Magento's standard <meta name="robots"> tag emits the noindex.
This composes with Magento's built-in category canonical (catalog/seo/category_canonical_tag), which points the canonical URL back at the unfiltered base. So Google sees:
<meta name="robots" content="NOINDEX,FOLLOW">(don't index this URL)<link rel="canonical" href="...base-category-url">(the canonical version of this content lives at the base URL)
Both signals together = filtered URLs disappear from the index but link equity flows back to the base category.
Configuration
Stores → Configuration → SEO Suite → Layered Navigation SEO
| Field | Default | Notes |
|---|---|---|
| Enable layered-nav noindex | No | Master switch (per-store) |
| Mode | noindex_any | noindex_any (safest) or noindex_unlisted |
| Indexable filter attribute codes | (empty) | Allow-list — only used when Mode = noindex_unlisted |
| Query params that DON'T count as filters | (default ignore-list) | See below |
Mode: noindex_any (recommended default)
Any non-ignored query param triggers noindex. Pair this with a category canonical tag and you have full coverage with zero per-attribute config.
Use this unless you have a specific SEO strategy that requires certain filters to be indexable.
Mode: noindex_unlisted
Only filters NOT in your allow-list trigger noindex. Use this when you want to keep certain attribute filters indexable as separate landing pages.
Example use case: a fashion retailer wants ?color=red to stay indexable (since "red dresses" is a high-intent search query), but everything else (size, price, brand) should be noindex.
Mode: noindex_unlisted
Indexable filter attribute codes: color
Now ?color=red stays indexable; ?color=red&size=10 falls back to noindex (because size isn't allow-listed).
Default ignored params
p, product_list_limit, product_list_dir, product_list_order,
utm_source, utm_medium, utm_campaign, utm_term, utm_content,
gclid, fbclid, msclkid
These are pagination / sort / tracking params that aren't real filters — they shouldn't trigger noindex. The defaults cover the common cases; override the field if you have additional non-filter params.
When NOT to use it
- Single-store Magento install with very few filterable attributes (≤3) and good content per category — your filtered URLs may rank well; noindex'ing them throws away ranking
- You're using a search-engine-friendly faceted nav module that already handles this differently (e.g. some Mageworx + Yotpo combinations)
Verification
After enabling, visit any category URL with a filter:
https://store.example/shoes?color=red
View source. You should see:
<meta name="robots" content="NOINDEX,FOLLOW">
<link rel="canonical" href="https://store.example/shoes">
Without filters, the meta robots stays the default (whatever design/search_engine_robots/default_robots is — usually INDEX,FOLLOW).
What the Index Budget Audit can tell you
The layered_nav_explosion auditor (see Auditors) counts your filterable attributes and warns when they exceed thresholds. Combine the warning with this feature to fix the problem holistically:
- Audit detects you have 12 filterable attributes (severity: error)
- Reduce to ~5 critical filters
- Enable Layered Navigation SEO with
noindex_anyto noindex everything that survives
Headless / GraphQL
The observer fires on storefront page renders, so it doesn't apply to headless storefronts that fetch product data via GraphQL. For headless setups, your storefront router is responsible for noindex'ing filtered URLs — typically you can use the route-shape (? present in URL) to decide whether to emit <meta name="robots" content="noindex"> from your Next.js layout.
A future version may expose the noindex decision via the seo.robots GraphQL field.
Composes with
- Robots.txt per-store — for the most aggressive setups,
Disallow: /*?color=patterns prevent Googlebot from crawling at all - Index Budget Audit — diagnoses; this feature fixes