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, sku
  • brand (as plain text, not as Organization reference)
  • offers with price, currency, availability
  • Sometimes a single aggregateRating if a review app is connected

What it omits:

  • material (CBD type: isolate, broad-spectrum, full-spectrum)
  • gtin13 or mpn (manufacturer identifier)
  • manufacturer as Organization with sameAs
  • category mapped to schema.org’s product taxonomy
  • additionalProperty for cannabinoid concentration (mg per serving), serving size, flavor, strain origin
  • hasMerchantReturnPolicy (Google Merchant Center compliance)
  • shippingDetails per 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 →