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.