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.

TL;DR Use the 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:

  1. False positives: AI agent recommends a "natural linen" product that's 45% polyester because the description mentions linen prominently
  2. False negatives: AI agent excludes a 100% organic cotton product from "no-pesticide fabric" results because the GOTS certification isn't machine-readable
  3. 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 keyTypeExample value
materials.primarySingle line text65% Recycled Polyester, 35% Organic Cotton
materials.composition_jsonJSON stringArray of {name, pct, notes} objects
materials.reach_compliantBooleantrue
materials.bpa_freeBooleantrue
materials.organic_certSingle line textGOTS #CU123456
materials.prop65_warningMulti-line textFull 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

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.

Related Resources