Open a dispensary website and the menu is the biggest thing on it: hundreds of products, live stock and prices that change through the day. It is why customers visit. On a large share of the sites we audit, it is also missing from what Google actually indexed.
The page is not penalized and not ranking badly. The products are simply absent. Search Console reports the page as indexed, because the page is. Nothing reports that the part you cared about never made it in.
The only symptom is that you never appear for product searches, which looks exactly like ordinary weak rankings. That is why dispensary menu SEO problems go unnoticed for years on sites that are otherwise well run. This guide covers cannabis menu SEO from the first test to the lasting fix.
Key points
- How your menu is embedded decides whether Google sees your products on your domain. An iframe almost never counts for you.
- Run the four-minute test first. It tells you which of three menu builds you have before anyone touches code.
- Age gates and filter bars cause the two most common failures: products hidden from the crawler, and thousands of empty URLs.
- The lasting fix is a menu rendered on your own domain with real links. Everything else manages symptoms.
The Searches Your Dispensary Menu Should Win
Product searches are some of the most purchase-ready queries in cannabis, and they are what dispensary menu SEO is for. Someone typing a strain, brand or product type plus a city usually wants to buy today. Right now, those searches are mostly won by marketplaces.
Marketplaces win because their product pages are plain, crawlable HTML on one strong domain. Your menu often holds the same products with better local relevance, but if Google cannot read it on your domain, that relevance never gets counted.
Our menu visibility checker counts how many of your products a crawler can actually reach. Run it before reading further. The number usually explains the rest of this guide.
Three Ways A Dispensary Menu Gets Onto A Page
Every dispensary menu platform offers some mix of three builds. They look identical to a customer. To a crawler, they are completely different documents.
- Iframe embed. Your page contains a window into the provider’s site. The products live on their URL, so any credit goes to them.
- JavaScript embed. A script loads products into your page after it opens. Google can read this, but only if rendering succeeds, and it often partly fails.
- Server-rendered or headless. Product HTML is on your domain when the page first loads, with real links to real product URLs. This is the build that ranks.
Our post on why an embedded menu never reaches the index walks through the iframe case with one common provider.
A Four-Minute Test To Find Your Menu Build
You do not need a developer to know which build you have. Pick one product that is in stock on your dispensary menu and run four checks in order.
Product name found?
Menu on another domain?
Product in rendered HTML?
Which domain shows?
- View the page source (not the inspector) and search for the product name. Found means server-rendered.
- Search the source for “iframe.” If the menu area is an iframe pointing to another domain, that is your answer.
- Use URL Inspection in Search Console and view the crawled page. If the product appears in the rendered HTML, the JavaScript embed works.
- Search Google for the product name plus your store name. See which domain shows up.
If step one fails and step three passes, you have a working JavaScript menu that is fragile. If both fail, Google cannot see your products on your domain at all.
The Age Gate That Also Gates The Crawler
Most states require some form of age confirmation, and most dispensary sites add a gate. Built one way, it is harmless. Built another way, it hides the entire site from search engines.
Googlebot does not click buttons. If the gate redirects every visitor to a separate age page, or loads menu content only after the “I am 21” click, the crawler sees the gate and nothing else.
The safe build is an overlay on top of a page whose content is already in the HTML. Our guide on how an age gate ends up hiding the page covers the build, and the manual action guide explains why showing crawlers different content from users creates a bigger problem.
What Google Does With A JavaScript Menu
Google processes JavaScript pages in three phases: crawl, render and index. According to Google’s JavaScript SEO documentation, pages wait in a render queue, sometimes for seconds and sometimes longer.
The important rule is simple. If content is not in the rendered HTML, Google cannot index it. Links are only followed when they are real anchor elements with an href. A product tile that opens on click with no href is a dead end for the crawler.
That is why JavaScript menus are fragile. Rendering usually works for the first screen of products. What happens to the rest depends on how the provider loads them.
Six Ways Menu Rendering Fails Without An Error
None of these produce an error in Search Console. Each one quietly removes products from the rendered page, so the page stays indexed while the menu disappears.
- Load on scroll. Products beyond the first screen load only when someone scrolls. The crawler does not scroll like a person.
- Content behind tabs. Categories that load on click never load for the crawler.
- Buttons instead of links. Product tiles without an href give Google nothing to follow.
- Blocked data calls. If robots.txt blocks the provider’s data endpoint, rendering returns an empty menu.
- Slow responses. A product feed that takes too long to answer can leave the rendered page empty.
- Location prompts. A store picker that must be answered before products load stops the crawler at the picker.
The URL Inspection tool shows the rendered HTML. Compare its product count with what a customer sees. A gap is a rendering failure, whatever Search Console says about indexing.
The Filter Bar And The Crawl Trap
The opposite problem often sits on the same dispensary menu. The menu is invisible, but the filters around it are very visible, and they create far more URLs than the store has products.
The math multiplies. Category, brand, strain type, weight and sort order, each with a few values, quickly produce tens of thousands of combinations. If each one is a crawlable link, each one is a URL Google can find.
Sort order is the worst offender. It multiplies the whole set by four or five while changing nothing on the page. Most combinations also return an empty or near-empty result, which reads as thin content at scale.
The cost is crawl attention. Time spent on filter URLs is time not spent on your location pages, so new pages are found late. Our post on how a handful of real pages becomes thousands shows real numbers.
How To Handle Parameter URLs Now
Search Console’s URL Parameters tool was retired in 2022, so the settings many older guides describe no longer exist. Each remaining method solves a different part of the problem, and two of them cancel each other out.
- Canonical tags consolidate signals to the main menu page but do not stop crawling.
- Noindex keeps a URL out of results, but Google still has to crawl the page to see the tag.
- Robots.txt disallow stops crawling, but a blocked URL can still be indexed from links, and Google can never see a noindex on it.
- Not linking combinations removes the cause. Filters that update the page without creating crawlable links never produce the URLs.
Combining robots.txt disallow with noindex is the classic mistake. The disallow hides the noindex, so the URLs can stay in the index indefinitely. Pick one, based on whether the URLs are already indexed.
Schema For A Dispensary Menu
Structured data helps Google connect your store, your locations and your pages. For dispensary menu SEO, most of the value is at the store level, not the product level.
- Store per locationName, address, phone
- Opening hoursIncluding holidays
- Geo coordinatesMatches the map pin
- BreadcrumbsOn menu pages
- Product rich resultsRarely shown
- Prices in markupCompliance risk
- Potency claimsCompliance risk
- Fake review starsPolicy risk
Mark up each store with its name, address, phone, hours and geo coordinates, plus breadcrumbs on menu pages. Our schema generator builds the store node for each location.
Product markup is a different story. Merchant listings exclude recreational drugs, so cannabis product markup rarely produces rich results. Our post on product markup for cannabis items explains what it can and cannot do. Never put prices or potency claims in markup that your page copy avoids.
Core Web Vitals With A Third-Party Menu
A dispensary menu widget is often the heaviest thing on the page. You cannot rewrite the provider’s code, but you control the space around it.
- Reserve the height. Give the menu container a fixed minimum height so the page does not jump when products load. That fixes most layout shift.
- Load the script after your content. Your heading, address and local text should appear before the widget does.
- Keep the age gate light. A heavy gate script delays every page on the site.
Google’s current thresholds are a Largest Contentful Paint under 2.5 seconds, Interaction to Next Paint under 200 milliseconds and Cumulative Layout Shift under 0.1. Judge them from field data, not one lab test.
Four Menu Architectures Compared
When the test shows a problem, the real decision is architecture. We see four options in practice, and they trade effort against how much of the menu counts for your domain.
Iframes are the fastest to install and the worst for search. JavaScript embeds work partly.
A provider-hosted subdomain can rank, but it splits authority from your main site. A headless or server-rendered menu on your own domain takes the most work and is the one we recommend whenever the budget allows.
If you are changing providers or architecture, plan redirects and product URLs first. Our dispensary menu migration post covers the order of work that avoids a traffic drop.
The Diagnostic Order For Dispensary Menu SEO
When a dispensary menu underperforms, check causes in this order. Each step is quick, and each one either names the problem or rules it out before you spend time on the next.
- Rendered HTML. Is the product in the source or rendered page at all?
- Age gate. Does the crawler see the gate or the page?
- Robots.txt. Are the provider’s scripts or data calls blocked?
- Filter URLs. How many parameter URLs are indexed compared with real products?
- Structured data. Do the store nodes validate with correct details?
- Field speed data. Is the widget pushing pages past the thresholds?
Most cannabis menu SEO problems stop at step one or two. Our site checker fetches a page the way a crawler would, which covers the first three steps in one pass.
Frequently Asked Questions
Why Is My Dispensary Menu Not Showing In Google?
Most often because the menu is an iframe from the provider’s domain, or a JavaScript embed that fails to render fully. Check the page source and the rendered HTML in Search Console for a known product name.
Does Google Index Iframe Menus?
Google may read iframe content, but it generally belongs to the source URL, not your page. Treat an iframe menu as content that ranks for the provider, not for your dispensary.
Can An Age Gate Stop Google From Indexing My Site?
Yes, if it redirects visitors to a separate page or loads content only after a click. An overlay on top of a page whose content is already in the HTML is the safer build.
Should Menu Filter URLs Be Blocked In Robots.txt?
Only if they are not yet indexed. If they are indexed, use noindex or canonicals first so Google can see them. The best fix is filters that do not create crawlable links at all.
Does Product Schema Help Cannabis Products Rank?
Rarely for rich results, because merchant listings exclude recreational drugs. Store-level markup for each location gives more value. Keep any product markup consistent with your compliant page copy.
How Long Until Fixed Menu Pages Show In Search?
Products on your own domain usually start appearing within weeks of a clean fix, depending on crawl frequency. Filter URLs fall out of the index more slowly, often over a few months.
What Fixed Dispensary Menu SEO Looks Like
A fixed site has product pages on its own domain, real links between categories and products, an age gate that does not hide anything, and filter URLs falling out of the index. Product searches start showing your domain beside the marketplaces.
Some things will not change. Marketplaces will still rank for broad product terms, and “near me” results still depend mostly on your Business Profile. The win is the long tail of product plus city searches, which adds up across hundreds of items.
If the diagnosis points to an architecture change, that is the technical SEO work we do on cannabis sites. A free audit shows which step your site fails, and our cannabis retail SEO team can walk you through the fix.
Check Your Own Site
Run the free check to see how your menu, age gate, and location pages appear to a search engine.
