What you need to know
For a single product price, put price and priceCurrency inside an Offer nested under Product.offers. Use AggregateOffer when the page genuinely describes a low-to-high range or multiple offers for the same product. Do not include currency symbols inside price; use an ISO 4217 code such as USD in priceCurrency.
Product prices in Schema.org are usually modeled as Product → offers → Offer. Offer.price is the numeric price and Offer.priceCurrency is the ISO 4217 currency code. AggregateOffer uses lowPrice, highPrice and optionally offerCount. Visible price and structured price must stay synchronized.
Key properties
The table below summarizes the fields that most often determine whether the entity is clear and internally consistent. Only provide values supported by the page.
| Property | Importance | How to use it |
|---|---|---|
price | Offer | Numeric current price without a currency symbol. |
priceCurrency | Strongly recommended | Three-letter ISO 4217 code such as USD. |
lowPrice / highPrice | AggregateOffer | Actual minimum and maximum represented by the page. |
offerCount | AggregateOffer | Number of offers when known. |
priceValidUntil | Optional | Only use a real known expiry date. |
availability | Recommended | Current ItemAvailability value. |
Price is usually part of Offer
Schema.org pricing for a product normally lives inside Offer or AggregateOffer because price describes a commercial offer, not the abstract Product identity.
How to format price
Use a machine-readable numeric value such as 1299.00. Keep currency out of price and put the ISO code in priceCurrency.
Offer versus AggregateOffer
Use Offer for one current sellable offer. Use AggregateOffer only when the same product genuinely has multiple offers or a visible price range.
Sale prices and complex pricing
Keep the active price synchronized with the page. Do not invent an old price or discount solely for structured data.
Multiple currencies
When a site serves several currencies, make the page/canonical model unambiguous. A structured offer should describe the currency actually presented for that URL.
Freshness
priceValidUntil is useful only when a real expiry exists. For frequently changing catalogues, keeping price and availability current matters more than adding every optional field.
Validation checklist
Confirm that Product, Offer and the visible page describe the same item, URL and price. Check decimal formatting, ISO currency and availability.
JSON-LD examples
Single price with Offer
Use when one current offer is visible.
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Wireless Headphones X2",
"offers": {
"@type": "Offer",
"url": "https://example.com/headphones-x2/",
"price": "149.99",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock"
}
}Price range with AggregateOffer
Use only for a real range of the same product.
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Conference Room Display",
"offers": {
"@type": "AggregateOffer",
"lowPrice": "999.00",
"highPrice": "1299.00",
"priceCurrency": "USD",
"offerCount": 3
}
}Google, Bing and Yandex
Google supports Offer and AggregateOffer for product results. priceCurrency is recommended for product snippets and required for merchant-listing scenarios.
Bing supports Schema.org JSON-LD and can use Product/Offer pricing to understand the commercial entity, but markup does not guarantee a price-enhanced result.
Yandex recognizes price on Offer and lowPrice on AggregateOffer together with priceCurrency for product scenarios.
Important: valid structured data does not guarantee a rich result. Each search engine decides whether to use the data and how to present it.
Common mistakes
- warningWriting $149.99 inside price.
- warningOmitting priceCurrency.
- warningUsing AggregateOffer for unrelated products.
- warningLeaving an expired priceValidUntil.
- warningStructured price differs from the visible page.
Frequently asked questions
Is there a Schema.org Price type?
For normal product structured data, price is usually a property of Offer or PriceSpecification, not a standalone page type.
Should price include a currency symbol?
No. Keep price numeric and place the ISO currency code in priceCurrency.
When should I use AggregateOffer?
When the same product genuinely has multiple offers or a price range on the page.