Skip to the tool
OnPageKit

Product Schema Generator

Build Product JSON-LD with a valid Offer.

absolute URLs
your own identifier
where it can be bought
digits only
ISO 4217
YYYY-MM-DD
AggregateRating (optional)
defaults to 5

Only fill these in when the reviews exist and are visible on the same page. Invented ratings are the fastest route to a manual action.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Product",
  "offers": {
    "@type": "Offer",
    "priceCurrency": "GBP",
    "availability": "https://schema.org/InStock"
  }
}
</script>
  • No image declared. Product results are image-first, and an item with none is rarely shown.
  • No description. Leave it out and the listing borrows whatever sentence the crawler finds first.
  • No sku. Without a stable identifier the same item on two URLs reads as two different products.
  • No brand. Merchant listings are matched on brand plus identifier, so an unbranded item matches nothing.
  • Nothing here qualifies for a product rich result yet: that needs price with currency and availability, or an aggregate rating.

Conformant markup and eligibility are different questions. Once the block is live, confirm it with Google’s Rich Results Test on the real URL.

Everything runs in your browser. Nothing you type is sent to a server.

Found a bug in this tool? Report it.

Share this tool

The fields that decide whether markup pays

This product schema generator writes the Product block that shopping surfaces read, and it is opinionated about one thing: an offer is either complete or it is decoration. Fill in the name, the images, the identifier and the brand, then give it either a whole offer or a genuine rating, and the JSON-LD is emitted with every empty field omitted rather than shipped as an empty string.

Price and availability travel together

The offer is the part shops get wrong. price is a number and nothing else — no symbol, no thousands separator, at most two decimal places. priceCurrency carries the unit and must be a three-letter code in capitals. Splitting them like that feels pedantic until you notice that a number with no unit is unusable and a unit with no number is meaningless, which is why this tool treats each half without the other as an error rather than a nudge.

availability is a URL, not a word. Writing InStock where schema.org expects https://schema.org/InStock is a silent failure: the property parses, the value does not resolve, and the offer is downgraded. The generator only ever emits the URL form, so the mistake is not available to make here.

priceValidUntil is the quietest trap of the lot. A date in the past does not merely age — it tells Google the offer has expired, and the item stops appearing. Shops set it once during a sale and never revisit it. This tool flags a date that has already gone by, using your own clock, without sending the value anywhere.

Merchant listing or product snippet

Two different results come out of the same vocabulary. The merchant listing is the commerce experience, and it expects a page where the thing can be bought: a complete offer, and ideally shipping and returns declared alongside. The product snippet is the lighter result that a review or comparison page can win, and it hangs on the rating rather than the price.

Knowing which you are aiming at changes what you fill in. A comparison article that lists five kettles is not a merchant listing and should not pretend to be one by inventing an offer for each. A shop page with a genuine price does not need a fabricated star rating to compete.

Ratings you did not earn

AggregateRating is the most abused node in the vocabulary, and the one with a real penalty attached. The rule is short: the reviews have to exist, they have to be about this item, and a visitor has to be able to see them on the page carrying the markup. Star ratings that appear only in search results and nowhere on the site are what manual actions are written for.

The generator will not emit half a rating. A ratingValue with no reviewCount is not an AggregateRating at all, so rather than pass an incomplete node to a parser that will discard it, the block is left out entirely and the tool says why.

Publish, then test the live URL

Everything above is about conformance, which is all a generator can promise. Eligibility is decided by Google against the page as crawled — whether the markup matches the visible content, whether the site is trusted, whether the offer is real. So embed the block, ship it, and let the Rich Results Test's reading of the crawled page settle it — its output lists every property Google recognised and every feature the URL can earn.

While you are there, make sure the page states its own address once and only once: the canonical tag generator writes that line. For a shop with a physical counter, the local business schema generator marks up the premises the products are sold from.

Frequently asked questions

What is the minimum a Product needs to earn a rich result?

A name, and then one of two things: an offer that carries price, priceCurrency and availability together, or an aggregateRating with both ratingValue and reviewCount. Name and image alone are valid schema.org and buy nothing. The generator warns when neither branch is complete, because that is the single most common reason a shop marks up a thousand pages and sees no change in the SERP.

Should price include the currency symbol?

No. price is a bare number — 89.00, never £89.00 and never 1,089.00. The unit lives in priceCurrency as a three-letter ISO 4217 code in capitals: GBP, USD, EUR. A symbol inside price is the error this tool rejects most often, and Google's parser drops the whole offer rather than guessing.

Can I mark up a review score I collected on another platform?

Only if those reviews are visible on the same page a visitor lands on. Google's structured data policy treats an aggregateRating pulled from elsewhere, or one no human can see, as spam, and the penalty is a manual action against the site rather than a shrug at the markup. If the stars are not on the page, leave the block out.

What is the difference between a merchant listing and a product snippet?

A merchant listing is the shopping experience — price, availability, delivery, returns — and it needs an offer that is complete and a page where the item can actually be bought. A product snippet is the review-style result that can appear for a page merely describing an item, and it leans on the rating. The same Product markup feeds both; which one you qualify for depends on the fields you filled in.

Do I need a GTIN as well as a SKU?

For your own catalogue a sku is enough to keep one item from reading as several. A gtin is what lets Google reconcile your item with the same item on every other shop, so any product that carries a barcode is worth adding one for. Both are identifiers rather than rich-result requirements — nothing is refused for lacking them.

Related tools

Updated