Put a Store JSON-LD block on each storefront page with address, geo coordinates, openingHoursSpecification, hasMap, and sameAs. Match every value to your Google Business Profile, then validate with the Rich Results Test.
Pick the right type: Store
Schema.org has no Dispensary type, so use Store, the retail subtype of LocalBusiness. It says what matters: a physical shop with an address, hours, and a door customers walk through. Write it as JSON-LD in a script tag, which is the format Google recommends, rather than microdata scattered through your HTML where the next theme update silently breaks it. One block per storefront page. Multi-store operators give each page its own block with its own @id, never one shared block sitewide.
The properties that do the work
A useful block carries: name exactly as it appears on your Google Business Profile, url, telephone, image, and priceRange. Then the local core. The address property takes a PostalAddress with street, city, region, and postal code. The geo property takes GeoCoordinates with latitude and longitude. openingHoursSpecification lists each day with opens and closes times, matching your posted hours to the minute. hasMap holds the URL of your Google Maps listing. sameAs holds an array of your other profiles — Weedmaps, Leafly, Yelp, Instagram — which stitches your web presence into one entity.
A worked example, property by property
Take a fictional shop, Green Docket at 214 E Main St in Bellingham, Washington. Its name field says Green Docket, matching the sign and the profile. PostalAddress carries the street, Bellingham, WA, 98225. Right-clicking the map pin gives geo values of 48.7519 and -122.4787. openingHoursSpecification lists Monday through Saturday 9:00 to 21:00 and Sunday 10:00 to 18:00 — two entries, because Sunday differs. hasMap gets the Google Maps URL for the store. sameAs lists its Weedmaps page, Leafly page, and Instagram. priceRange is a plain $$. Ten minutes of work, and every fact a search engine might have to guess is now stated.
Mistakes that get markup ignored
Schema fails quietly, and usually for one of a few reasons. Hours or address in the block contradict the Google Business Profile, so neither source is trusted. The block sits only on the homepage instead of the location page it describes. Placeholder values from a copied template survive into production. Worst is bolted-on aggregateRating pulled from Google reviews, which violates Google's structured data guidelines against self-serving review markup and can draw a manual action. Validate with the Rich Results Test when you ship, and re-validate whenever hours change, because stale markup is worse than none.
Key takeaways
- Use the Store type in JSON-LD, one block per storefront page, each with its own @id.
- The load-bearing properties are address, geo, openingHoursSpecification, hasMap, and sameAs.
- Every value must match your Google Business Profile exactly, down to the minute on hours.
- Never mark up ratings copied from Google reviews; validate with the Rich Results Test on every change.
Frequently asked questions
Does schema markup make a dispensary rank higher?
Not by itself. Schema is confirmation, not a ranking lever. It corroborates the name, address, hours, and identity your listings already claim, which removes ambiguity about your entity. Ambiguity is what quietly costs local visibility.
Where do I get the geo coordinates?
Right-click your storefront pin in Google Maps and the latitude and longitude appear at the top of the menu, ready to copy. Six decimal places is more precision than you need. Just confirm the pin sits on your actual entrance first.
What should sameAs point to?
Profiles that clearly represent the same store: your Weedmaps and Leafly listings, Yelp page, and active social accounts. Point hasMap at the store's Google Maps URL. Skip dead profiles, because sameAs is a claim of identity, not a link dump.
Can I add star ratings from my Google reviews?
No. Google's structured data guidelines bar self-serving review markup, and ratings copied from third-party platforms fall under that bar. Only reviews collected and displayed on your own site can be marked up, and even those may not show stars.
How do I test the markup?
Run the page through Google's Rich Results Test for eligibility and the Schema Markup Validator for syntax, then watch Search Console for structured data errors after it ships. Retest whenever hours or address change.
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 ›