Product schema markup is structured data in JSON-LD format on your product pages that tells AI agents and search engines exactly what you sell, what it costs, whether it’s in stock, and dozens of other attributes machines need to recommend and compare your products. Without it, AI agents are guessing. With it, they know.
This guide covers everything you need to implement product schema that works for both traditional search engines and the new wave of AI shopping agents.
Why Product Schema Matters More Than Ever
Google has used structured data for years to generate rich results: star ratings in search, price displays, availability badges. That alone was worth implementing.
But the game has changed. AI shopping agents from ChatGPT, Copilot, Perplexity, and Google’s AI Overviews all consume structured data. When an AI agent compares products, it relies heavily on schema markup to extract attributes. If your competitor has comprehensive schema and you don’t, the AI agent has structured, reliable data for the competitor and vague interpretations of your free-text descriptions for you. Guess who wins the recommendation.
Schema markup is the difference between an AI agent confidently saying “this product has X, Y, and Z” and an AI agent saying “this product might have some of those features based on the description.” Confidence converts. Ambiguity doesn’t.
JSON-LD: The Only Format You Should Use
There are three ways to add structured data to a page: JSON-LD, Microdata, and RDFa. Use JSON-LD. Period.
JSON-LD (JavaScript Object Notation for Linked Data) is a separate <script> block in your HTML. It doesn’t interfere with your page’s visual layout, it’s easy to maintain, and Google explicitly recommends it.
Microdata uses HTML attributes (itemscope, itemprop) mixed into your page markup. It’s fragile (any HTML change can break it), hard to maintain, and Google has deprecated it for new features.
RDFa is similar to Microdata in that it embeds structured data into HTML attributes. Same maintenance headaches.
Google, Bing, and AI agents all prefer JSON-LD. Use it.
The Essential Product Schema Template
Here’s a comprehensive Product schema that covers what both search engines and AI agents need:
{
"@context": "https://schema.org",
"@type": "Product",
"name": "TrailRunner X Trail Running Shoe",
"description": "Trail running shoe designed for overpronators with rock plate protection and aggressive lug pattern for technical terrain. Breathable mesh upper with waterproof membrane.",
"image": [
"https://example.com/images/trailrunner-x-front.jpg",
"https://example.com/images/trailrunner-x-side.jpg",
"https://example.com/images/trailrunner-x-sole.jpg"
],
"brand": {
"@type": "Brand",
"name": "TrailRunner"
},
"manufacturer": {
"@type": "Organization",
"name": "TrailRunner Sports Co."
},
"sku": "TRX-2026-BLK-10",
"gtin13": "0123456789012",
"mpn": "TRX2026",
"category": "Footwear > Athletic > Trail Running",
"material": "Synthetic mesh upper, rubber outsole, EVA midsole",
"color": "Black/Orange",
"weight": {
"@type": "QuantitativeValue",
"value": "310",
"unitCode": "GRM"
},
"additionalProperty": [
{
"@type": "PropertyValue",
"name": "drop",
"value": "8mm"
},
{
"@type": "PropertyValue",
"name": "closureType",
"value": "Lace-up"
},
{
"@type": "PropertyValue",
"name": "waterproof",
"value": "Yes"
},
{
"@type": "PropertyValue",
"name": "archSupport",
"value": "Overpronation"
}
],
"offers": {
"@type": "Offer",
"url": "https://example.com/products/trailrunner-x",
"priceCurrency": "USD",
"price": "74.99",
"priceValidUntil": "2026-12-31",
"availability": "https://schema.org/InStock",
"itemCondition": "https://schema.org/NewCondition",
"shippingDetails": {
"@type": "OfferShippingDetails",
"shippingRate": {
"@type": "MonetaryAmount",
"value": "0",
"currency": "USD"
},
"deliveryTime": {
"@type": "ShippingDeliveryTime",
"handlingTime": {
"@type": "QuantitativeValue",
"minValue": "1",
"maxValue": "2",
"unitCode": "DAY"
},
"transitTime": {
"@type": "QuantitativeValue",
"minValue": "3",
"maxValue": "5",
"unitCode": "DAY"
}
}
},
"hasMerchantReturnPolicy": {
"@type": "MerchantReturnPolicy",
"returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
"merchantReturnDays": "30",
"returnMethod": "https://schema.org/ReturnByMail",
"returnFees": "https://schema.org/FreeReturn"
},
"seller": {
"@type": "Organization",
"name": "Example Store"
}
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.7",
"bestRating": "5",
"worstRating": "1",
"ratingCount": "342",
"reviewCount": "289"
},
"review": [
{
"@type": "Review",
"author": {
"@type": "Person",
"name": "Sarah M."
},
"datePublished": "2026-03-15",
"reviewRating": {
"@type": "Rating",
"ratingValue": "5",
"bestRating": "5"
},
"reviewBody": "Best trail shoe I've owned. The rock plate saved my feet on rocky descents. Fits true to size."
}
]
}
Field-by-Field Breakdown: What AI Agents Actually Use
Required Fields (No Excuses)
name: Your product title. Be specific. “Trail Running Shoe” is bad. “TrailRunner X Trail Running Shoe for Overpronators” is better. AI agents use the name as the primary identifier.
description: A detailed, factual product description. Avoid marketing fluff. Include specs, materials, use cases, and compatibility info. AI agents parse descriptions for attributes not found in structured fields.
image: Multiple high-quality images. Include at least 3-5 images showing different angles and details. AI agents may present these to users during recommendations.
offers.price and offers.priceCurrency: Current price. Must match the visible price on the page. Mismatches destroy trust with both search engines and AI agents.
offers.availability: In stock, out of stock, pre-order, or limited availability. Use the correct schema.org URL: https://schema.org/InStock, https://schema.org/OutOfStock, https://schema.org/PreOrder, or https://schema.org/LimitedAvailability.
High-Impact Fields for AI Agents
brand: The brand name. AI agents filter by brand constantly. If you sell multiple brands, this field is critical for comparison queries.
sku, gtin13, mpn: Product identifiers. GTIN (barcode) and MPN (manufacturer part number) help AI agents match your product across different stores and data sources. If you have a GTIN, include it. It’s one of the strongest signals for product identity.
category: The product category path. Use a recognized taxonomy like Google’s Product Category taxonomy. “Footwear > Athletic > Trail Running” is far more useful to an AI agent than “shoes.”
material: What the product is made of. AI agents get queries like “leather-free hiking boots” or “organic cotton t-shirts.” If your material data isn’t in schema, you’re invisible to those queries.
color: Product color. Use standard color names, not creative marketing names. “Navy Blue” not “Midnight Abyss.”
weight: Product weight with units. Critical for shipping cost calculations and for products where weight matters (camping gear, jewelry, food products).
additionalProperty: This is your secret weapon. Schema.org’s Product type has limited dedicated fields, but additionalProperty lets you add any key-value pair. Use it for:
- Technical specs (battery life, screen size, resolution, thread count, fill power)
- Compatibility info (works with iPhone 15+, compatible with standard 1-inch rails)
- Certifications (OEKO-TEX, GOTS, Energy Star, UL listed)
- Care instructions (machine wash cold, tumble dry low)
- Any attribute a shopper might filter on
AI agents love additionalProperty because it gives them structured, unambiguous data for comparison and filtering. The more relevant properties you include, the more confidently an agent can recommend your product.
offers.shippingDetails: Shipping cost and delivery time estimates. “Is it free shipping?” and “Will it arrive by Friday?” are two of the most common questions AI agents handle. Give them the data to answer accurately.
offers.hasMerchantReturnPolicy: Return window, method, and cost. “What’s the return policy?” is a dealbreaker question. If the AI agent can’t answer it from your schema, the user may abandon the recommendation.
aggregateRating and review: Ratings and reviews. AI agents use these to gauge quality and popularity. Even a review summary with just the aggregate rating helps. Individual reviews give agents specific quotes to reference.
Handling Product Variants
Most products come in multiple variants (sizes, colors, configurations). There are two approaches:
Approach 1: One Schema Per Variant Page
If each variant has its own URL (e.g., /products/shoe?color=black&size=10), put a Product schema on each page with that specific variant’s details. This is the cleanest approach.
{
"@context": "https://schema.org",
"@type": "Product",
"name": "TrailRunner X Trail Running Shoe - Black/Orange, Size 10",
"sku": "TRX-2026-BLK-10",
"color": "Black/Orange",
"size": "10",
"offers": {
"@type": "Offer",
"price": "74.99",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock"
}
}
Approach 2: Product Group with Variants
If all variants are on one page, use a ProductGroup with individual offers:
{
"@context": "https://schema.org",
"@type": "ProductGroup",
"name": "TrailRunner X Trail Running Shoe",
"description": "Trail running shoe for overpronators with rock plate protection.",
"brand": { "@type": "Brand", "name": "TrailRunner" },
"hasVariant": [
{
"@type": "Product",
"name": "TrailRunner X - Black/Orange, Size 10",
"sku": "TRX-2026-BLK-10",
"color": "Black/Orange",
"size": "10",
"offers": {
"@type": "Offer",
"price": "74.99",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock"
}
},
{
"@type": "Product",
"name": "TrailRunner X - Black/Orange, Size 11",
"sku": "TRX-2026-BLK-11",
"color": "Black/Orange",
"size": "11",
"offers": {
"@type": "Offer",
"price": "74.99",
"priceCurrency": "USD",
"availability": "https://schema.org/OutOfStock"
}
}
]
}
Approach 1 is simpler and more widely supported. Use it if you can.
Common Mistakes That Kill Your Schema
Mistake 1: Price Mismatch
The price in your schema must exactly match the visible price on the page. If your page shows “$74.99” but your schema says “74.99” without currency, or “79.99” because you forgot to update it after a sale, search engines will ignore your rich results and AI agents will serve stale data.
Automate schema generation from your product database so prices stay in sync.
Mistake 2: Missing Availability Updates
If a product goes out of stock and your schema still says InStock, AI agents will recommend it to users who then can’t buy it. That’s a terrible experience that hurts trust in both your store and the AI agent.
Use real-time or near-real-time availability in your schema. If that’s technically hard, at minimum update availability when the page is regenerated or cached.
Mistake 3: Empty or Generic Descriptions
Your schema’s description field should be a real, detailed description. Not “High quality product.” Not “Buy now.” Not your meta description.
AI agents read the schema description directly. Make it informative: materials, specs, use cases, what makes it different. Three to five sentences of factual, useful content.
Mistake 4: Ignoring additionalProperty
Most ecommerce stores stop at name, price, image, and maybe brand. They leave additionalProperty empty. This is like writing a product listing with no specs.
Every attribute a customer might ask about should be in additionalProperty. Battery life, screen size, fabric weight, thread count, lumens, decibels, capacity, dimensions, compatibility. If someone could filter on it, put it in schema.
Mistake 5: Duplicate or Conflicting Schema
Some CMS plugins and themes inject their own schema. If you’re also adding custom schema, you can end up with duplicate Product schemas on the same page, possibly with conflicting data. Search engines and AI agents get confused.
Audit your pages. View the page source and search for "@type": "Product". There should be exactly one Product schema per product page.
Mistake 6: No Reviews or Ratings
Products with review and rating schema get more clicks in traditional search and more confident recommendations from AI agents. If you have reviews but aren’t including them in schema, you’re leaving signal on the table.
Even if you don’t want to include individual reviews (which is fine), at minimum include aggregateRating with the average and count.
How to Validate Your Schema
Google Rich Results Test
URL: search.google.com/test/rich-results
Paste your page URL or your JSON-LD code. Google will tell you if the schema is valid and which rich results it qualifies for. This is the primary validation tool for search-specific schema.
Schema.org Validator
URL: validator.schema.org
A more general-purpose validator that checks against the Schema.org specification. Catches issues Google’s tool might not flag.
Google Search Console
The Enhancements section of Search Console shows schema errors and warnings across your entire site. Check it regularly. It will flag pages where Google found schema issues.
Manual Inspection
Always view your page source and find the JSON-LD block. Read it. Does it make sense? Are the prices correct? Are the images loading? Is the availability accurate? Automated tools catch syntax errors, but only a human catches “the price is wrong” or “that’s the wrong product image.”
AI Agent Test
Ask ChatGPT, Copilot, or Perplexity about your product. “What can you tell me about [your product name]?” See what data they surface. If they’re missing key attributes, your schema (and broader web presence) needs work.
Platform-Specific Implementation Tips
Shopify
Shopify themes often include basic Product schema automatically. Check your theme’s product.liquid or main-product.liquid section. The default schema is usually minimal (name, price, image, availability).
To add comprehensive schema, you have two options:
- Use a schema app from the Shopify App Store (look for ones that support
additionalProperty) - Add a custom JSON-LD block in your theme. Edit your theme code and insert a
<script type="application/ld+json">block in the product page template. Pull data from Shopify’s Liquid template variables.
For variant-level schema, you’ll need custom code. Shopify’s default schema doesn’t handle variants well.
WooCommerce
WordPress + WooCommerce has several schema plugins. Yoast SEO includes basic schema. For comprehensive product schema, look at dedicated schema plugins that support WooCommerce and let you add additionalProperty fields.
Alternatively, add a custom function in your theme’s functions.php that generates JSON-LD from the WooCommerce product object.
Custom/Headless
You have full control. Generate JSON-LD from your product database and inject it into each product page’s <head> or before the closing </body>. This is the cleanest approach since you’re not fighting theme defaults or plugin conflicts.
The ROI of Complete Schema
Complete product schema does three things:
Better search visibility: Rich results (stars, prices, availability) increase click-through rates by 20-30% on average. Google explicitly uses schema as a ranking signal for some product queries.
Better AI recommendations: AI agents that find structured, comprehensive data can make confident, specific recommendations. “This shoe has a rock plate for trail running, 8mm drop for overpronators, and a waterproof membrane, currently $74.99 with free shipping and 4.7 stars from 342 reviews.” That sells.
Better comparison performance: When an AI agent compares your product against competitors, your schema gives it the ammunition to argue for your product. Without schema, the agent is left interpreting free text, which is unreliable and often incomplete.
The investment in schema is primarily a one-time setup cost plus ongoing maintenance for price and availability. The return compounds as AI shopping grows.
Check your store’s agent discoverability score free at shopti.ai
