Optimization Guide
Shopify Dietary Supplement Schema — DietarySupplement JSON-LD for Health & Wellness Stores
AI shopping agents answering "magnesium glycinate 400mg capsules", "best prenatal vitamins third trimester", and "NSF certified protein powder for athletes" depend entirely on structured supplement data — not ingredient lists buried in product descriptions. Shopify has no built-in DietarySupplement output, leaving every supplement brand's dosage, ingredient, and demographic signals invisible to AI health and wellness queries.
Product block for commerce signals (offers, reviews, GTIN) and a DietarySupplement block for health signals (activeIngredient, dosageSchedule, targetPopulation, legalDisclaimer, functionalClass). Store supplement metadata in a supplement.* metafield namespace and inject both blocks via Liquid. Every structure/function claim on the page requires the FDA disclaimer in legalDisclaimer.
Why Supplement Brands Are Invisible to AI Health Queries
The dietary supplement category is structurally complex for AI shopping agents. Users ask layered queries: ingredient-specific ("glycine 1000mg sleep supplement"), demographic-targeted ("iron supplements safe for pregnancy"), certification-filtered ("third-party tested creatine monohydrate"), and functional ("adaptogens for stress"), all within a single product type. Answering them requires machine-readable health metadata that no Shopify default template provides.
Shopify's default product JSON-LD outputs a Product type with name, description, price, and availability. The entire health layer — active ingredients, dosing instructions, safety warnings, target demographics, and functional categories — lives in product description text, a Supplement Facts table image, or app-generated HTML. None of it is in structured data. None of it is visible to AI agent crawlers.
Schema.org provides a dedicated DietarySupplement type precisely for this use case. It extends Substance → BioChemEntity → Thing and is designed to carry health-specific signals that the generic Product type cannot represent. The correct implementation pattern uses two separate JSON-LD blocks on the same page: Product for the commerce layer, DietarySupplement for the health layer. Together they give AI agents the complete signal set to confidently include your supplements in filtered health and wellness results.
AI supplement query types requiring structured data
| Query type | Example query | Required DietarySupplement property | Without schema |
|---|---|---|---|
| Ingredient-specific | "magnesium glycinate 400mg" | activeIngredient, dosageSchedule.doseValue |
Agent cannot confirm ingredient form or dose |
| Demographic filter | "prenatal vitamins first trimester" | targetPopulation: "Pregnant women" |
Supplement excluded from demographic-filtered results |
| Functional category | "best adaptogens for stress and anxiety" | functionalClass: "Adaptogen" |
Product not matched in functional category queries |
| Dosage question | "how many capsules of ashwagandha per day" | dosageSchedule with frequency and doseValue |
Agent cannot answer dosage question; recommends elsewhere |
| Certification-filtered | "NSF certified protein powder for athletes" | hasCertification with NSF cert object |
Certified product excluded from certification filter |
| Safety-restricted | "supplements safe while breastfeeding" | safetyConsideration, targetPopulation |
Agent cannot assess suitability; conservative exclusion |
The two-block pattern: Product + DietarySupplement
The DietarySupplement type is not a replacement for the Product type — it is a companion. Commerce properties like offers, aggregateRating, gtin, and brand belong on Product. Health properties like activeIngredient, dosageSchedule, and legalDisclaimer belong on DietarySupplement. Both blocks should appear in the <head> as separate <script type="application/ld+json"> tags on every supplement product page.
{
"@type": "Product",
"name": "Magnesium Glycinate 400mg",
"description": "Take 2 capsules daily.
Supports relaxation and sleep.",
// No activeIngredient
// No dosageSchedule
// No targetPopulation
// AI: ingredient/dose unknown
}
{
"@type": "Product",
"name": "Magnesium Glycinate 400mg",
"offers": { ... }
}
// — second block —
{
"@type": "DietarySupplement",
"name": "Magnesium Glycinate 400mg",
"activeIngredient": "Magnesium glycinate",
"dosageSchedule": {
"doseValue": "400",
"doseUnit": "mg",
"frequency": "Once daily"
}
}
DietarySupplement Properties Reference
The following properties are available on the DietarySupplement type. The most impactful for AI agent query matching are activeIngredient, dosageSchedule, targetPopulation, and functionalClass — implement these before the others.
| Property | Type | Description | Example value |
|---|---|---|---|
activeIngredient |
Text | The primary active ingredient(s) using INCI or INN name, not a marketing name | "Magnesium glycinate" |
nonProprietaryName |
Text | Generic/INN/INCI name for the ingredient — use when activeIngredient is a branded name | "Magnesium bis(glycinate)" |
isProprietary |
Boolean | true for branded proprietary formulas; false for generic ingredient names |
false |
legalDisclaimer |
Text | FDA structure/function claim disclaimer — required whenever the page uses claim language | Full FDA disclaimer text |
dosageSchedule |
DoseSchedule | Recommended use instructions — how much, how often, with what | See DoseSchedule table below |
maximumIntake |
DoseSchedule | Maximum safe daily intake — separate from recommended dose | doseValue: "800", doseUnit: "mg" |
mechanismOfAction |
Text | How the ingredient works at a biological level | "Acts as a cofactor for over 300 enzymatic reactions" |
targetPopulation |
Text | Who the supplement is intended for — critical for demographic filter queries | "Adults 18 and over", "Athletes", "Pregnant women" |
safetyConsideration |
Text | Warning text about contraindications and special populations | "Consult a physician before use if pregnant or nursing" |
functionalClass |
Text | Supplement category — used for functional-category queries | "Mineral", "Adaptogen", "Probiotic", "Nootropic" |
DoseSchedule properties
Both dosageSchedule and maximumIntake use the DoseSchedule type. This structured object lets AI agents answer direct dosage questions ("how much ashwagandha should I take") rather than deferring to a generic recommendation:
| Property | Type | Description | Example |
|---|---|---|---|
doseUnit |
Text | Unit of measurement for the dose | "mg", "g", "IU", "capsules", "scoops" |
doseValue |
Text | Numeric quantity per serving | "400", "2000", "1" |
frequency |
Text | Dosing frequency and timing instructions | "Once daily with food", "Twice daily with meals" |
targetPopulation |
Text | Who this specific dose applies to (if population-specific) | "Adults", "Athletes during training" |
Complete JSON-LD Example: Magnesium Glycinate Supplement
The following example shows both JSON-LD blocks for a realistic magnesium supplement product. The Product block carries all commerce signals; the DietarySupplement block carries all health signals. Both blocks reference the same product by name and URL.
<!-- Block 1: Product (commerce signals) -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Magnesium Glycinate 400mg — 120 Capsules",
"description": "High-absorption magnesium glycinate chelate. Supports muscle relaxation, restful sleep, and nervous system function. Third-party tested. Supports relaxation and sleep health.*",
"url": "https://example.com/products/magnesium-glycinate-400mg",
"sku": "MAG-GLY-400-120",
"gtin12": "012345678901",
"image": [
"https://example.com/cdn/shop/products/magnesium-glycinate-front.jpg",
"https://example.com/cdn/shop/products/magnesium-glycinate-supplement-facts.jpg"
],
"brand": {
"@type": "Brand",
"name": "PureForm Nutrition"
},
"offers": {
"@type": "Offer",
"price": "34.99",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"url": "https://example.com/products/magnesium-glycinate-400mg",
"priceValidUntil": "2027-01-01",
"shippingDetails": {
"@type": "OfferShippingDetails",
"shippingRate": {
"@type": "MonetaryAmount",
"value": "0",
"currency": "USD"
},
"shippingDestination": {
"@type": "DefinedRegion",
"addressCountry": "US"
},
"deliveryTime": {
"@type": "ShippingDeliveryTime",
"handlingTime": { "@type": "QuantitativeValue", "minValue": 1, "maxValue": 2, "unitCode": "DAY" },
"transitTime": { "@type": "QuantitativeValue", "minValue": 2, "maxValue": 5, "unitCode": "DAY" }
}
}
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.8",
"reviewCount": "312",
"bestRating": "5",
"worstRating": "1"
},
"hasCertification": [
{
"@type": "Certification",
"name": "NSF Contents Certified",
"certificationIdentification": "NSF-CC-2025-08741",
"issuedBy": {
"@type": "Organization",
"name": "NSF International"
}
},
{
"@type": "Certification",
"name": "USP Verified",
"certificationIdentification": "USP-VER-2024-3192",
"issuedBy": {
"@type": "Organization",
"name": "United States Pharmacopeia"
}
}
],
"additionalProperty": [
{
"@type": "PropertyValue",
"propertyID": "certificationId",
"name": "Certification",
"value": "NSF Contents Certified"
},
{
"@type": "PropertyValue",
"propertyID": "certifyingOrganization",
"name": "Certified By",
"value": "NSF International"
},
{
"@type": "PropertyValue",
"propertyID": "servingCount",
"name": "Servings Per Container",
"value": "60"
}
]
}
</script>
<!-- Block 2: DietarySupplement (health signals) -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "DietarySupplement",
"name": "Magnesium Glycinate 400mg — 120 Capsules",
"url": "https://example.com/products/magnesium-glycinate-400mg",
"description": "High-absorption magnesium glycinate chelate for muscle relaxation and sleep support.",
"activeIngredient": "Magnesium glycinate",
"nonProprietaryName": "Magnesium bis(glycinate)",
"isProprietary": false,
"functionalClass": "Mineral",
"targetPopulation": "Adults 18 and over",
"mechanismOfAction": "Magnesium glycinate is a chelated form of magnesium bonded to glycine, an amino acid. Magnesium acts as a cofactor in over 300 enzymatic reactions and modulates NMDA receptor activity, contributing to neuromuscular relaxation and sleep architecture regulation.",
"dosageSchedule": {
"@type": "DoseSchedule",
"doseValue": "400",
"doseUnit": "mg",
"frequency": "Once daily with food, preferably in the evening",
"targetPopulation": "Adults 18 and over"
},
"maximumIntake": {
"@type": "DoseSchedule",
"doseValue": "800",
"doseUnit": "mg",
"frequency": "Do not exceed 800mg supplemental magnesium per day",
"targetPopulation": "Adults"
},
"safetyConsideration": "Consult a physician before use if pregnant, nursing, taking prescription medications, or if you have a medical condition including kidney disease. High doses of magnesium from supplements may cause loose stools.",
"legalDisclaimer": "These statements have not been evaluated by the Food and Drug Administration. This product is not intended to diagnose, treat, cure, or prevent any disease."
}
</script>
FDA Regulatory Considerations in Schema
The schema data you output carries regulatory implications. Two specific areas require care:
Structure/function claims and the FDA disclaimer
A structure/function claim describes how a nutrient or ingredient affects the structure or function of the body: "supports immune health," "promotes healthy energy levels," "helps maintain cardiovascular function," "supports restful sleep." These claims are permitted on supplements under DSHEA but require the FDA disclaimer in both the product label and any promotional copy — including structured data that feeds AI agent product surfaces.
Place the full disclaimer text in the legalDisclaimer property whenever any structure/function language appears in your description, product title, or other schema fields. The exact required text is: "These statements have not been evaluated by the Food and Drug Administration. This product is not intended to diagnose, treat, cure, or prevent any disease."
Health claims vs. structure/function claims
Health claims assert a relationship between a nutrient and a disease: "reduces risk of heart disease," "lowers blood pressure," "prevents osteoporosis." These require FDA approval and pre-market substantiation — they cannot be placed in schema data (or anywhere on a supplement product page) without an authorized health claim. Merchants encountering AI-generated product descriptions should audit for health claim language before it enters schema fields.
| Claim type | Example | Permitted in schema? | Disclaimer required? |
|---|---|---|---|
| Structure/function claim | "Supports bone health" | Yes | Yes — legalDisclaimer required |
| Nutrient content claim | "High in Vitamin C" | Yes | No |
| Authorized health claim | "Adequate calcium may reduce risk of osteoporosis" | Only if FDA-authorized | Qualifier language required |
| Disease claim | "Treats arthritis pain" | No — drug claim | Not applicable; claim itself is prohibited |
Supplement Facts Panel and NutritionInformation
The Supplement Facts Panel data — serving size, servings per container, and key nutrient amounts — can be encoded using the NutritionInformation type on the Product block, the same way food products use it. This is distinct from the health-focused DietarySupplement block. For protein powders or meal replacement supplements where calories and macros matter, adding NutritionInformation to the Product block alongside the DietarySupplement block gives AI agents the complete signal set. See the food and beverage nutrition schema guide for the NutritionInformation implementation pattern.
Shopify Metafield Architecture
Store supplement-specific data in a dedicated supplement namespace so it can be injected cleanly into JSON-LD without polluting the core product metafields. Create these in the Shopify admin under Settings → Custom data → Products before building the Liquid snippet.
| Metafield key | Type | Maps to schema property | Example value |
|---|---|---|---|
supplement.active_ingredient |
Single-line text | activeIngredient |
Magnesium glycinate |
supplement.non_proprietary_name |
Single-line text | nonProprietaryName |
Magnesium bis(glycinate) |
supplement.dose_value |
Integer | dosageSchedule.doseValue |
400 |
supplement.dose_unit |
Single-line text | dosageSchedule.doseUnit |
mg |
supplement.frequency |
Single-line text | dosageSchedule.frequency |
Once daily with food |
supplement.max_dose_value |
Integer | maximumIntake.doseValue |
800 |
supplement.target_population |
Single-line text | targetPopulation |
Adults 18 and over |
supplement.functional_class |
Single-line text | functionalClass |
Mineral |
supplement.is_proprietary |
Boolean | isProprietary |
false |
supplement.mechanism_of_action |
Multi-line text | mechanismOfAction |
Paragraph describing biochemical mechanism |
supplement.disclaimer |
Multi-line text | legalDisclaimer |
Full FDA disclaimer text (default value set in metafield definition) |
supplement.safety_note |
Multi-line text | safetyConsideration |
Consult a physician before use if pregnant or nursing |
supplement.certifications |
JSON | hasCertification array |
[{"name":"NSF Contents Certified","id":"NSF-CC-2025-08741","issuer":"NSF International"}] |
Set the supplement.disclaimer metafield definition's default value to the full FDA disclaimer text. This ensures every supplement product page carries the disclaimer even when a product manager forgets to fill it in — a safe default is better than a missing legalDisclaimer on a page that uses structure/function language.
Shopify Liquid Snippet
Add this snippet to your product.liquid or product-template.liquid. It outputs the full two-block JSON-LD pattern, gated on the presence of the supplement.active_ingredient metafield so non-supplement products are unaffected. Each optional property has an if guard to prevent empty schema fields.
{% comment %}
Supplement schema: outputs Product block + DietarySupplement block
Gate: only renders when supplement.active_ingredient metafield is set
{% endcomment %}
{% assign supp_ingredient = product.metafields.supplement.active_ingredient %}
{% if supp_ingredient != blank %}
{% assign supp_dose_value = product.metafields.supplement.dose_value %}
{% assign supp_dose_unit = product.metafields.supplement.dose_unit %}
{% assign supp_frequency = product.metafields.supplement.frequency %}
{% assign supp_max_dose = product.metafields.supplement.max_dose_value %}
{% assign supp_target_pop = product.metafields.supplement.target_population %}
{% assign supp_func_class = product.metafields.supplement.functional_class %}
{% assign supp_is_prop = product.metafields.supplement.is_proprietary %}
{% assign supp_non_prop_name = product.metafields.supplement.non_proprietary_name %}
{% assign supp_mechanism = product.metafields.supplement.mechanism_of_action %}
{% assign supp_disclaimer = product.metafields.supplement.disclaimer %}
{% assign supp_safety = product.metafields.supplement.safety_note %}
{% assign supp_certs_json = product.metafields.supplement.certifications %}
{% comment %} --- BLOCK 1: Product (commerce signals) --- {% endcomment %}
{% comment %} --- BLOCK 2: DietarySupplement (health signals) --- {% endcomment %}
{% endif %}
Save this as snippets/supplement-schema.liquid and include it from your product template with {% raw %}{% render 'supplement-schema' %}{% endraw %}. This keeps the supplement logic isolated and easy to audit for FDA compliance review.
Functional Classes and Target Population Values
Use consistent, predictable values for functionalClass and targetPopulation across your catalog. AI agents match these against query intent — inconsistent values across products reduce matching confidence.
Recommended functionalClass values
| functionalClass value | Typical products | Example AI queries matched |
|---|---|---|
Mineral |
Magnesium, Zinc, Iron, Calcium supplements | "best magnesium supplement for sleep", "iron deficiency supplement" |
Vitamin |
Vitamin D, Vitamin C, B-complex, folate | "vitamin D3 K2 supplement", "best B12 for vegans" |
Protein Supplement |
Whey protein, casein, pea protein, collagen peptides | "best whey protein powder for muscle gain", "plant-based protein 30g per serving" |
Probiotic |
Multi-strain probiotic capsules, soil-based probiotics | "probiotics for gut health and bloating", "50 billion CFU probiotic" |
Adaptogen |
Ashwagandha, Rhodiola, Holy Basil, Eleuthero | "best adaptogen for stress and cortisol", "ashwagandha for anxiety" |
Nootropic |
Lion's Mane, Bacopa, Phosphatidylserine, Alpha-GPC | "nootropics for focus and memory", "best cognitive supplement" |
Omega-3 Fatty Acid |
Fish oil, krill oil, algal DHA/EPA | "omega-3 supplement for inflammation", "algae-based DHA for vegans" |
Antioxidant |
CoQ10, Resveratrol, Glutathione, Astaxanthin | "antioxidant supplement for aging", "ubiquinol CoQ10 200mg" |
Amino Acid |
Creatine, L-Glutamine, L-Theanine, BCAA blends | "creatine monohydrate powder", "L-theanine for sleep and anxiety" |
Herbal Supplement |
Turmeric, Echinacea, Elderberry, Milk Thistle | "turmeric with black pepper supplement", "elderberry for immune support" |
Recommended targetPopulation values
Use these standard values for targetPopulation — they map directly to the most common demographic modifier queries in AI supplement searches:
Adults 18 and over— the default for most general-purpose supplementsAthletes— for performance, recovery, and sport-specific supplementsWomen— for women's health formulas and hormone-support supplementsMen— for men's health and testosterone-support formulasPregnant women— for prenatal vitamins and pregnancy-safe supplementsAdults 50 and over— for senior-targeted formulas with adjusted nutrient levelsVegetarians and vegans— for plant-sourced and vegan-certified supplementsChildren 4 and over— for pediatric supplements (addsafetyConsiderationfor age limits)
Common Mistakes That Make Supplements Invisible to AI
These are the five most frequent implementation errors in supplement JSON-LD, listed in order of impact on AI agent query coverage:
| # | Mistake | Impact | Fix |
|---|---|---|---|
| 1 | Using Product @type alone — no DietarySupplement block |
All health-specific properties (activeIngredient, dosageSchedule, targetPopulation) are invisible to AI agents. Supplement matches only on price, brand, and title text. |
Add a second DietarySupplement JSON-LD block to every supplement product page alongside the Product block |
| 2 | Omitting legalDisclaimer when using structure/function language |
FDA non-compliance risk. AI agents trained on compliant data may treat claim-heavy pages without disclaimers as lower-quality signals. Google Merchant Center flags health claims without required disclaimers. | Add the full FDA disclaimer text to the legalDisclaimer field whenever any structure/function language appears anywhere on the page |
| 3 | Setting activeIngredient to a marketing/brand name instead of the INCI/INN name |
AI agents cannot match "Magtein" or "Aquamin" against user queries for "magnesium L-threonate" or "marine calcium." Branded ingredient names are opaque to agent ingredient-matching logic. | Use INCI/INN names in activeIngredient (e.g., "Magnesium L-threonate"). Use nonProprietaryName for the branded name, and set isProprietary: true |
| 4 | Missing dosageSchedule |
AI agents cannot answer the most common supplement follow-up question: "how many should I take?" Without a DoseSchedule object, the agent must either parse free-text instructions or decline to answer — reducing purchase confidence. |
Populate dosageSchedule with at minimum doseValue, doseUnit, and frequency. Even a simple "2 capsules once daily" is significantly better than no structured dosage data |
| 5 | Missing targetPopulation |
Supplement is not matched in any demographic-filtered query: "prenatal vitamins," "supplements for seniors over 65," "kids vitamins," "supplements for athletes." These represent a large share of high-intent supplement searches. | Set targetPopulation in both the DietarySupplement root and inside the dosageSchedule object. Use standard values from the recommended list above |
Supplement Certifications in Structured Data
NSF Certified for Sport, Informed Sport, and USP Verified are the three certifications with the highest AI query match rate for supplement-specific filtered searches. Encode them using both hasCertification and additionalProperty on the Product block for maximum AI agent coverage.
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Whey Protein Isolate — Chocolate — 2 lb",
"hasCertification": [
{
"@type": "Certification",
"name": "NSF Certified for Sport",
"certificationIdentification": "NSF-CFS-2025-14203",
"issuedBy": {
"@type": "Organization",
"name": "NSF International",
"url": "https://www.nsfsport.com"
},
"certificationStatus": "CertificationActive"
},
{
"@type": "Certification",
"name": "Informed Sport Certified",
"certificationIdentification": "IS-2025-07841",
"issuedBy": {
"@type": "Organization",
"name": "LGC Group",
"url": "https://www.informed.sport"
},
"certificationStatus": "CertificationActive"
}
],
"additionalProperty": [
{
"@type": "PropertyValue",
"propertyID": "certificationId",
"name": "Certification",
"value": "NSF Certified for Sport"
},
{
"@type": "PropertyValue",
"propertyID": "certifyingOrganization",
"name": "Certified By",
"value": "NSF International"
},
{
"@type": "PropertyValue",
"propertyID": "certificationId",
"name": "Certification",
"value": "Informed Sport Certified"
},
{
"@type": "PropertyValue",
"propertyID": "certifyingOrganization",
"name": "Certified By",
"value": "LGC Group"
}
]
}
For the full certification schema implementation pattern across product categories, see the Product Safety Certifications Schema guide.
Protein Powder Example: Full Two-Block Implementation
Protein powders require both the DietarySupplement block (for ingredient, dosage, target population) and a NutritionInformation block nested in Product (for calories, macros). This is the most complete implementation for AI agents answering queries like "best whey protein 30g per serving under 150 calories."
<!-- Block 1: Product -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Whey Protein Isolate — Chocolate — 2 lb",
"brand": { "@type": "Brand", "name": "PureForm Nutrition" },
"sku": "WPI-CHOC-2LB",
"offers": {
"@type": "Offer",
"price": "59.99",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.7",
"reviewCount": "841",
"bestRating": "5"
},
"nutrition": {
"@type": "NutritionInformation",
"servingSize": "1 scoop (35g)",
"calories": "140 calories",
"proteinContent": "30 g",
"fatContent": "1.5 g",
"saturatedFatContent": "0.5 g",
"carbohydrateContent": "3 g",
"sugarContent": "2 g",
"sodiumContent": "160 mg"
},
"hasCertification": [
{
"@type": "Certification",
"name": "NSF Certified for Sport",
"issuedBy": { "@type": "Organization", "name": "NSF International" }
}
]
}
</script>
<!-- Block 2: DietarySupplement -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "DietarySupplement",
"name": "Whey Protein Isolate — Chocolate — 2 lb",
"activeIngredient": "Whey protein isolate",
"nonProprietaryName": "Hydrolyzed whey protein isolate (WPI 90)",
"isProprietary": false,
"functionalClass": "Protein Supplement",
"targetPopulation": "Athletes",
"dosageSchedule": {
"@type": "DoseSchedule",
"doseValue": "1",
"doseUnit": "scoops",
"frequency": "1–2 scoops daily, ideally within 30 minutes post-workout",
"targetPopulation": "Athletes and active adults"
},
"maximumIntake": {
"@type": "DoseSchedule",
"doseValue": "2",
"doseUnit": "scoops",
"frequency": "Do not exceed 2 scoops per day"
},
"mechanismOfAction": "Whey protein isolate provides a complete essential amino acid profile with high leucine content. Leucine acts as a primary trigger for muscle protein synthesis via the mTOR pathway. The isolated form has greater than 90% protein content by weight with minimal lactose, making it suitable for lactose-sensitive individuals.",
"safetyConsideration": "Not recommended for individuals with milk or soy allergies. Manufactured in a facility that processes tree nuts. Consult a physician if you have pre-existing kidney conditions before significantly increasing dietary protein intake.",
"legalDisclaimer": "These statements have not been evaluated by the Food and Drug Administration. This product is not intended to diagnose, treat, cure, or prevent any disease."
}
</script>
Testing and Validation
After deploying supplement schema, validate both blocks using the standard structured data tooling and then test against realistic AI shopping queries:
- Google Rich Results Test — validates
Productblock syntax and eligibility for rich snippets. Does not validateDietarySupplementtype specifically but will catch JSON syntax errors. - Schema.org Validator (validator.schema.org) — validates both blocks against the full schema.org vocabulary including
DietarySupplement,DoseSchedule, andCertificationtypes. - AI query testing — ask ChatGPT Shopping, Perplexity, and Google AI Mode your target queries ("magnesium glycinate 400mg capsules," "prenatal vitamins third trimester") and verify your products appear. Allow 1–2 weeks after deployment for AI agent re-crawling.
For a complete audit of your supplement store's AI readiness across all structured data signals, use CatalogScan's free store scan to identify missing schema fields, FDA disclaimer coverage, and certification markup gaps.
Also see the Shopify structured data testing guide and the e-commerce AI readiness checklist for the full validation workflow.
Frequently Asked Questions
Should I use DietarySupplement or Drug schema for supplements?
Use DietarySupplement for OTC dietary supplements — vitamins, minerals, protein powders, herbal extracts, amino acids, and probiotics sold without a prescription. The Drug type is reserved for licensed pharmaceutical medications. DietarySupplement is the correct schema.org type for anything regulated under DSHEA in the US. Misusing the Drug type can trigger compliance flags in Google Merchant Center and mislead AI agents about the regulatory class of your product.
How does DietarySupplement schema help AI agents recommend my supplements?
AI shopping agents parse DietarySupplement schema to answer ingredient queries ("magnesium glycinate 400mg"), dosage questions ("how many capsules per day"), demographic filters ("prenatal vitamins," "supplements for seniors over 65"), and functional category searches ("adaptogens for stress"). Without this schema, these signals only exist in description text — requiring the agent to infer them via NLP, which is lower-confidence and often missed. Properties like activeIngredient, dosageSchedule, targetPopulation, and functionalClass map directly to the most common AI supplement query patterns.
What is the FDA disclaimer and where does it go in the schema?
The FDA disclaimer is the mandatory statement required on all dietary supplements that make structure/function claims: "These statements have not been evaluated by the Food and Drug Administration. This product is not intended to diagnose, treat, cure, or prevent any disease." It belongs in the legalDisclaimer property of the DietarySupplement block. Any time your product uses language like "supports immune health," "promotes energy," or "aids digestion," that is a structure/function claim and the legalDisclaimer field is required. Set the default value for your supplement.disclaimer metafield definition to this text so it populates automatically on every supplement product page.
How do I express a proprietary blend in DietarySupplement schema?
Set isProprietary to true and use activeIngredient to list the blend name followed by the constituent ingredients in parentheses — for example: "NeuroBlend Proprietary Complex (Lion's Mane Extract, Bacopa Monnieri, Phosphatidylserine)." Set nonProprietaryName to the INN/INCI names of the blend components where known. If you cannot disclose individual component amounts, you can still declare the total blend dose in dosageSchedule. Do not leave activeIngredient empty or set it to only the marketing blend name without any ingredient disclosure — AI agents treat opaque ingredient data as incomplete.
How do supplement certifications like NSF or USP appear in structured data?
Use the hasCertification property (added to schema.org in 2024) on the Product block with a Certification type object. Include the certification name, issuedBy Organization, and optionally certificationIdentification with the certificate number. Supplement certifications like NSF Certified for Sport and Informed Sport are high-value signals for AI agents responding to athlete and clean-sport queries — "third-party tested protein powder," "WADA-compliant pre-workout," "NSF certified creatine." Also add parallel additionalProperty blocks with propertyID: "certificationId" for AI agents that do not yet parse the hasCertification type. See the product safety certifications schema guide for the full implementation pattern.
Related Resources
- Shopify Food & Beverage Nutrition Schema — NutritionInformation for AI Dietary Queries
- Product Safety Certifications Schema — NSF, USP, FDA, CE in JSON-LD
- Shopify Schema Markup Guide — Complete JSON-LD Reference
- E-commerce AI Readiness Checklist
- Shopify Structured Data Testing Tools and Workflow
- CatalogScan Blog — AI Shopping Agent Optimization