Rich result: supported

Product schema markup

Describes a product. Google splits this into two different experiences with different requirements.

Does Google still show a rich result for this?

Supported, in two distinct forms. A product snippet is for pages where the reader cannot buy directly; a merchant listing is for pages where they can. Conflating the two is the most common error with this type, because their requirements differ.

When to use it

On product pages. Choose merchant listing if the reader can purchase on that page, product snippet otherwise.

Required properties

  • name
  • one of: review, aggregateRating or offers (product snippet)
  • name, image and offers (merchant listing)

Recommended properties

  • aggregateRating
  • brand.name
  • description
  • gtin
  • review
  • sku
  • offers.availability
  • offers.itemCondition
  • offers.hasMerchantReturnPolicy
  • offers.shippingDetails
  • offers.priceValidUntil

Example

{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Example Wool Jumper",
  "image": ["https://example.co.uk/jumper.jpg"],
  "sku": "EX-1234",
  "brand": { "@type": "Brand", "name": "Example" },
  "offers": {
    "@type": "Offer",
    "url": "https://example.co.uk/jumper",
    "price": "89.00",
    "priceCurrency": "GBP",
    "availability": "https://schema.org/InStock",
    "itemCondition": "https://schema.org/NewCondition"
  }
}

Common mistakes

  • Using AggregateOffer for a merchant listing. It must be an Offer.
  • Setting a price of 0 on a merchant listing. The price must be greater than zero, unlike a product snippet.
  • Leaving priceValidUntil in the past, which suppresses the listing.
  • Adding pros and cons on a merchant or customer-review page. Google states only editorial product review pages are eligible for that appearance.
  • Encoding an active price in both offers.price and offers.priceSpecification. Google uses offers.price and ignores the other.

Check what your own pages are missing

Our free checker reads the markup already on a page and names the types it is missing for its page type. No account needed.

Run the schema checker →

Verified against Google’s structured data documentation and its changelog on 28/07/2026. Google changes what it supports without much notice — if you are reading this long afterwards, check the current documentation before acting on it. Background on why this markup matters beyond rich results is in the answer engine optimisation guide.