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:

  1. JSON-LD (recommended by Google)
  2. Microdata (embedded in HTML)
  3. 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 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"
}

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.liquid file
  • 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

  1. Rich Results Test - Official Google tool https://search.google.com/test/rich-results

  2. Schema Markup Validator - Detailed validation https://validator.schema.org/

  3. Google Search Console - “Enhancements” report shows structured data errors

Common Validation Errors

  1. Missing required fields - e.g., offers without price
  2. Invalid values - e.g., availability without full URL
  3. Wrong data types - e.g., price as number instead of string
  4. 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

  1. Google Search Central - Structured data markup https://developers.google.com/search/docs/appearance/structured-data

  2. Schema.org - Product https://schema.org/Product

  3. Google Search Central - Product structured data https://developers.google.com/search/docs/appearance/structured-data/product

  4. Google Rich Results Test https://search.google.com/test/rich-results

  5. Schema.org - Offer https://schema.org/Offer

  6. Google Search Central - Review snippet https://developers.google.com/search/docs/appearance/structured-data/review-snippet