What is the Offer type in Schema.org?
Offer is the Schema.org type that describes the terms on which an item or a service is offered: the price, the currency, the availability, the condition, how long the price is valid and who is selling. On a product page, Offer is nested inside the product with the offers property, and it is the part of the markup that changes every time the price does.
Key takeaways
- Offer is not a promotion: it is any condition of sale, regular price included, and unless stated otherwise it means an offer to sell.
- The price is written with a decimal point and no symbol; the currency goes in its own property, as a three-letter code like USD.
- For merchant listings, Google requires a price above zero and a currency, and recommends availability, condition, shipping and returns.
- A price validity date that has already passed can stop Google from showing the product snippet.
- Price and availability have to change in the markup at the same moment they change on the page.
In the markup of a product page, Offer answers two questions the product does not: what it sells for and whether you can buy it today. It is a type from Schema.org, and its name is a vocabulary term, not a plain word. It has nothing to do with an offer in the sense of a discount: a shirt at its regular price has an Offer too. And it is not the product, which has its own type, Product. It matters because it is the part of your structured data Google needs to show the price in rich results, and the part that drifts most often: every markdown and every stock change leaves it stale unless it is updated at the same time as the page.
How it works
Schema.org defines Offer as an offer to transfer some rights to an item or to provide a service, with examples such as selling tickets, renting a movie, repairing a motorcycle or lending a book. Unless something else is stated, an Offer is understood as an offer to sell.[1]Schema.org. Offer On a product page, the product carries it inside the offers property.
The properties that matter in a store, according to Schema.org:[1]Schema.org. Offer
| Property | What it says |
|---|---|
price |
The price. With a period as the decimal separator, never a comma, and digits from 0 to 9 |
priceCurrency |
The currency, in ISO 4217 format, such as USD or EUR |
availability |
Availability: in stock, out of stock, preorder |
itemCondition |
The condition of the item, for example new or used |
priceValidUntil |
The date after which the price is no longer available |
seller |
Who is selling: an organization or a person |
shippingDetails |
The shipping terms |
hasMerchantReturnPolicy |
The return policy that applies |
Google takes that vocabulary and sets its own minimums. For merchant listings, the offer has to carry a price above zero and the currency as a three-letter ISO 4217 code. It also recommends availability, with values such as https://schema.org/InStock, OutOfStock, BackOrder or PreOrder; the condition, such as https://schema.org/NewCondition; the price validity date; shipping details; the return policy, with the MerchantReturnPolicy type; and the URL the item can be bought from.[2]Google Search Central. Merchant listing (Product, Offer) structured data
There is one more condition that is not in the vocabulary. Merchant listings accept only Offer, not AggregateOffer, because to qualify the merchant has to be the one selling the product. Product snippets, by contrast, accept both.[2]Google Search Central. Merchant listing (Product, Offer) structured data For them the price is required if you use Offer, the currency is recommended, and Google warns that the snippet may not show if priceValidUntil is a date in the past.[3]Google Search Central. Product snippet (Product, Review, Offer) structured data
And one warning that applies almost only to Offer. Google can read structured data added with JavaScript, but it warns that dynamically generated markup can make Shopping crawls less frequent and less reliable, a problem for things that change fast, like price and availability.[4]Google Search Central. Generate structured data with JavaScript
In a store
The offer for a shirt on sale, with what the page shows and how it is written in the markup. Fictional example: the store, the product, the price and the dates are made up.
| What the page shows | How it is written in the offer |
|---|---|
| $29.90 (was $39.90) | "price": "29.90" and "priceCurrency": "USD" |
| "In stock" | "availability": "https://schema.org/InStock" |
| "New" | "itemCondition": "https://schema.org/NewCondition" |
| "Price valid until October 31" | "priceValidUntil": "2026-10-31" |
"offers": {
"@type": "Offer",
"price": "29.90",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"itemCondition": "https://schema.org/NewCondition",
"priceValidUntil": "2026-10-31",
"url": "https://www.example.com/calella-linen-shirt"
}
Three things the example shows. The price in the offer is the one the customer pays today, the discounted one, because the data has to represent the page as it is.[5]Google Search Central. General structured data guidelines The validity date is only set if the page states one; here the sale has an announced end. And availability is an address in the vocabulary, not the phrase the customer reads: "Only a few left" or "Ships in 48 hours" have no equivalent value, so you mark the fact (it is in stock) and leave the rest on the page.
What people often mix up
Writing the price the way it looks on the page, "$29.90" or "29,90 €", inside price. Schema.org asks for a period as the decimal separator and the currency in its own property, with its ISO 4217 code.[1]Schema.org. Offer
How to check it
- Search for
offersin the page source of the product page and note the price, the currency and the availability it declares. - Compare them with what a customer sees at that moment, sale price included. If they do not match, the data does not represent the page.[5]Google Search Central. General structured data guidelines
- Look at the
priceValidUntildate, if there is one. If it has passed, the product snippet may not show.[3]Google Search Central. Product snippet (Product, Review, Offer) structured data - Check whether the offer is in the HTML the server sends or whether JavaScript adds it afterwards: for price and availability, Google warns that the second makes Shopping crawls less frequent and less reliable.[4]Google Search Central. Generate structured data with JavaScript
- Run the URL through the Rich Results Test to see which experiences it detects and with what errors.[6]Search Console Help. Rich Results Test
Related concept: AggregateOffer
AggregateOffer is the type Schema.org proposes when one product has several offers, for example the same pair of shoes sold by different shops, and it sums up the set with the lowest price (lowPrice), the highest (highPrice) and the number of offers (offerCount).[7]Schema.org. AggregateOffer It fits a comparison site or a marketplace; on the product page of a store that sells its own goods, Offer is the right type, and Google accepts only Offer for merchant listings.[2]Google Search Central. Merchant listing (Product, Offer) structured data
To keep going, the structured data reading path puts the other terms in order, and the JSON-LD entry shows where this offer sits inside a product page's block.
Synonyms
- English
- offer schema, offer markup
- Español
- marcado de oferta
Sources
- [1] Schema.org. Offer. Accessed . ↑ ↑ ↑
- [2] Google Search Central. Merchant listing (Product, Offer) structured data. Accessed . ↑ ↑ ↑
- [3] Google Search Central. Product snippet (Product, Review, Offer) structured data. Accessed . ↑ ↑
- [4] Google Search Central. Generate structured data with JavaScript. Accessed . ↑ ↑
- [5] Google Search Central. General structured data guidelines. Accessed . ↑ ↑
- [6] Search Console Help. Rich Results Test. Accessed . ↑
- [7] Schema.org. AggregateOffer. Accessed . ↑
Change history
- First English version, translated from the Spanish draft.
This definition is published under CC BY 4.0. Reuse this definition freely, crediting Clione with a link to this page.
Related terms
Product
What the Schema.org Product type is, which properties it carries, what Google requires for product snippets and merchant listings, and how to check it.
AggregateOffer
What AggregateOffer is in Schema.org, which properties Google asks for, why it doesn't fit your product page's variants and which pages it really suits.
Price and availability signals
What price and availability signals are, where each copy lives (product page, markup and feeds), how Google compares them and what happens when they differ.
OfferShippingDetails
What OfferShippingDetails is, what Google asks for to show shipping cost and delivery time, when to use it versus a store-wide policy and how to check it.
MerchantReturnPolicy
What MerchantReturnPolicy is, which properties Google asks for, where it goes (organization or offer), what overrides what and how to check it in your store.
Merchant listings
What Google's merchant listings are, where they appear, which Product and Offer markup they need and how to check whether your product page is eligible.
Make your catalog easy for bots to read
Clione fills every product page with what bots read best: the JSON-LD graph with its structured data, the meta description and the FAQs. You review and press Push; then we check your live store so it all stays published.