Skip to content

Glossary Product schema markup

Product schema markup

Definition

Product schema markup is the markup, usually JSON-LD written in the schema.org vocabulary, that states the name, image, price, availability and ratings of an item so a search engine can read them without having to interpret the page layout.

On this page 5
  1. What «product schema markup» means
  2. How it works: from markup to the Google result
  3. Why it matters
  4. Best practices
  5. Common mistakes
In brief

The markup that describes an item and its offer in machine-readable form, and that decides whether the page shows up in Google with price, availability and stars.

What «product schema markup» means

A crawler sees a product page as text and layout markup. The price may sit in a span with the class «price», in a table, inside a tab or even in an image. Product markup removes that ambiguity: it states, in a machine-readable block, that this number is the current price, that this string is the item name and that this 4.6 sums up 128 reviews.

The vocabulary comes from schema.org and the central type is Product. Around it sit Offer, which carries the commercial terms; AggregateRating, which summarises the average rating; and Review, which represents one opinion with its author and score.

Three layers get confused daily and need separating. The markup lives in the page HTML and is read by the crawler. The product feed is a file the shop sends to Merchant Center. The visible page is what the person reads. All three must tell the same story, yet they are separate channels with separate rules.

The type itself also needs a boundary. Product describes one specific commercial item: not a category, not a listing and not the shop as a company. For the company there is Organization, and its rules on ratings are different.

How it works: from markup to the Google result

The markup is placed in the HTML as a JSON-LD block. Google distinguishes two outputs for that same type.

Product snippets are meant for pages where the item cannot be bought on the spot, for example an editorial review. One of these three properties is enough: review, aggregateRating or offers.

Merchant listings are meant for pages where the item is actually bought, and they feed experiences such as the shopping knowledge panel, popular products and Google Images. There, name, image and an offers with price (or priceSpecification.price) and priceCurrency are required, and the price must be greater than zero. Also recommended are availability, shippingDetails, hasMerchantReturnPolicy, url and priceValidUntil. In July 2026 the documentation added Product.category and the duration of a sale price, aligned with the equivalent feed attribute.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Kora office chair",
  "image": ["https://example.com/kora-1.jpg"],
  "sku": "KORA-01",
  "brand": { "@type": "Brand", "name": "Kora" },
  "offers": {
    "@type": "Offer",
    "url": "https://example.com/kora-chair",
    "price": "249.00",
    "priceCurrency": "EUR",
    "availability": "https://schema.org/InStock",
    "itemCondition": "https://schema.org/NewCondition"
  },
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.6",
    "reviewCount": "128"
  }
}
</script>

There is a second circuit, the Merchant Center one. Automatic item updates read price, availability and condition from the landing page markup and correct the feed while it lags behind. If that correction is switched off and the values disagree, the product gets an item-level disapproval and stops appearing in free listings and ads.

Why it matters

The decision that depends on this is not «will I rank higher?» but «what does my catalogue look like when it appears, and is it allowed to appear at all?». Two pages in the same position do not perform alike if one shows price, availability and stars while the other shows a blue title.

The second decision is operational and costs real money. In the Merchant Center circuit, a mismatch between feed, page and markup does not degrade anything quietly: it disapproves the item. A deployment that changes prices in the visible template but leaves the JSON-LD served from an old cache can pull thousands of listings out of the shop window within hours.

The third is about where the effort goes. With the minimum markup (name, image, offers) the page is already eligible; the remaining properties widen where it can appear. Knowing what is required and what is recommended lets you decide whether development time spent exposing the return policy or shipping costs in the markup pays off, or whether it pays off better in the feed.

One warning about expectations: markup does not create eligibility for features Google has retired. Publishing vocabulary that no longer has a visual output does no harm, but it returns nothing either.

Best practices

  • Generate the JSON-LD from the same data source that prints the price on screen. Hand-written or separately cached markup drifts apart at the first price change.
  • Mark up only the main product of the page, with the same price and the same currency the person sees, and with no currency symbol or thousands separator inside price.
  • Ship the price change on the page, in the markup and in the feed within the same deployment. All three layers must agree before the crawler arrives.
  • Use availability and itemCondition with the full schema.org URLs, and keep priceValidUntil on a future date while the offer is live.
  • Use aggregateRating only when the ratings come from real customers about that item and are visible on the page itself.
  • Validate with the rich results test before deploying, then check the matching Search Console report afterwards, which is where real behaviour at scale becomes visible.

Common mistakes

  • Putting aggregateRating on a category page or the homepage, covering a set that is not one specific product.
  • Describing the company with Organization or LocalBusiness and hanging the reviews the company itself manages about itself off that type. Google declares such pages ineligible for the star feature.
  • Leaving priceValidUntil on a date that has already passed, which can stop the listing from being shown.
  • Writing the price with a thousands separator or putting the euro sign inside the numeric value.
  • Treating markup and feed as projects of separate teams, with nobody comparing both values after each price or stock change.
Manuel Riveiro Rodriguez CEO & Digital Strategist

A technical audit covers this and everything else in one pass.

Request an audit

Frequently asked

Does product schema markup improve rankings?

It does not work as a position factor. What it changes is eligibility for expanded presentations, and with it the look of the result: price, availability and stars. The measurable effect shows up in click-through rate and in access to surfaces such as Google Images or popular products, not in position.

Can I mark up the reviews we collect in our own shop?

Yes, as long as they are customer opinions about the item and are visible on that page. The rule that forbids this covers a different case: when the reviewed entity controls the reviews about itself, its pages using Organization or LocalBusiness are excluded from the star feature.

What happens if the feed price does not match the page price?

Google compares the feed with the landing page, markup included. With automatic updates enabled it can correct the feed from the page. Without them, a price or availability mismatch triggers an item disapproval, and the product stops appearing in free listings and Shopping ads.

Is there still an FAQ rich result on a product page?

No. Google announced the retirement in May 2025, the feature stopped appearing on 7 May 2026, and the documentation was removed in June 2026. The FAQPage vocabulary remains valid and keeping it causes no problems, but it no longer produces that presentation in the SERP.

JSON-LD or microdata?

Both formats are read, and in the Merchant Center circuit the microdata on the landing page is interpreted too. For new markup, JSON-LD is the better choice: it is generated from the template as a single block, it does not tangle with the visible HTML and it survives frontend redesigns better.

Sources

  1. Google's overview page on product markup: it separates product snippets (pages where the item cannot be bought) from merchant listings (purchase pages) and names the current surfaces, among them the shopping knowledge panel, popular products and Google Images.
  2. Merchant listing documentation: required properties (<code>name</code>, <code>image</code>, <code>offers</code> with <code>price</code> and <code>priceCurrency</code>, price greater than zero) and recommended ones, plus the July 2026 additions on product category and sale duration.
  3. Review snippet guide: it sets the required properties of <code>Review</code> and <code>AggregateRating</code> and the self-serving review rule, which excludes pages using <code>Organization</code> or <code>LocalBusiness</code> from the star feature when the reviewed entity controls those reviews.
  4. Merchant Center help on inconsistent availability between feed and landing page: Google compares the data source with the page, the checkout process and the markup, and disapproves the item when they disagree.
  5. Changelog of the Google Search documentation, where the dated retirements are recorded: the May 2025 notice about FAQ results, their disappearance from the SERP on 7 May 2026 and the removal of the documentation in June 2026.