In beta, with limited placesOpen to everyone in Q1 2027

↑↓ to move · Enter to open · Esc to close

Structured data

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.

Written by
Reviewed by
Reviewed by
Published 6 min read
Takeaway:

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.

Warning:

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

  1. Search for offers in the page source of the product page and note the price, the currency and the availability it declares.
  2. 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
  3. Look at the priceValidUntil date, 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
  4. 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
  5. 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

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. [1] Schema.org. Offer. Accessed . ↑ ↑ ↑
  2. [2] Google Search Central. Merchant listing (Product, Offer) structured data. Accessed . ↑ ↑ ↑
  3. [3] Google Search Central. Product snippet (Product, Review, Offer) structured data. Accessed . ↑ ↑
  4. [4] Google Search Central. Generate structured data with JavaScript. Accessed . ↑ ↑
  5. [5] Google Search Central. General structured data guidelines. Accessed . ↑ ↑
  6. [6] Search Console Help. Rich Results Test. Accessed . ↑
  7. [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.

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.