What this guide is about
- What Schema.org is and why markup is needed
- Which format to use (JSON-LD)
- Required and recommended fields for a product page
- Step-by-step examples: from basic to advanced
- Validation, tools, and recommendations
- Specifics for e-commerce platforms
1. What Schema.org is and why it is needed
Schema.org is a dictionary (vendor-neutral schema) for structured data, supported by major search engines. Markup helps search engines properly understand the content of a product page and can lead to enhanced snippets (price, availability, rating, reviews, images, and correct display on social networks via Open Graph and Twitter Cards).
Official links (recommended):
- Google — Product structured data
- Schema.org — Product
- Schema.org — Offer
- Schema.org — AggregateRating
- Schema.org — Review
- Schema.org — BreadcrumbList
2. Which markup format to use
Google recommends JSON-LD. It does not interfere with the DOM, can be easily inserted by the server, and dynamically generated from database data.
Existing formats: JSON-LD (recommended), Microdata, RDFa — choose JSON-LD for e-commerce.
3. Required fields for a correct product page
Minimum required for proper Google processing:
- name — product name
- image — at least one image (URL)
- description — short description
- offers.price — price
- offers.priceCurrency — currency (ISO code, e.g., UAH, USD)
- offers.availability — availability (https://schema.org/InStock, etc.)
- offers.url — URL of the product page
4. Recommended additional fields (full list of useful attributes)
- sku — stock keeping unit
- mpn — manufacturer part number
- gtin8 / gtin12 / gtin13 / gtin14 — barcode
- brand — brand
- category — category
- color, material, size, weight — product characteristics
- aggregateRating — aggregate rating
- review — reviews
- itemCondition — product condition
- additionalProperty — custom properties (PropertyValue)
- shippingDetails / OfferShippingDetails — shipping terms
- seller — organization-seller
5. Simple working JSON-LD example (minimum)
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Wireless Headphones X100",
"image": "https://site.com/images/headphones-x100.jpg",
"description": "Wireless headphones with noise cancellation.",
"offers": {
"@type": "Offer",
"url": "https://site.com/product/headphones-x100",
"priceCurrency": "UAH",
"price": "2499",
"availability": "https://schema.org/InStock"
}
}
</script>
Note: price — send as number/string of digits (without currency symbol). availability — use full schema.org URL (e.g., https://schema.org/InStock).
6. Detailed product markup (full example)
Below is markup with many fields: GTIN, brand, SKU, multiple images, aggregateRating, review, additionalProperty, shippingDetails.
<script type="application/ld+json">
{
"@context": "https://schema.org/",
"@type": "Product",
"name": "Xiaomi Mi Band 7",
"image": [
"https://site.com/upload/mi-band-7-1.webp",
"https://site.com/upload/mi-band-7-2.webp"
],
"description": "Fitness band with AMOLED screen and heart rate monitor.",
"sku": "MI-BAND-7-BLACK",
"mpn": "MB7-2025",
"gtin13": "6954176850021",
"brand": {
"@type": "Brand",
"name": "Xiaomi"
},
"additionalProperty": [
{
"@type": "PropertyValue",
"name": "Color",
"value": "Black"
},
{
"@type": "PropertyValue",
"name": "Material",
"value": "Silicone, metal"
}
],
"offers": {
"@type": "Offer",
"url": "https://site.com/product/mi-band-7/",
"priceCurrency": "UAH",
"price": "1499",
"priceValidUntil": "2026-12-31",
"availability": "https://schema.org/InStock",
"itemCondition": "https://schema.org/NewCondition",
"seller": {
"@type": "Organization",
"name": "Hotlist.biz"
},
"shippingDetails": {
"@type": "OfferShippingDetails",
"shippingRate": {
"@type": "MonetaryAmount",
"value": "50"
}
}
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.8",
"reviewCount": "238"
},
"review": [
{
"@type": "Review",
"author": "Olena",
"datePublished": "2025-02-10",
"reviewBody": "Great band, works reliably!",
"reviewRating": {
"@type": "Rating",
"ratingValue": "5"
}
}
]
}
</script>
7. Product variants (size/color) — approaches
Two common approaches:
- One main
Product+ list ofoffers(or separateOfferfor each variant). - Multiple
Product(one per variant page) — use if each variant has its own page/URL.
Example: Product with two Offers (two colors, one page):
<script type="application/ld+json">
{
"@context":"https://schema.org",
"@type":"Product",
"name":"Classic T-Shirt",
"image":["https://site.com/img/tshirt-red.jpg"],
"description":"Classic T-Shirt",
"sku":"TSHIRT-001",
"brand":{"@type":"Brand","name":"BrandCo"},
"offers":[
{
"@type":"Offer",
"sku":"TSHIRT-001-RED",
"price":"599",
"priceCurrency":"UAH",
"availability":"https://schema.org/InStock",
"itemCondition":"https://schema.org/NewCondition",
"color":"Red"
},
{
"@type":"Offer",
"sku":"TSHIRT-001-BLUE",
"price":"599",
"priceCurrency":"UAH",
"availability":"https://schema.org/OutOfStock",
"itemCondition":"https://schema.org/NewCondition",
"color":"Blue"
}
]
}
</script>
8. BreadcrumbList — useful for navigation
Breadcrumbs help search engines display site structure in snippets.
<script type="application/ld+json">
{
"@context":"https://schema.org",
"@type":"BreadcrumbList",
"itemListElement":[
{
"@type":"ListItem",
"position":1,
"name":"Home",
"item":"https://site.com/"
},
{
"@type":"ListItem",
"position":2,
"name":"Category: Bracelets",
"item":"https://site.com/category/bracelets"
},
{
"@type":"ListItem",
"position":3,
"name":"Xiaomi Mi Band 7",
"item":"https://site.com/product/mi-band-7/"
}
]
}
</script>
9. How to validate markup — tools
- Google Rich Results Test — quickly shows errors and warnings for rich snippets.
- validator.schema.org — detailed schema validation.
- Google Search Console — under "Enhancements" → "Products" you can track errors after publishing.
10. Best practices and recommendations
- Generate JSON-LD server-side from the database — price, availability, sku, images must match page content.
- Do not use test/fake data in production.
- If showing multiple prices (sales), use
priceValidUntiland provide current price inoffers.price. - Specify
priceCurrencyin ISO format (UAH, USD, EUR). - Avoid conflicting markup (different prices in visible content and JSON-LD).
- For international stores — specify locale, seller address, and shippingDetails.
11. Common mistakes and how to fix them
- Error: price contains currency symbol — fix: store and output only digits.
- Error: missing image — fix: add at least one valid URL.
- Error: mismatched URLs — fix: use the current product page URL in offers.url.
- Error: fake review/aggregateRating — fix: show only real reviews.
12. SEO tips
- Add structured data to every product page — increases chance of enhanced snippet.
- Add detailed images (ImageObject) with width/height if possible.
- Use
BreadcrumbListandProducttogether — improves search result navigation. - Monitor Search Console and fix markup errors.
13. Template for dynamic product insertion
Below is a template where variables are replaced server-side (PHP/Twig/Smarty). Replace %VAR% with your data.
<script type="application/ld+json">
{
"@context":"https://schema.org",
"@type":"Product",
"name":"%PRODUCT_NAME%",
"image":[%IMAGE_LIST%],
"description":"%SHORT_DESCRIPTION%",
"sku":"%SKU%",
"brand":{"@type":"Brand","name":"%BRAND%"},
"offers":{
"@type":"Offer",
"url":"%PRODUCT_URL%",
"priceCurrency":"%CURRENCY%",
"price":"%PRICE%",
"priceValidUntil":"%PRICE_VALID_UNTIL%",
"availability":"%AVAILABILITY%"
}
}
</script>
14. Product Ratings (aggregateRating)
Ratings allow displaying average product rating and number of reviews in enhanced snippets.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Wireless Headphones X100",
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.7",
"reviewCount": "154"
}
}
</script>
Recommendation: ratingValue — decimal number (e.g., 4.7), reviewCount — integer.
15. Customer Reviews (review)
Reviews allow describing user opinions about the product, including author, publication date, and rating.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Wireless Headphones X100",
"review": [
{
"@type": "Review",
"author": "Olena",
"datePublished": "2025-05-10",
"reviewBody": "Very comfortable headphones, excellent sound!",
"reviewRating": {
"@type": "Rating",
"ratingValue": "5"
}
},
{
"@type": "Review",
"author": "Igor",
"datePublished": "2025-05-12",
"reviewBody": "Good, but slightly bulky.",
"reviewRating": {
"@type": "Rating",
"ratingValue": "4"
}
}
]
}
</script>
Each review includes author, date, text, and rating. You can add any number of reviews.
16. Useful tools and links
Important for Hotlist.biz users
By default, Hotlist.biz platform already includes correct basic markup (Product, Offer, Price, Availability, BreadcrumbList, ImageObject). Usually, it is enough to extend it with additional fields (gtin, mpn, etc.) if needed.
Additionally: rating markup (aggregateRating) and reviews (review) are automatically included, allowing display of average rating and real user reviews in enhanced snippets.