10 Common Schema Markup Errors and How to Fix Them

The structured data errors that appear most often in site scans: invalid JSON, missing required properties, wrong value types, duplicate entities, and what to change in each case.

After scanning a lot of sites with the checker, the same handful of problems shows up again and again. Most are caused by templates, not by people writing JSON by hand, which is why a single fix usually repairs hundreds of pages at once. Here are the ten most frequent errors, what they look like in a report and how to fix them.

1. Invalid JSON

What you see: “Unexpected token”, “Expected comma”, or the whole block missing from the report.

Cause: A trailing comma after the last property, a single-quoted string, an unescaped double quote inside a description, or an HTML entity such as & inside the script.

Fix: Generate the JSON with a serializer (JSON.stringify, json_encode, json.dumps) instead of string templates. If you must template it, run the output through a JSON parser in a test. A positional validator shows the exact line and column of the problem, which matters when the block is 300 lines long.

2. Missing required property

What you see: “Missing required property image on Article”, “Missing name on Product”.

Cause: The field exists in the template but is empty for some pages, so the template skips it, or the type was chosen without checking Google’s requirements.

Fix: Look up the required properties for the type in Google’s documentation and make sure every page that uses the type can fill them. If a page genuinely has no image, it will not get the rich result; that is better than inventing one.

3. Wrong value type

What you see: “price should be a Number”, “datePublished is not an ISO 8601 date”, “image is not a URL”.

Cause: Values copied from the visible page: "$12.50", "12 May 2026", "/img/photo.jpg".

Fix: Normalize in code before serializing: numbers as numbers, dates as YYYY-MM-DD or full ISO timestamps, URLs absolute. For enumerations such as availability use the schema.org URL.

4. Unknown type or property

What you see: “Type Products is not in schema.org”, “Property prize is not defined on Product”.

Cause: Typos, plural forms, properties borrowed from another type, or properties from an extension that was never adopted.

Fix: Check the spelling against schema.org. Property names are camelCase and case-sensitive: datePublished, not DatePublished or date_published. Google ignores unknown properties silently, so these are easy to miss without a vocabulary check.

5. Property on the wrong type

What you see: “ratingValue is not expected on Product”.

Cause: Flattening nested objects: putting ratingValue directly on the product instead of inside an aggregateRating object.

Fix: Nest. aggregateRating is an AggregateRating object with its own ratingValue and reviewCount; author is a Person or Organization; offers is an Offer.

6. Markup that does not match the page

What you see: Nothing in a validator. A manual action or a “structured data policy” warning in Search Console.

Cause: A rating on every page that comes from one site-wide number, a price that is out of date, an FAQ block whose questions are not shown to visitors.

Fix: Generate markup from the same data that renders the page, never from a separate source. If a value is not visible, do not mark it up.

7. Duplicate entities

What you see: Two Organization blocks with different names, three WebSite entities, the same Product in JSON-LD and in Microdata with different prices.

Cause: A theme adds one block, an SEO plugin adds another, and a developer adds a third.

Fix: Pick one source. If several blocks are unavoidable, make them describe different things and link them with @id. The checker reports duplicates per type so you can see which plugin to turn off.

8. Empty values

What you see: “review is an empty array”, “description is empty”.

Cause: A template emits the property for every page and leaves it blank when there is no data.

Fix: Omit properties that have no value. An empty array is not “no reviews” to a parser; it is a malformed claim about reviews.

9. Breadcrumb list with wrong positions

What you see: “ListItem positions are not consecutive”, “Missing item on ListItem”.

Cause: Positions start at 0, skip a number after a hidden category, or the last item has no URL.

Fix: Positions start at 1 and increase by 1. Every item except the last needs an item URL; the last may omit it because it is the current page.

10. Markup only in JavaScript

What you see: The page check in a browser extension finds the markup; a server-side check or the site scan finds nothing.

Cause: The JSON-LD is injected by a tag manager or a client-side framework after load.

Fix: Render it on the server. Google usually executes JavaScript, but with a delay and a crawl budget, and other search engines and most tools do not. If moving it is impossible, at least verify with a rendered check that the block appears, and keep it out of consent-gated scripts.


Most of these are cheap to fix once you know which template is responsible. Run a whole-site scan and sort the issues by the number of affected pages: the top three lines are usually the three templates to open.