Paul LovellBook a call
Back to Blog
5 min readPaul Lovell

E-Commerce Schema Edge Cases: Variants, Regional Pricing, and Stock

Basic Product schema works until variants, currencies, and stock status enter the picture. Here's the pattern that avoids the validation errors.

Technical SEOStructured DataE-commerce SEO

Basic Product schema works fine for a single simple item. It starts generating invalid-structured-data warnings once variants (size, colour, material), regional currencies, and out-of-stock states enter the picture — which is most real e-commerce catalogues.

Use ProductGroup, not repeated Product blocks

Rather than generating a separate Product object for every variant combination on a page, use ProductGroup to link individual variant nodes under one parent:

{
  "@context": "https://schema.org",
  "@type": "ProductGroup",
  "name": "Technical SEO Running Shoes",
  "url": "https://example.com/shoes/pro-runner",
  "variesBy": ["https://schema.org/size", "https://schema.org/color"],
  "hasVariant": [
    {
      "@type": "Product",
      "sku": "RUN-RED-10",
      "name": "Technical SEO Running Shoes - Red / Size 10",
      "color": "Red",
      "size": "10",
      "offers": {
        "@type": "Offer",
        "price": "120.00",
        "priceCurrency": "GBP",
        "availability": "https://schema.org/InStock",
        "url": "https://example.com/shoes/pro-runner?color=red&size=10"
      }
    }
  ]
}

Pricing and stock details worth getting right

Use ISO 8601 formatting for priceValidUntil. And when stock hits zero, update availability to OutOfStock rather than deleting the Offer block — removing the offer entirely tends to remove rich-result pricing eligibility along with it, which is usually the opposite of what you want.

Paul Lovell

Written by

Paul Lovell

International SEO Consultant & Founder of Always Evolving SEO. 15+ years running technical audits, log-file analysis, and root-cause fixes for multimillion-dollar businesses — speaker at SMX London, Search & Content Summit, and SEMrush events.