Offer schema for products: The Complete 2026 Guide
The Offer schema type is the pricing and availability backbone of any ecommerce structured data implementation. Without a valid Offer nested inside Product...
- Google requires three properties on Offer to qualify for price-rich results: price , priceCurrency , and availability .
- When a product is on sale, Google requires marking both the current price and the original price.
- If a product has multiple purchasing options for example, new vs used or different sellers , use an array of Offer objects.
- International pricing introduces a common failure point.
- The priceValidUntil property is critical for time-limited sales.
- Run this audit on every template that generates product offers: Verify price is a number or string with no commas or symbols.
The Offer schema type is the pricing and availability backbone of any ecommerce structured data implementation. Without a valid Offer nested inside Product , Google cannot generate price-rich results, sale price badges, or buy-now links. This guide details every property, pitfall, and pattern...
Required and recommended Offer properties
Google requires three properties on Offer to qualify for price-rich results: price, priceCurrency, and availability. The price must be a string or number representing the current cost. Always use ISO 4217 currency codes in priceCurrency (USD, EUR, GBP, and so on). The availability property uses schema.org enumeration values; the seven valid values are InStock, OutOfStock, PreOrder, PreSale, LimitedAvailability, InStoreOnly, and OnlineOnly.
"offers": {
"@type": "Offer",
"price": "349.99",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"url": "https://example.com/product/wh-1000xm6",
"priceValidUntil": "2027-01-01"
}
Sale pricing and the low price requirement
When a product is on sale, Google requires marking both the current price and the original price. Use price for the sale price and highPrice in combination with offerCount for multi-variant pricing. For a simple sale, the pattern is:
"offers": {
"@type": "Offer",
"price": "249.99",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"itemCondition": "https://schema.org/NewCondition",
"priceValidUntil": "2026-12-31"
}
Note that Google's 2025 update deprecated the wasPrice property in favor of price for the current sale amount and priceValidUntil for the sale end date. Do not use deprecated properties; they may be ignored during rich result evaluation.
Multiple offers for the same product
If a product has multiple purchasing options (for example, new vs used or different sellers), use an array of Offer objects. Each offer must have its own price, availability, and seller properties. Google will evaluate each offer separately for eligibility.
"offers": [
{
"@type": "Offer",
"price": "349.99",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"seller": {
"@type": "Organization",
"name": "Official Store"
}
},
{
"@type": "Offer",
"price": "299.99",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"seller": {
"@type": "Organization",
"name": "Marketplace Seller"
}
}
]
Price currency formatting gotchas
International pricing introduces a common failure point. Google expects price as a float or string without currency symbols or thousands separators. "price": "1,299.99" with a comma separator is invalid and will fail structured data parsing. Use dot-separated decimal notation only. Additionally, the priceCurrency value must be uppercase ISO 4217. Mixing formats across variants will cause validation errors.
PriceValidUntil and seasonal offers
The priceValidUntil property is critical for time-limited sales. Without it, Google may continue displaying an old sale price after the promotion ends, leading to user dissatisfaction and potential manual action. Set this property to the ISO 8601 date when the sale expires. For recurring sales, update the value programmatically through your CMS or a scheduled task.
Audit checklist for Offer schema
Run this audit on every template that generates product offers:
- Verify
priceis a number or string with no commas or symbols. - Confirm
priceCurrencyuses uppercase ISO 4217 code. - Check
availabilitymatches the actual stock state on the page. - Ensure
priceValidUntilis set for any sale or promotional price. - Validate that deprecated properties (
wasPrice,lowPrice,highPricewithoutofferCount) are not used. - Cross-reference the schema price against the rendered page price.
Offer schema is the most validated subset of Product markup in Google's evaluation pipeline. Inconsistencies between the structured price and the visible price are the top reason for rich result rejection. Keep every Offer value in strict alignment with what the user sees on the page.
Audit completed on 120 product offers across 4 templates: 3 templates had price format issues (commas in decimal values), 2 were missing priceValidUntil on sale items, and 1 used the deprecated wasPrice property. All templates are updated and pending deployment.