Schema Markup in 15 Minutes: A Merchant's Quickstart
A step-by-step guide to adding JSON-LD Product markup to your product pages — from minimum viable schema to a complete implementation with reviews, ratings, and offers.
Schema markup tells AI shopping agents what your product is, what it costs, whether it’s available, and why someone should buy it — in a format machines can read without guessing. Without it, AI agents have to scrape your HTML and hope for the best. Most don’t bother.
This guide walks you through adding JSON-LD Product markup to a product page, from the bare minimum to a complete implementation. No framework required. Just structured data that makes your products visible to every AI shopping platform.
Step 1: The minimum viable Product
Start with the core fields every AI agent needs. Add this inside a <script type="application/ld+json"> tag in your product page’s <head> or <body>:
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Trailblazer Waterproof Hiking Boot — Women's",
"image": "https://example.com/images/trailblazer-boot-women.jpg",
"description": "Waterproof full-grain leather hiking boot with Vibram outsole. 20,000mm waterproof rating, 6-inch height, 1lb 9oz per boot. Designed for multi-day backpacking on rocky terrain.",
"sku": "TB-HIKE-W-001",
"brand": {
"@type": "Brand",
"name": "Summit Gear"
}
}
This tells the AI: here’s a real product with a name, an image, a description with actual attributes, a SKU, and a verified brand. It’s the absolute floor — but it’s already more than many merchants provide.
Step 2: Add an Offer
A product without pricing and availability data can’t be recommended for purchase. Add an offers block:
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Trailblazer Waterproof Hiking Boot — Women's",
"image": "https://example.com/images/trailblazer-boot-women.jpg",
"description": "Waterproof full-grain leather hiking boot with Vibram outsole. 20,000mm waterproof rating, 6-inch height, 1lb 9oz per boot.",
"sku": "TB-HIKE-W-001",
"brand": {
"@type": "Brand",
"name": "Summit Gear"
},
"offers": {
"@type": "Offer",
"url": "https://example.com/products/trailblazer-boot-women",
"price": "189.00",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"itemCondition": "https://schema.org/NewCondition",
"priceValidUntil": "2026-12-31"
}
}
Key details: availability uses schema.org’s enumerated values (InStock, OutOfStock, PreOrder, BackOrder). itemCondition distinguishes new from refurbished or used. priceValidUntil tells the agent your pricing data has a defined freshness window.
Step 3: Add product identifiers
Identifiers are the biggest trust signal in product data. Add GTINs and MPNs if you have them:
"gtin13": "0123456789012",
"mpn": "TB-HIKE-W-001"
These go at the Product level, alongside sku. A GTIN lets AI agents verify your product across manufacturer databases, comparison engines, and other retailers. Products with identifiers consistently score higher in AI confidence rankings than those without.
If you don’t have a GTIN (common for private-label or handmade products), use mpn and sku at minimum. Some AI agents accept a productID as a fallback.
Step 4: Add AggregateRating and Reviews
If your product has reviews, surface them as structured data. This is one of the highest-impact additions you can make:
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.7",
"reviewCount": "438",
"bestRating": "5",
"worstRating": "1"
},
"review": [
{
"@type": "Review",
"author": {
"@type": "Person",
"name": "Alex M."
},
"datePublished": "2026-02-14",
"reviewRating": {
"@type": "Rating",
"ratingValue": "5"
},
"reviewBody": "Kept my feet completely dry on a 4-day trek through the Cascades in steady rain. Great ankle support on loose scree. Took about 15 miles to break in."
}
]
Include 3-5 representative reviews in your markup. Choose reviews that mention specific use cases, conditions, and product attributes — these give AI agents concrete evidence to match against shopper queries.
Step 5: Add custom attributes with additionalProperty
Schema.org’s Product type doesn’t have named fields for every attribute. additionalProperty fills the gaps:
"additionalProperty": [
{
"@type": "PropertyValue",
"name": "Waterproof Rating",
"value": "20,000mm"
},
{
"@type": "PropertyValue",
"name": "Boot Height",
"value": "6 inches"
},
{
"@type": "PropertyValue",
"name": "Outsole",
"value": "Vibram Megagrip"
},
{
"@type": "PropertyValue",
"name": "Weight",
"value": "1 lb 9 oz per boot"
},
{
"@type": "PropertyValue",
"name": "Upper Material",
"value": "Full-grain leather with waterproof membrane"
}
]
This is where you differentiate. Every attribute you add here is a potential match point for an AI agent processing a specific shopper query. “Waterproof hiking boot with Vibram sole under 2 pounds” — your product matches. A competitor without these fields doesn’t.
Testing your markup
Before publishing, validate your JSON-LD with two tools:
Google Rich Results Test — search.google.com/test/rich-results Paste your product page URL or a code snippet. Google will show you exactly what it can extract, flag errors, and highlight warnings. This is what Google’s AI sees when it processes your page.
Schema.org Validator — validator.schema.org Validates your JSON-LD against the schema.org specification. Catches structural issues that the Rich Results Test might not flag, like incorrect types or deprecated properties.
Run both. Fix every error. Warnings are worth addressing too — they often flag missing fields that AI agents value even if Google doesn’t strictly require them.
Common pitfalls to avoid
Don’t duplicate markup. If your platform auto-generates JSON-LD and you add your own, you’ll have two competing Product blocks on the same page. AI agents may read the wrong one — or get confused by conflicting data. Check your page source for existing markup before adding new blocks.
Don’t fabricate data. If you don’t have reviews, don’t add fake AggregateRating markup. AI agents cross-reference review data with third-party sources. Fabricated reviews erode trust across your entire catalog.
Keep it current. JSON-LD that shows a product in stock when it’s sold out, or lists last year’s price, does more damage than having no markup at all. If you can’t keep your structured data synchronized with your actual inventory and pricing, automate the process or use your platform’s built-in tools.
What you’ve built
By the end of these five steps, your product page has complete, validated JSON-LD that tells AI shopping agents: this is a verified product from a named brand, at a specific price, currently available, rated well by real customers, and differentiated by specific measurable attributes. That’s the data foundation for AI visibility — and it takes about 15 minutes to implement for your first product.