A free, working cannabis & CBD SEO library, 500 guides. Browse the library ›
Home » Blog » On-Page & Technical SEO » How to Use Structured Data for Cannabis Products
On-Page & Technical SEO

How to Use Structured Data for Cannabis Products

In short

Add Product markup in JSON-LD to every product page: name, image, description, and an offers block with price, priceCurrency, and availability. Declare only what the visible page shows, and revalidate whenever the template changes.

JSON-LD, wired into the template

Product structured data is a labeled description of the product that crawlers read directly instead of inferring from your copy. Google's preferred format is JSON-LD, a script block in the page head or body. The practical implication for a store: put the markup in the product template so it populates from the same fields the page displays. Hand-writing schema per product guarantees drift; template-generated schema stays correct for every SKU you add.

The core fields

Three properties do most of the identification work. The name should match the H1, strain plus form. The image should be the actual product photo, full URL. The description should be the page's real product description, not a truncated stub. Beyond those, brand helps multi-brand menus, and sku ties the markup to your inventory system. Specs like THC percentage have no dedicated schema.org property; additionalProperty with a name and value pair is the valid workaround.

The offers block carries the money data

The offers property is where availability and price live: price as a number, priceCurrency as an ISO code like USD, and availability as a schema.org URL, typically https://schema.org/InStock or https://schema.org/OutOfStock. Availability is worth automating well, because a store that marks sold-out products InStock trains both Google and shoppers to distrust it. If your platform can flip the value from live inventory, let it.

Where cannabis pages need extra care

Two caveats specific to this industry. First, only declare a price the visible page shows — if pricing hides behind an age gate or a login, markup that contradicts what a crawler renders is a liability, so drop the price property rather than fake it. Second, keep medical claims out of the description field just as you keep them off the page; the markup is crawled and cached, and it is not a loophole. Expect that some shopping surfaces filter restricted categories regardless of how clean the markup is. The parsing benefit remains.

Worked example: one cart, marked up

A Runtz live resin cartridge, 1 gram, gets: name "Runtz Live Resin Cartridge 1g", the product photo URL, the page's 100-word description, brand, sku, and offers with price 45.00, priceCurrency USD, availability InStock. THC content rides along as additionalProperty, name "THC", value "82%". Pasted into the Rich Results Test, the page reports a valid Product item with no errors. That block, generated by the template, repeats for every cartridge in the catalog with only the values changing.

Key takeaways

  • Generate Product JSON-LD from the template, never by hand per SKU.
  • Minimum useful set: name, image, description, offers with price and availability.
  • Never declare prices or claims the rendered page does not show.
  • THC and specs fit under additionalProperty name-value pairs.
  • Revalidate after template changes; schema breaks silently.

Frequently asked questions

Will cannabis products actually get rich results?

Sometimes. Google validates the markup the same way it does for any product, but restricted categories can be filtered out of some shopping surfaces. The markup still helps crawlers parse the page, so it earns its place either way.

Which Product fields are the minimum?

Name, image, and description, plus an offers block carrying price, priceCurrency, and availability. Reviews and aggregateRating are strong additions when you have real ones. Everything else is optional detail.

Can I mark up THC percentage?

There is no dedicated THC property in schema.org, so use additionalProperty with a name and value pair. Crawlers may not do much with it yet, but it is valid, harmless, and keeps the spec data machine-readable.

How do I check the markup is valid?

Run the page through Google's Rich Results Test and the Schema.org validator. The first shows what Google can use; the second catches syntax errors. Recheck after any template change, because silent breakage is the norm.

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 ›