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:
- A price of
"19,99". To a European reader that is nineteen ninety-nine. To a structured-data parser it is not a number at all. It looks right in the source, it looks right in review, and the rich result does not appear. - A GTIN with a wrong check digit. The field is present, the length is right, and the markup now asserts — in machine-readable form — that this is a product which does not exist. This page runs the barcode through the same engine as the GTIN validator, so restricted ranges and placeholder codes are caught too.
- A currency that is not ISO 4217, or one whose minor unit does not match the
decimals.
1500.00 JPYis malformed, because the yen has no decimal places. - An aggregateRating with nothing behind it. A rating asserted with no review count is a rating nobody gave, and fabricated ratings are a documented cause of manual action. The markup is the evidence.
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.