Product JSON-LD Checker

The official testing tools want a live URL, or they want you to send them the data. Neither is much use while you are still editing a template that has not shipped. Paste the block here instead — nothing leaves this page.

🔒 Your data never leaves your browser.

Structure is the easy half

Most validators check whether the fields exist. That catches the block with no name, and misses the one that is perfectly formed and quietly wrong:

Those checks are not extra work here — they are the same rule sets this site already uses for barcodes, currencies and number formats, applied to the fields that carry them.

One of offers, review or aggregateRating

A Product needs at least one of the three. Without any, there is nothing for a rich result to display, so nothing appears — which is indistinguishable from having never added the markup at all, and is why this failure survives so long.

Generate one

The output is run back through the checks above before it is offered, so what you copy is what this page would pass.

Every check this tool runs (15 rules)

LD-P01 Not valid JSON

The block does not parse. The usual causes are a trailing comma, a smart quote pasted in from a document, or an unescaped quote inside a product name.

Fix: Fix the syntax; the parser error says where it gave up.

Source: Derived from JSON syntax itself.

LD-T01 Not a Product

The @type is missing or is not Product, so none of the product rules apply to it.

Fix: Set "@type": "Product".

Source: Google Search Central — Product snippet structured data

LD-C01 Missing @context

Without "@context": "https://schema.org" the vocabulary is undefined, and the block is ignored no matter how correct the rest of it is.

Fix: Add "@context": "https://schema.org".

Source: Google Search Central — Product snippet structured data

LD-N01 Missing name

name is required on Product. Everything else describes something that is not identified.

Source: Google Search Central — Product snippet structured data

LD-O01 None of offers, review or aggregateRating

Google requires at least one of offers, review and aggregateRating. A Product with none of them carries no information a rich result could show, so nothing appears — which looks identical to markup that was never added.

Fix: Add offers with a price, which is the one most product pages can supply honestly.

Source: Google Search Central — Product snippet structured data

LD-PR01 Price is not a number

price must be a number. A currency symbol, a thousands separator or a comma decimal separator makes it a string that cannot be read as an amount — and "19,99" is the worst of them, because it looks right to a European reader and parses as something else or as nothing.

Fix: Write the bare number with a full stop: 19.99, and put the currency in priceCurrency.

Source: Google Search Central — Product snippet structured data

LD-PR02 Missing price

An offer without a price is an offer of nothing. Google requires price or priceSpecification.price.

Source: Google Search Central — Product snippet structured data

LD-CU01 priceCurrency is not an ISO 4217 code

The currency must be the three-letter ISO 4217 code — USD, not $ and not "dollars". A symbol is ambiguous in any case: $ is used by more than twenty currencies.

Fix: Use the three-letter code.

Source: Google Search Central — Product snippet structured data

LD-CU02 Decimals do not match the currency

Most currencies use two decimal places, but JPY and KRW use none and BHD and KWD use three. A price whose decimals do not match its currency is usually a sign the amount was converted or scaled somewhere upstream.

Source: Cross-checked against the ISO 4217 minor-unit table this site carries.

LD-G01 Invalid GTIN

The gtin fails validation — a wrong check digit, a restricted range, or a known placeholder. Structured data with a broken identifier is worse than none: it asserts, in machine-readable form, that this product is one that does not exist.

Fix: Validate the barcode before publishing the markup.

Source: Google Search Central — Product snippet structured data

LD-G02 GTIN carries a warning

The gtin passes validation but the barcode engine flagged something about it — a restricted in-store range, a known placeholder, or a publication number. Structured data states this identifier to machines, so a caveat that would be tolerable in a spreadsheet is worth reading here.

Fix: Open the full validation to see what was flagged.

Source: Google Search Central — Product snippet structured data

LD-A01 availability is not a schema.org value

availability takes a schema.org URL such as https://schema.org/InStock. Free text like "in stock" or "yes" is not recognised and is dropped.

Fix: Use https://schema.org/InStock, OutOfStock, PreOrder or BackOrder.

Source: Google Search Central — Product snippet structured data

LD-I01 image is not an absolute URL

A relative image path resolves against whatever page happens to embed the markup, which is not necessarily the page you tested it on.

Fix: Use the full URL including scheme and host.

Source: Derived from how a crawler resolves the value, which has no page context of its own.

LD-R01 aggregateRating with no reviews behind it

A rating asserted with a review count of zero — or with no count at all — is a rating nobody gave. Fabricated ratings are a documented cause of manual action, and the markup is machine-readable evidence.

Fix: Only publish an aggregateRating you can substantiate from real reviews.

Source: Google Search Central — Product snippet structured data

LD-V01 Valid Product markup

The required properties are present and their values check out against the rules this site already carries for barcodes, currencies and number formats.

Source: Google Search Central — Product snippet structured data

Requirement levels come from Google Search Central — Product snippet structured data. This page checks the markup — it cannot tell you whether the page around it actually shows the same price.