The default product page on a CBD Shopify store ships with Shopify’s automatic Product schema. It validates. It’s also the reason ChatGPT and Perplexity barely cite CBD product pages. The default schema covers ~40% of what AI engines need to confidently quote a product.
This piece is the engineered schema stack that closes the gap.
What’s missing from default Shopify schema
Default Shopify Product JSON-LD typically includes:
name,description,image,skubrand(as plain text, not as Organization reference)offerswith price, currency, availability- Sometimes a single
aggregateRatingif a review app is connected
What it omits:
material(CBD type: isolate, broad-spectrum, full-spectrum)gtin13ormpn(manufacturer identifier)manufactureras Organization withsameAscategorymapped to schema.org’s product taxonomyadditionalPropertyfor cannabinoid concentration (mg per serving), serving size, flavor, strain originhasMerchantReturnPolicy(Google Merchant Center compliance)shippingDetailsper region (state-restriction map)- Per-batch COA URL via
additionalProperty
The omissions matter because AI engines that decide whether to cite a product page parse the structured data first. Pages without these attributes get filtered out of comparison-style queries (“best broad-spectrum CBD oil”) because the engine can’t confirm the product is actually broad-spectrum.
The full schema stack
A CBD product page should ship with five JSON-LD blocks (or one combined @graph):
1. Organization (sitewide):
{
"@type": "Organization",
"@id": "https://yourbrand.com/#organization",
"name": "Your CBD Brand",
"sameAs": ["https://linkedin.com/...", "https://crunchbase.com/..."],
"logo": "https://yourbrand.com/logo.svg",
"founder": { "@type": "Person", "name": "Real Name", "sameAs": [...] }
}
2. Product (page-level):
{
"@type": "Product",
"name": "Broad-Spectrum CBD Oil 1500mg",
"description": "30ml broad-spectrum CBD oil, 50mg per serving, MCT-oil base. Third-party tested. Contains 0.0% THC.",
"image": [...],
"sku": "BS-1500-30ML",
"gtin13": "0123456789012",
"mpn": "BS1500",
"brand": { "@id": "https://yourbrand.com/#organization" },
"manufacturer": { "@id": "https://yourbrand.com/#organization" },
"material": "Broad-spectrum CBD",
"category": "Health & Beauty > Health Care > Supplements",
"additionalProperty": [
{ "@type": "PropertyValue", "name": "Total CBD", "value": "1500mg" },
{ "@type": "PropertyValue", "name": "Per Serving", "value": "50mg" },
{ "@type": "PropertyValue", "name": "THC", "value": "0.0%" },
{ "@type": "PropertyValue", "name": "Hemp Source", "value": "Colorado-grown" },
{ "@type": "PropertyValue", "name": "COA", "value": "https://yourbrand.com/coa/BS-1500-30ML.pdf" }
],
"offers": { "@type": "Offer", "price": "59.99", "priceCurrency": "USD", "availability": "https://schema.org/InStock", "url": "..." },
"aggregateRating": { "@type": "AggregateRating", "ratingValue": "4.7", "reviewCount": "248" }
}
3. FAQPage (page-level):
5–8 questions, each with @type: Question, name, acceptedAnswer containing direct-answer text ≤30 words. Pulled from real product page FAQ section.
4. Review (per published review):
{
"@type": "Review",
"author": { "@type": "Person", "name": "Verified buyer initials only" },
"datePublished": "2026-04-12",
"reviewBody": "...",
"reviewRating": { "@type": "Rating", "ratingValue": "5" }
}
5. Person (medical reviewer, if YMYL content on page):
{
"@type": "Person",
"name": "Dr. Real Name, ND",
"jobTitle": "Medical Reviewer",
"url": "https://yourbrand.com/team/dr-real-name",
"sameAs": ["https://linkedin.com/in/dr-real-name", "https://orcid.org/..."]
}
Real reviews vs Yotpo-only widgets
The most common schema mistake on CBD product pages: AggregateRating that points to Yotpo-managed reviews not visible to Google’s review platforms.
Google’s product-review systems require reviews to be:
- Authored by real, identifiable customers (initials + verified-buyer badge minimum)
- Hosted on a Google-recognized review platform (Trustpilot, Sitejabber, BBB, Google Reviews) OR self-hosted with verifiable timestamps and review-author identity
- Not incentivised (no discount-for-review)
- Not gated (no “only happy customers” filter)
A Yotpo widget that shows reviews on the page but doesn’t expose them to Google’s review-detection system fails this. The brand has a 4.7-star widget but Google sees no reviews. AI engines see no reviews. The AggregateRating in JSON-LD is technically declared but unsubstantiated.
The fix: switch to a real-review platform OR self-host with verifiable structured-data exposure. We typically recommend Trustpilot for the volume + visibility, Sitejabber for the SEO authority, and Google Reviews via Google Business Profile for local-pack reinforcement.
Common validation failures
Three issues catch ~80% of CBD product schema during the Google Rich Results Test:
Failure 1: Microdata leftovers. Old Shopify themes still emit Microdata-format Product schema in addition to JSON-LD. Google deprecated rich-result Microdata in August 2023 — it doesn’t break ranking but creates noise. Strip it from the theme.
Failure 2: Missing priceValidUntil.
Google’s Rich Results Test flags missing priceValidUntil on Offer schema. Shopify doesn’t auto-emit it. Add a 90-day rolling expiration via theme code.
Failure 3: AggregateRating without Review. Schema declares AggregateRating but no individual Review schema is present. Google’s spam systems flag this. Either drop AggregateRating or add at least 3 individual Review JSON-LD blocks.
What AI extraction reveals beyond validation
The Rich Results Test catches schema validation. It doesn’t catch AI-extraction failures.
Two failure modes only visible in AI-citation logs:
Failure A: AI engines don’t pick up multi-block schema unless it’s in @graph.
Multiple separate <script type="application/ld+json"> blocks on a page sometimes confuse AI parsers — they pick one and ignore others. Wrapping all schema in a single @graph block ensures all of it gets parsed together.
Failure B: AI engines de-prioritize pages with description mismatch between meta and JSON-LD.
If <meta name="description"> says one thing and Product description JSON-LD says something different, AI parsers treat the page as inconsistent and de-prioritize for citation. Keep them aligned.
What sustained schema engineering looks like under retainer
Foundation tier: schema audit + JSON-LD deployment on homepage, About, Contact, and 4 priority product/category pages. Validation pass.
Growth tier: full sitewide schema engineering across all product pages, FAQ pages on top 10 collections, Person schema for named medical reviewer, AggregateRating wired to real review platform.
Scale tier: custom schema for emerging cannabinoids (CBG/CBN/CBC PropertyValue extensions), AI-extraction tracking via Profound or Otterly.AI, monthly schema-drift audits, schema engineering for new product launches.
CBD product schema sample (organization.json) → · Google AI Overviews citation strategy →