A dispensary menu with a dozen filters can generate more URLs than the rest of the site combined. The working default: canonical every parameter URL to its base category, block the endless combinations from crawling, and promote the few filters with real search demand to static, indexable pages.
How the math gets away from you
Take a /flower category with 30 brands, three types, four THC ranges, five weights, and a couple of sort orders. Every combination a shopper can click is a distinct URL, /flower?brand=wyld&type=indica&weight=3.5g&sort=price, and Googlebot treats each one as a page to fetch. That single category quietly becomes tens of thousands of near-identical URLs. None of them will rank, but all of them compete for crawl attention, and crawl time spent on filter permutations is time not spent picking up your new products and guides.
The default: canonical to the base category
Most filtered views are the same product grid in a different order, so treat them that way. Every parameter URL should carry a canonical tag pointing at the clean category URL: all the ?brand= and ?thc= variations of /flower declare /flower as the primary version. Shoppers keep their filters, ranking signals consolidate on one page, and Google gets an unambiguous statement about which URL matters. Keep your internal links pointing at clean category URLs too; a canonical is a hint, and it is far more persuasive when your own site agrees with it.
Block the endless spaces from crawling
Canonicals consolidate signals but do not stop the crawling itself. For parameters that create effectively infinite spaces, sort orders, view toggles, stacked multi-facet combinations, add robots.txt patterns like Disallow: /*?*sort= so Googlebot stops wandering in. One warning that catches people constantly: do not block a URL and expect its canonical or noindex to work, because Google cannot read directives on pages it is forbidden to fetch. Block the junk it should never touch; canonicalize what it may still visit.
Promote the filters that earn real pages
Some filtered views match searches people actually type. "Indica flower", "live resin carts", a popular brand's name plus your city. Those deserve better than a parameter URL: give each a static path like /flower/indica/ with its own title tag, a couple of paragraphs of copy, and a spot in the site's navigation, and let it get indexed. The test is search demand plus stable inventory. If nobody searches the combination, or you only stock it some months, it stays a parameter.
A worked example
A client's menu showed about 900 products, yet Search Console reported tens of thousands of known URLs and a growing pile under Discovered, currently not indexed. Crawl stats showed Googlebot spending most of its visits on brand-plus-weight-plus-sort combinations. The fix took three moves: canonicals from all parameter URLs to their base categories, robots.txt patterns for sort and stacked-facet parameters, and six new static filter pages for combinations with proven demand, indica, sativa, edibles, pre-rolls, two house brands. Within a couple of months the index count deflated toward reality and new product pages started getting picked up in days instead of weeks.
Frequently asked questions
Should I block all parameter URLs in robots.txt?
No. A URL blocked by robots.txt can still get indexed from links pointing at it, and Google cannot see the canonical tag on a page it is not allowed to fetch. Block only the endless spaces, sort orders and multi-facet stacks, and let canonicals consolidate the rest.
How do I know which filter pages deserve indexing?
Two tests. People search the phrase on its own, which you can check in autocomplete and your Search Console queries, and you stock matching inventory year-round. A filter that passes both earns a static URL with its own title and copy.
Is crawl budget a real concern for a small dispensary site?
Not at a few hundred URLs. The catch is that faceting turns a small site into a huge one without anyone deciding to build it, and once Googlebot is spending most of its visits on filter combinations, new products and content wait longer to be picked up.
Can I just noindex the filter pages instead?
Noindex works only on pages Google is allowed to crawl, so never combine it with a robots.txt block. It also does nothing to reduce crawling by itself. For near-duplicate filtered views, a canonical to the base category is usually the cleaner tool.
If you are not sure whether this is the constraint on your site, a cannabis SEO audit tells you before you spend on anything else.
Key takeaways
- Facets multiply URLs combinatorially; a 900-product menu can present tens of thousands of crawlable pages.
- Default move: canonical every parameter URL to its clean base category and link internally to clean URLs only.
- Use robots.txt only for infinite spaces like sort parameters, and never on URLs that need their canonical read.
- Filters with proven search demand and stable inventory get static, indexable URLs with their own copy.
Sources
- How to specify a canonical with rel=canonical and other methods, Google Search Central. Covers duplicate consolidation.
- Robots.txt introduction and guide, Google Search Central. Covers what robots.txt does and does not control.
- Crawl budget management for large sites, Google Search Central. Covers what crawl budget is and who needs to care.
- What is Googlebot, Google Search Central. Covers how Google's crawler fetches pages.
Want this done for your brand?
We build cannabis & CBD search visibility with full transparency, for dispensaries, brands, and MSOs.
Get a free cannabis SEO audit ›