Structured data is one of the most effective ways to stand out in Google search results. For online stores, proper Schema.org implementation can significantly increase CTR through rich results - enhanced results displaying prices, ratings, and product availability.
What is Schema.org Structured Data?
Schema.org is a joint initiative by Google, Microsoft, Yahoo, and Yandex that defines a standard vocabulary for describing content on web pages. This helps search engines better understand the context of your pages.
Implementation Formats
Structured data can be implemented in three formats:
- JSON-LD (recommended by Google)
- Microdata (embedded in HTML)
- RDFa (HTML5 extension)
Google officially recommends JSON-LD because:
- It’s separated from HTML code
- Easier to implement and maintain
- Less prone to errors
- Supports dynamic generation
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Product Name"
}
</script>
Product Schema - E-commerce Foundation
Product is the main Schema.org type for product pages. It allows you to describe all key product information.
Minimal Implementation
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Premium Men's Polo Shirt",
"image": "https://example.com/images/polo-shirt.jpg",
"description": "Elegant polo shirt made from organic cotton. Available in sizes S-XXL.",
"sku": "POLO-001",
"brand": {
"@type": "Brand",
"name": "Premium Fashion"
},
"offers": {
"@type": "Offer",
"price": "49.99",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock"
}
}
Full Implementation with All Fields
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Premium Men's Polo Shirt",
"image": [
"https://example.com/images/polo-shirt-front.jpg",
"https://example.com/images/polo-shirt-back.jpg",
"https://example.com/images/polo-shirt-detail.jpg"
],
"description": "Elegant polo shirt made from organic cotton. Available in sizes S-XXL. Perfect for everyday wear and office.",
"sku": "POLO-001",
"mpn": "925872",
"gtin13": "5901234123457",
"brand": {
"@type": "Brand",
"name": "Premium Fashion"
},
"manufacturer": {
"@type": "Organization",
"name": "Premium Fashion Inc."
},
"category": "Clothing > Men > Polo Shirts",
"color": "Navy Blue",
"material": "100% organic cotton",
"size": "M",
"audience": {
"@type": "PeopleAudience",
"suggestedGender": "male"
},
"offers": {
"@type": "Offer",
"url": "https://example.com/premium-polo-shirt",
"price": "49.99",
"priceCurrency": "USD",
"priceValidUntil": "2026-12-31",
"availability": "https://schema.org/InStock",
"itemCondition": "https://schema.org/NewCondition",
"seller": {
"@type": "Organization",
"name": "Premium Fashion Store"
},
"shippingDetails": {
"@type": "OfferShippingDetails",
"shippingRate": {
"@type": "MonetaryAmount",
"value": "5.00",
"currency": "USD"
},
"shippingDestination": {
"@type": "DefinedRegion",
"addressCountry": "US"
},
"deliveryTime": {
"@type": "ShippingDeliveryTime",
"handlingTime": {
"@type": "QuantitativeValue",
"minValue": 0,
"maxValue": 1,
"unitCode": "DAY"
},
"transitTime": {
"@type": "QuantitativeValue",
"minValue": 1,
"maxValue": 3,
"unitCode": "DAY"
}
}
},
"hasMerchantReturnPolicy": {
"@type": "MerchantReturnPolicy",
"applicableCountry": "US",
"returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
"merchantReturnDays": 30,
"returnMethod": "https://schema.org/ReturnByMail",
"returnFees": "https://schema.org/FreeReturn"
}
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.7",
"reviewCount": "156",
"bestRating": "5",
"worstRating": "1"
},
"review": [
{
"@type": "Review",
"reviewRating": {
"@type": "Rating",
"ratingValue": "5",
"bestRating": "5"
},
"author": {
"@type": "Person",
"name": "John Smith"
},
"datePublished": "2025-10-15",
"reviewBody": "Great material quality, perfect fit. Highly recommended!"
}
]
}
Offer Schema - Prices and Availability
Offer describes a product’s sales offer. It’s nested within Product or can exist independently.
Availability Statuses
"availability": "https://schema.org/InStock" // In Stock
"availability": "https://schema.org/OutOfStock" // Out of Stock
"availability": "https://schema.org/PreOrder" // Pre-order
"availability": "https://schema.org/BackOrder" // Back Order
"availability": "https://schema.org/Discontinued" // Discontinued
"availability": "https://schema.org/LimitedAvailability" // Limited Availability
Product Conditions
"itemCondition": "https://schema.org/NewCondition" // New
"itemCondition": "https://schema.org/UsedCondition" // Used
"itemCondition": "https://schema.org/RefurbishedCondition" // Refurbished
"itemCondition": "https://schema.org/DamagedCondition" // Damaged
Product Variants (AggregateOffer)
When a product has multiple variants with different prices:
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Runner Pro Sports Shoes",
"offers": {
"@type": "AggregateOffer",
"lowPrice": "99.00",
"highPrice": "129.00",
"priceCurrency": "USD",
"offerCount": "5",
"availability": "https://schema.org/InStock"
}
}
AggregateRating - Ratings and Reviews
AggregateRating summarizes product ratings. It’s a key element for rich results with star ratings.
Basic Implementation
{
"@type": "AggregateRating",
"ratingValue": "4.5",
"reviewCount": "89",
"bestRating": "5",
"worstRating": "1"
}
With Full Reviews
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Pro Wireless Headphones",
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.8",
"reviewCount": "234",
"bestRating": "5",
"worstRating": "1"
},
"review": [
{
"@type": "Review",
"reviewRating": {
"@type": "Rating",
"ratingValue": "5",
"bestRating": "5"
},
"author": {
"@type": "Person",
"name": "Anna Johnson"
},
"datePublished": "2025-11-20",
"reviewBody": "Best headphones I've ever had. Excellent sound isolation."
},
{
"@type": "Review",
"reviewRating": {
"@type": "Rating",
"ratingValue": "4",
"bestRating": "5"
},
"author": {
"@type": "Person",
"name": "Peter Williams"
},
"datePublished": "2025-11-18",
"reviewBody": "Very good, but the case could be smaller."
}
]
}
BreadcrumbList - Navigation Path
BreadcrumbList helps Google understand site structure and displays the path in search results.
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://example.com/"
},
{
"@type": "ListItem",
"position": 2,
"name": "Men's Clothing",
"item": "https://example.com/mens-clothing/"
},
{
"@type": "ListItem",
"position": 3,
"name": "Polo Shirts",
"item": "https://example.com/mens-clothing/polo-shirts/"
},
{
"@type": "ListItem",
"position": 4,
"name": "Premium Polo Shirt"
}
]
}
Organization and LocalBusiness
For company and about pages:
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "Premium Fashion Inc.",
"url": "https://example.com",
"logo": "https://example.com/logo.png",
"sameAs": [
"https://www.facebook.com/premiumfashion",
"https://www.instagram.com/premiumfashion",
"https://www.linkedin.com/company/premiumfashion"
],
"contactPoint": {
"@type": "ContactPoint",
"telephone": "+1-555-123-4567",
"contactType": "customer service",
"availableLanguage": ["English", "Spanish"]
}
}
If you have a physical store, use LocalBusiness:
{
"@context": "https://schema.org",
"@type": "Store",
"name": "Premium Fashion - Retail Store",
"image": "https://example.com/store.jpg",
"address": {
"@type": "PostalAddress",
"streetAddress": "123 Main Street",
"addressLocality": "New York",
"postalCode": "10001",
"addressCountry": "US"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 40.7128,
"longitude": -74.0060
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "10:00",
"closes": "20:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Saturday",
"opens": "10:00",
"closes": "18:00"
}
],
"telephone": "+1-555-123-4567"
}
Implementation in Popular Platforms
WooCommerce
WooCommerce has built-in structured data, but it’s worth extending with a plugin:
- Rank Math SEO - full control over Schema
- Yoast SEO - basic structured data
- Schema Pro - advanced options
Shopify
Shopify automatically generates basic Product data. Extensions:
- Edit
product.liquidfile - Apps from App Store (JSON-LD for SEO)
PrestaShop
// In product template
{literal}
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "{/literal}{$product.name|escape:'htmlall':'UTF-8'}{literal}",
"image": "{/literal}{$product.cover.large.url}{literal}",
"description": "{/literal}{$product.description_short|strip_tags|escape:'htmlall':'UTF-8'}{literal}",
"sku": "{/literal}{$product.reference}{literal}",
"offers": {
"@type": "Offer",
"price": "{/literal}{$product.price_amount}{literal}",
"priceCurrency": "USD",
"availability": "https://schema.org/{/literal}{if $product.quantity > 0}InStock{else}OutOfStock{/if}{literal}"
}
}
</script>
{/literal}
Custom (JavaScript/Astro/Next.js)
// Generating JSON-LD in JavaScript
function generateProductSchema(product) {
return {
"@context": "https://schema.org",
"@type": "Product",
"name": product.name,
"image": product.images,
"description": product.description,
"sku": product.sku,
"brand": {
"@type": "Brand",
"name": product.brand
},
"offers": {
"@type": "Offer",
"price": product.price.toFixed(2),
"priceCurrency": "USD",
"availability": product.inStock
? "https://schema.org/InStock"
: "https://schema.org/OutOfStock",
"itemCondition": "https://schema.org/NewCondition"
},
...(product.rating && {
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": product.rating.average.toFixed(1),
"reviewCount": product.rating.count.toString()
}
})
};
}
// Inject into HTML
const schema = generateProductSchema(productData);
document.head.insertAdjacentHTML(
'beforeend',
`<script type="application/ld+json">${JSON.stringify(schema)}</script>`
);
Testing and Validation
Google Tools
-
Rich Results Test - Official Google tool https://search.google.com/test/rich-results
-
Schema Markup Validator - Detailed validation https://validator.schema.org/
-
Google Search Console - “Enhancements” report shows structured data errors
Common Validation Errors
- Missing required fields - e.g.,
offerswithoutprice - Invalid values - e.g.,
availabilitywithout full URL - Wrong data types - e.g.,
priceas number instead of string - Missing context - forgotten
@context
Best Practices
1. Data Accuracy
Structured data MUST match the visible content on the page. Google penalizes discrepancies.
2. One Implementation Per Page
Avoid duplicating the same Schema type on a single page.
3. Update Data Dynamically
Prices, availability, and ratings should be updated in real-time.
4. Test Before Deployment
Always validate Schema before publishing to production.
5. Monitor in Search Console
Regularly check the “Enhancements” report in Google Search Console.
Summary
Schema.org structured data is a must-have for every online store. Proper implementation:
- Increases CTR through rich results (stars, prices, availability)
- Helps Google better understand your products
- Can improve search result rankings
- Facilitates Google Shopping integration
Start with a basic Product implementation with Offer, then expand to AggregateRating, Review, and shipping details. Remember to test regularly and monitor in Search Console.
Sources
-
Google Search Central - Structured data markup https://developers.google.com/search/docs/appearance/structured-data
-
Schema.org - Product https://schema.org/Product
-
Google Search Central - Product structured data https://developers.google.com/search/docs/appearance/structured-data/product
-
Google Rich Results Test https://search.google.com/test/rich-results
-
Schema.org - Offer https://schema.org/Offer
-
Google Search Central - Review snippet https://developers.google.com/search/docs/appearance/structured-data/review-snippet



