E-commerce: Promotion and Launch of an Online Store
Useful articles and guides on promoting, launching, and developing online stores in the E-commerce field

Structured Data Schema.org for Products — Complete Guide with Examples



Schema.org Structured Data for Products: Complete Guide


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):

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)

Code: JSON-LD
<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.

Code: JSON-LD
<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:

  1. One main Product + list of offers (or separate Offer for each variant).
  2. Multiple Product (one per variant page) — use if each variant has its own page/URL.

Example: Product with two Offers (two colors, one page):

Code: JSON-LD
<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.

Code: JSON-LD
<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 priceValidUntil and provide current price in offers.price.
  • Specify priceCurrency in 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 BreadcrumbList and Product together — 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.

Code: JSON-LD
<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.

Code: JSON-LD
<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.

Code: JSON-LD
<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.

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.

How to Use AI ChatGPT to Fill an Online Store
Basic recommendations for promoting an online store and increasing sales
Choosing a platform for a professional online store with many products and automation.