Optimization Guide
Product Material Composition Schema for AI Shopping Agents
Material composition drives high-precision shopping queries — "100% cotton", "BPA-free", "REACH compliant", "organic linen". These queries are unservable without machine-readable material data. Here's how to structure material composition, compliance signals, and organic certifications in Shopify JSON-LD.
material property for simple single-material products. Use additionalProperty arrays for multi-material composition with percentages. Add separate additionalProperty entries with propertyIDs reachCompliant, tscaCompliant, and prop65Warning for chemical compliance signals. Use hasCertification for organic certifications. One Liquid snippet using metafields covers the whole catalog.
Why Material Data Is an AI Shopping Filter
Material composition is one of the most common product filters in shopping queries. Unlike price or color, material requirements are often exclusionary — a buyer looking for "no synthetic fibers" or "latex-free gloves" needs the AI agent to positively confirm the absence of a material, not just find products with a matching word in the description.
The three failure modes without structured material data:
- False positives: AI agent recommends a "natural linen" product that's 45% polyester because the description mentions linen prominently
- False negatives: AI agent excludes a 100% organic cotton product from "no-pesticide fabric" results because the GOTS certification isn't machine-readable
- Compliance misses: AI procurement agent recommends a product for EU sale without surfacing that it lacks REACH documentation
Query types that require structured material data
| Query type | Example queries | Required signal |
|---|---|---|
| Material inclusion | "100% cotton shirts", "linen bedding", "leather boots" | material or materialComposition |
| Material exclusion | "no polyester", "plastic-free", "latex-free" | materialComposition with complete component list |
| Organic / natural | "organic cotton baby clothes", "natural fiber rug" | hasCertification + organicCertification |
| Chemical safety | "BPA-free bottles", "phthalate-free toys", "non-toxic paint" | materialSafety + reachCompliant |
| Compliance | "REACH compliant components", "TSCA certified materials" | reachCompliant, tscaCompliant |
Core Material Composition JSON-LD Patterns
Simple single-material product
For products made from a single material, the schema.org material property on the Product type is sufficient:
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Classic White Oxford Shirt",
"material": "100% Egyptian Cotton",
"additionalProperty": [
{
"@type": "PropertyValue",
"propertyID": "fabricWeight",
"name": "Fabric Weight",
"value": "120 gsm"
}
]
}
Multi-material composition with percentages
For blended materials, use additionalProperty to declare each component with its percentage. This enables the exclusion queries that single material strings cannot serve:
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Performance Athletic Tee",
"material": "65% Polyester, 35% Organic Cotton",
"additionalProperty": [
{
"@type": "PropertyValue",
"propertyID": "materialComposition",
"name": "Polyester Content",
"value": "65%",
"unitText": "percent",
"valueReference": {
"@type": "PropertyValue",
"name": "Material",
"value": "Recycled Polyester"
}
},
{
"@type": "PropertyValue",
"propertyID": "materialComposition",
"name": "Cotton Content",
"value": "35%",
"unitText": "percent",
"valueReference": {
"@type": "PropertyValue",
"name": "Material",
"value": "GOTS Certified Organic Cotton"
}
}
]
}
Chemical safety and compliance signals
Chemical compliance declarations use additionalProperty with standardized propertyID values. Use these alongside the materialSafety property (schema.org v24+) for maximum agent coverage:
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Food Storage Container Set — 4-piece",
"material": "Borosilicate Glass, Silicone",
"additionalProperty": [
{
"@type": "PropertyValue",
"propertyID": "reachCompliant",
"name": "REACH Compliance",
"value": "SVHC-free per Candidate List v29 (January 2026)"
},
{
"@type": "PropertyValue",
"propertyID": "materialSafety",
"name": "BPA Status",
"value": "BPA-free — no bisphenol A in any component"
},
{
"@type": "PropertyValue",
"propertyID": "materialSafety",
"name": "Phthalate Status",
"value": "Phthalate-free — silicone lid contains no DEHP, DBP, BBP, or DIBP"
},
{
"@type": "PropertyValue",
"propertyID": "foodContact",
"name": "Food Contact Safety",
"value": "FDA 21 CFR 177.2315 compliant — safe for direct food contact"
}
]
}
TSCA compliance for US products
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Industrial Solvent Cleaner — 1L",
"additionalProperty": [
{
"@type": "PropertyValue",
"propertyID": "tscaCompliant",
"name": "TSCA Compliance",
"value": "Compliant with TSCA Section 6 restrictions; no PBT chemicals. SDS available on request."
},
{
"@type": "PropertyValue",
"propertyID": "prop65Warning",
"name": "California Prop 65 Warning",
"value": "WARNING: This product contains chemicals known to the State of California to cause cancer. For more information: www.P65Warnings.ca.gov"
}
]
}
Organic certification using hasCertification
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Organic Crib Sheet — White",
"material": "100% Organic Cotton",
"hasCertification": {
"@type": "Certification",
"certificationIdentification": "GOTS",
"name": "Global Organic Textile Standard",
"issuedBy": {
"@type": "Organization",
"name": "Control Union Certifications"
},
"certificationStatus": "ActiveCertification",
"validUntil": "2027-03-31"
},
"additionalProperty": [
{
"@type": "PropertyValue",
"propertyID": "organicCertification",
"name": "Organic Certification",
"value": "GOTS Certified Organic — cert. #CU123456"
},
{
"@type": "PropertyValue",
"propertyID": "pesticideFree",
"name": "Pesticide Status",
"value": "Certified pesticide-free per GOTS standard"
}
]
}
Shopify Liquid Implementation
Material composition data rarely changes after product creation, so metafields are the right storage mechanism. Use a materials namespace with fields for the simple string and a JSON composition breakdown.
Metafield setup
| Metafield key | Type | Example value |
|---|---|---|
materials.primary | Single line text | 65% Recycled Polyester, 35% Organic Cotton |
materials.composition_json | JSON string | Array of {name, pct, notes} objects |
materials.reach_compliant | Boolean | true |
materials.bpa_free | Boolean | true |
materials.organic_cert | Single line text | GOTS #CU123456 |
materials.prop65_warning | Multi-line text | Full warning text or blank |
Liquid snippet for product.liquid
{% assign mats = product.metafields.materials %}
{% if mats.primary != blank %}
"material": {{ mats.primary | json }},
{% endif %}
"additionalProperty": [
{% if mats.reach_compliant == true %}
{
"@type": "PropertyValue",
"propertyID": "reachCompliant",
"name": "REACH Compliance",
"value": "SVHC-free per current Candidate List"
},
{% endif %}
{% if mats.bpa_free == true %}
{
"@type": "PropertyValue",
"propertyID": "materialSafety",
"name": "BPA Status",
"value": "BPA-free"
},
{% endif %}
{% if mats.organic_cert != blank %}
{
"@type": "PropertyValue",
"propertyID": "organicCertification",
"name": "Organic Certification",
"value": {{ mats.organic_cert | json }}
},
{% endif %}
{% if mats.prop65_warning != blank %}
{
"@type": "PropertyValue",
"propertyID": "prop65Warning",
"name": "California Prop 65 Warning",
"value": {{ mats.prop65_warning | json }}
},
{% endif %}
{% if mats.composition_json != blank %}
{% assign comp = mats.composition_json | parse_json %}
{% for c in comp %}
{
"@type": "PropertyValue",
"propertyID": "materialComposition",
"name": {{ c.name | json }},
"value": {{ c.pct | append: '%' | json }}
}{% unless forloop.last %},{% endunless %}
{% endfor %}
{% endif %}
]
Compliance Declaration Reference
| Compliance type | propertyID | Jurisdiction | Applies to |
|---|---|---|---|
| REACH SVHC-free | reachCompliant |
EU | Chemicals in articles >0.1% by weight |
| TSCA compliance | tscaCompliant |
US | Chemicals in commerce (industrial/consumer) |
| California Prop 65 | prop65Warning |
US (CA) | Products sold in California |
| BPA-free | materialSafety |
Global | Plastics, food contact materials |
| Phthalate-free | materialSafety |
EU/US | Toys, childcare articles, PVC products |
| GOTS organic | organicCertification + hasCertification |
Global | Textiles with ≥70% organic fibers |
| USDA Organic | organicCertification + hasCertification |
US | Agricultural products & personal care |
Implementation Checklist
- Add
materialproperty to all products with a primary material string - Add
materialCompositionadditionalPropertyarray for multi-material products with percentages - For chemical safety claims (BPA-free, phthalate-free): add
materialSafetyadditionalProperty - For REACH compliance: add
reachCompliantadditionalPropertywith Candidate List version - For TSCA compliance: add
tscaCompliantadditionalProperty - For California Prop 65: add
prop65WarningadditionalPropertywith full required warning text - For organic products: use
hasCertificationwith Certification type +organicCertificationfallback - Store compliance flags in metafields for catalog-wide management
- Keep REACH/TSCA documentation current — the structured data declaration references your actual compliance records
- Ping IndexNow after adding material markup to existing products
Frequently Asked Questions
What schema.org property should I use for product material composition?
Use the schema.org 'material' property directly on the Product type for a simple material string. For richer composition data with percentages and multiple materials, use additionalProperty with propertyID 'materialComposition' and an array of PropertyValue entries — one per material component. For chemical safety compliance (REACH, TSCA, California Prop 65), add separate additionalProperty entries with propertyID values of 'reachCompliant', 'tscaCompliant', or 'prop65Warning'.
How do AI shopping agents use material composition data?
AI agents use material composition to answer queries with material qualifiers: '100% cotton shirts', 'stainless steel water bottles', 'BPA-free food containers', 'natural fiber rugs', or 'organic cotton baby clothes'. Material data also enables negative filtering — users asking 'no polyester', 'latex-free gloves', or 'plastic-free packaging' need structured material data to get accurate exclusion filtering.
Do I need to include REACH compliance in my Shopify structured data?
You are not legally required to declare REACH compliance in structured data — REACH compliance obligations are fulfilled through the supply chain. However, adding a 'reachCompliant' additionalProperty serves AI shopping agents that filter for chemical-safety-certified products. B2B buyers using AI procurement tools increasingly query for REACH status directly. The structured data declaration is a positive marketing signal, not a regulatory substitute.
How should I handle California Prop 65 warnings in structured data?
If your product requires a California Prop 65 warning, add an additionalProperty with propertyID 'prop65Warning' and the full required warning text as the value. Do not use structured data as a substitute for the on-page visible warning — Prop 65 requires a clear and reasonable warning on the product page, label, or at point-of-purchase. The structured data declaration supplements the visible warning, it does not replace it.
What is the best way to declare organic certification in Shopify structured data?
For organic certification, use the schema.org hasCertification property with a Certification type. Set certificationIdentification to the certification standard (e.g., 'USDA Organic', 'GOTS'), issuedBy to the certifying organization, and include the specific certificate ID. Add a parallel additionalProperty with propertyID 'organicCertification' as a fallback for agents that don't yet support hasCertification.