What Shopify generates
The decision, per facet
The principle: if people search for it, it deserves a page. If they do not, it should not be crawlable.
How to control it
robots.txt to prevent crawling. This is the effective lever, because it stops the crawl before it happens. Shopify’s default robots.txt already disallows sort URLs (/collections/*sort_by*), tag combinations (/collections/*+*) and multi-filter combinations (/collections/*filter*&*filter*). What stays crawlable by default is a single filter on a collection, such as ?filter.v.option.size=42.
If those single-filter URLs are eating crawl budget, add a robots.txt.liquid template to your theme — built with Liquid, it keeps Shopify’s default rules — and add one rule for the * user agent:
Disallow rules — it flags rules that block Google or AI crawlers.
Canonical tags on filtered pages pointing to the unfiltered collection. Useful, but weaker — the page still gets crawled, so budget is still spent.
noindex removes pages from the index but requires them to be crawled first. It does not solve a crawl budget problem.
Do not combine
robots.txt blocking with noindex on the same URLs. A blocked page cannot be crawled, so its noindex is never read.Promote high-demand facets properly
Where a filter combination has real search demand, do not rely on the parameter URL. Create a genuine collection with its own title, description, and content. See collection page optimisation.Diagnosing a problem
Look for:- Search Console showing far more discovered URLs than you have products
- Large numbers of “Discovered — currently not indexed”
- Crawl stats dominated by parameter URLs
- Deep products not being indexed while filter URLs are crawled repeatedly

