DocsCommerceProduct / Offer schema
Product / Offer schema
Price, availability and identifiers an agent can quote.
Why an agent cares
It is the only machine-readable statement of what a product costs and whether it is in stock, so a wrong currency or an unrecognised availability value makes an agent quote something false. Several of these are Google profile requirements rather than schema.org requirements, and the reference says which.
Adoption
Web baseline. Standard equipment on the web. Its absence is the exception rather than its presence.
Direction of travel: ► flat, as at .
Mature and measured: 0.77% of pages via JSON-LD and 1.50% via microdata (Web Almanac 2024), concentrated on product pages. Note that OpenAI chose a product feed spec over crawled markup.
What we check
productSchemaPresent is true, so a site that has not adopted this is not assessed on it and appears in no report. 6 of these 6 can fail it. In a Lumar crawl these land on the page's own row.| Check | Severity | Raises | On whose authority |
|---|---|---|---|
productSchemaMissingPrice | high | usability | Google Search profile |
productSchemaNonNumericPrice | high | usability | Google Search profile |
productSchemaMissingCurrency | high | usability | Google Search profile |
productSchemaInvalidCurrency | medium | usability | Google Search profile |
productSchemaMissingAvailability | medium | usability | Lumar readiness profile |
productSchemaInvalidAvailabilityEnum | medium | usability | Schema.org profile |
Examples
Both of these are fixtures the test suite runs through the real collector, not snippets written for a document: the first is a shape we score as valid, the second is one we flag.
<!-- productSchemaPresent + correct: Product with a complete Offer
(price, priceCurrency, availability, itemCondition). -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Wireless Headphones",
"sku": "WH-1000",
"image": "https://example.com/img/wh-1000.jpg",
"brand": { "@type": "Brand", "name": "Example" },
"offers": {
"@type": "Offer",
"price": "199.00",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"itemCondition": "https://schema.org/NewCondition",
"url": "https://example.com/commerce/correct.html"
}
}
</script><!-- productSchemaPresent: yes (Product + Offer exist). productSchemaNonNumericPrice +
productSchemaMissingCurrency + productSchemaMissingAvailability: price is
non-numeric and priceCurrency/availability are absent. -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Wireless Headphones",
"offers": {
"@type": "Offer",
"price": "cheap"
}
}
</script>Specifications
| Document | Revision | Kind |
|---|---|---|
| Schema.org Product | v30.0 | specification |
| Schema.org Offer | v30.0 | specification |
| Google Search: product structured data | updated 2025-12-10 | vendor profile |
Last re-read against the published documents: .
availability is Recommended rather than Required in both Google profiles, which is why a missing one is attributed to the Lumar readiness profile and not to Google.