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.
Related articles
Edge Schema Injection via Cloudflare Workers
Deploying schema through a legacy CMS often means a developer ticket queue. Injecting it at the edge skips that entirely.
Entity Disambiguation for Technical SEO: sameAs and Graph Connections
Search engines evaluate connected entities now, not keyword strings. Disambiguation is how you tell them precisely which entity you mean.

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.