A price that appears only inside a picture, a pop-up or a script is easy to miss. Product and Offer markup states the price, currency and stock status in a plain form that software can read, right next to the same facts on the page.

The short answer

For each product page, add one Product block with one Offer inside it. Use the exact price shown to a shopper, a three-letter currency code, one availability value and a priceValidUntil date that is always in the future. Then keep it in step with the page every time the price changes.

This helps machines read your facts. It does not promise a better position or a rich result. Google says markup may not show up in search results, and says nothing in its AI features guide asks for special markup. It does list "making sure your structured data matches the visible text on the page" as a good habit.

Step 1: pick the right pages

Google says product markup is for a page about a single product, or variants of that product, each with its own page address. A category page or a list of products does not qualify. If you sell one product in two currencies, Google says to give each currency its own page address.

If shoppers cannot buy the product on the page, such as a page that links off to other sellers, it falls outside the merchant listing rules.

Step 2: collect the facts

Write these down from the page a shopper sees:

  • the product name
  • one or more image addresses that anyone can open
  • the price as a plain number, with a full stop for decimals, such as 49.90
  • the currency as a three-letter code, such as GBP or USD
  • whether it is in stock
  • the date until which this price holds

Google's examples show the price as a plain number, with the currency in its own field, and Google says to use a decimal point (.) for fractions. Do the same: no currency symbol and no thousand separator in the price. Google accepts 0 for a free product in product snippets, but merchant listings need a price above zero.

Step 3: use the template

This is a made-up product. Swap in your own facts.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Cedar and Sea Salt Candle, 220 g",
  "image": [
    "https://www.example.com/images/cedar-candle-1x1.jpg",
    "https://www.example.com/images/cedar-candle-4x3.jpg",
    "https://www.example.com/images/cedar-candle-16x9.jpg"
  ],
  "description": "A hand-poured soy wax candle with about 40 hours of burn time.",
  "sku": "CAN-CEDAR-220",
  "brand": { "@type": "Brand", "name": "Harbour Lane Candles" },
  "offers": {
    "@type": "Offer",
    "url": "https://www.example.com/candles/cedar-sea-salt",
    "price": 24.00,
    "priceCurrency": "GBP",
    "priceValidUntil": "2027-12-31",
    "availability": "https://schema.org/InStock",
    "itemCondition": "https://schema.org/NewCondition"
  }
}
</script>

Only claim "40 hours of burn time" if you have tested it. Everything in the block must be true and visible.

What the sources say about each field:

  • price and priceCurrency: Google asks for a price, and says the currency is recommended for product snippets and required for merchant listings. Always give both.
  • availability: use one value. Google says not to give more than one. schema.org lists several, among them InStock, OutOfStock, PreOrder, BackOrder and SoldOut. Pick the one that is true today.
  • priceValidUntil: a date in ISO 8601 form, such as 2027-12-31. Google warns that a snippet or listing may not show if this date is in the past.
  • image: for merchant listings Google recommends several high-resolution images in 16x9, 4x3 and 1x1 shapes, and says the image addresses must be crawlable and indexable.

Step 4: keep the date moving forward

The commonest slip is a priceValidUntil that was right when the page was built and is now in the past. Two ways to avoid it:

  1. Have your shop software write the date. Many platforms can set it a year ahead each time the page is built.
  2. If you set it by hand, put a reminder in your calendar a month before the date.

If you run a short sale, set the date to the day the sale ends. When it ends, change the price and the date together.

Common errors

  • Markup price differs from the page price. This is the one that matters most. Change both together, or let one source feed both.
  • A currency symbol in the price. Use a plain number, and put the currency in priceCurrency.
  • A comma as the decimal mark. Google says to use a decimal point (a full stop).
  • Stock status that never changes. If the page says "sold out" and the markup says InStock, one of them is wrong.
  • Markup on a category page. Move it to the product pages.
  • Markup added by JavaScript only. Google says generated markup can make Shopping crawls less frequent and less reliable, and recommends putting it in the page's initial HTML.
  • Two different Product blocks on one page. A theme and a plugin may both add one. This is our advice rather than a Google rule: keep one, so the facts cannot disagree.

How to check it worked

  1. Open Google's Rich Results Test, or the Schema Markup Validator, and enter the product page address. Fix anything marked as an error. Warnings for optional fields are advice, not a fault.
  2. View the page source and search for your price. It should appear in the visible page and in the markup, and they should agree.
  3. Run our schema check on the page.
  4. Change the price in a test, reload, and confirm the markup changed too.
  5. If you use Google Search Console, look at its Merchant listings report a few days after a change.

What this won't do

  • It will not make an AI assistant name your product. We have no evidence that markup alone does that, and Google says AI features need no special markup.
  • It will not make a price correct. If the price is wrong on the page, it will be wrong in the markup.
  • It will not bring a rich result back by itself, because Google decides what to show.
  • It will not fix a wrong price quoted by another site. For that, read fix what AI gets wrong.

Sources

  1. Google Search Central: Product snippet structured data Accessed
  2. Google Search Central: Merchant listing structured data Accessed
  3. Google Search Central: General structured data guidelines Accessed
  4. Google Search Central: AI features and your website Accessed
  5. schema.org: ItemAvailability Accessed