How to Validate Schema Markup: Validators, Steps and Common Errors
Validating schema markup means answering two separate questions. First: is the structured data correct schema.org that a machine can read — valid JSON, real types and properties, values in the right format? Second: does it meet Google’s requirements for a specific rich result, such as a product snippet or review stars? The Schema Markup Validator at validator.schema.org answers the first question, Google’s Rich Results Test answers the second, and our schema validator checks syntax, the schema.org vocabulary and Google’s required fields in one report. After you publish, the rich result reports in Search Console show what Google actually found across the whole site.
Which validator to use now
| Tool | What it checks | JavaScript | Use it for |
|---|---|---|---|
| Rich Results Test (Google) | Only the structured data types that can produce a Google rich result, with Google’s required and recommended fields. Accepts a URL or code, JSON-LD, Microdata and RDFa. The default crawler is smartphone, desktop is optional. | Yes — it looks at the rendered page | “Will Google accept this for a rich result?” |
| Schema Markup Validator (schema.org) | Any schema.org type and property in JSON-LD, Microdata or RDFa. No Google-specific rules. | Not documented — paste the code if in doubt | Types Google does not use, general correctness |
| PromoPilot schema validator | JSON syntax with line and column, schema.org vocabulary, Google’s required and recommended fields for 11 families of types, @graph and @id links, duplicate entities | No — reads the HTML the server sends | Finding why a block breaks and getting a fixed copy |
| Search Console rich result reports | What Googlebot found on your site: valid and invalid items, issues over time | Yes, as part of indexing | Monitoring after release |
In practice you will use two of them: a validator while writing the markup, and the Rich Results Test or Search Console for the Google side.
How to validate schema markup step by step
- Find out what is on the page. Open the page source (Ctrl+U or Cmd+Option+U) and search for
application/ld+json(JSON-LD),itemscope(Microdata) andtypeof(RDFa). If a plugin claims to output markup but the source has none, it is probably added by JavaScript — see the section on that below. - Fix syntax before anything else. One trailing comma or one curly quote makes the whole JSON-LD block invalid, and search engines skip all of it. A validator shows the line and column of the error.
- Check the vocabulary. Types start with a capital letter (
Product), properties are camelCase (datePublished), and the property must belong to the type. Enumerations are full URLs (https://schema.org/InStock), dates and durations follow ISO 8601. - Check Google’s requirements for the feature you want. Run the URL through the Rich Results Test. An error means the item is not eligible for that rich result. A warning means a recommended field is missing: the item is still eligible, just with less information.
- Compare the markup with what visitors see. Price, rating, author and dates in the JSON-LD must match the visible page. Google’s policies forbid marking up content that is not visible to readers.
- Publish and monitor. Use URL Inspection in Search Console to check the live URL and request indexing, then watch the rich result reports for that type over the following weeks.
Example: a broken Product block and the fixed version
This block looks harmless but has four problems:
{
"@context": "https://schema.org",
"@type": "product",
"name": "Trail running shoes",
"offers": {
"@type": "Offer",
"price": "1 299,00 UAH",
"availability": "in stock",
}
}
- the comma after the last property makes the JSON invalid, so nothing else in the block is read at all;
productin lower case is not a schema.org type — names are case-sensitive;- the price contains a space, a comma and a currency; the price is a plain number and the currency goes in
priceCurrency; in stockis free text, not a value of theItemAvailabilityenumeration.
The corrected version:
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Trail running shoes",
"image": "https://example.com/img/shoes.jpg",
"offers": {
"@type": "Offer",
"price": "1299.00",
"priceCurrency": "UAH",
"availability": "https://schema.org/InStock"
}
}
For a Google product snippet, a Product needs a name and at least one of offers, review or aggregateRating; inside an Offer, price is required.
Common errors and how to fix them
| What you see | Fix |
|---|---|
| Parsing error / unexpected token | Look for a trailing comma before } or ], a missing comma between properties, or an unescaped quote inside a value. |
| Curly quotes “ ” in the code | The code was pasted through Word or a visual editor. Paste JSON-LD in the HTML/code mode of your CMS. |
Comments // inside JSON-LD | Remove them. Google’s help says the Rich Results Test ignores comments, but the JSON-LD standard does not allow them, so other parsers may fail. |
| Unknown type or property | Check spelling and case: datepublished → datePublished, localbusiness → LocalBusiness. |
| Property not valid for this type | Move it to the right object, for example price belongs in an Offer, not directly in a Product. |
| Invalid date | 13.10.2026 → 2026-10-13 or 2026-10-13T09:00:00+03:00. |
| Invalid duration | "cookTime": "30 min" → "PT30M"; an hour and a half is "PT1H30M". |
| Two different Organization entities | Often the SEO plugin and the theme both output one. Keep one, give it an @id and refer to it from other blocks. |
| data-vocabulary.org types | Google no longer supports this old vocabulary. Rewrite the markup with schema.org. |
Valid markup does not guarantee a rich result
Google states plainly in its structured data guidelines that it does not guarantee rich results, even when the markup passes the Rich Results Test. Correct markup makes a page eligible; the algorithm decides whether to show the feature for a given query and user. Common reasons a valid item still shows nothing:
- The feature is no longer shown. See the list below.
- Policy problems. Markup for content that is not on the page, misleading or outdated data, or fake reviews. A manual action for structured data removes eligibility for rich results; according to Google, it does not affect ranking in web search.
- Self-serving reviews. Review stars for LocalBusiness and Organization are shown only for sites that review other businesses. A company that marks up ratings of itself will not get stars.
- The page is not indexed yet, or Google has not recrawled it since you changed the markup.
What Google stopped showing
- FAQ rich results — limited to authoritative government and health sites from September 2023, not shown at all since 7 May 2026; the documentation was removed in June 2026.
- How-to — removed in September 2023 on desktop and mobile.
- Sitelinks search box (WebSite + SearchAction) — retired in November 2024.
- Breadcrumbs — no longer shown in mobile results since January 2025; still shown on desktop.
- Course info, Estimated salary, Learning video, Special announcement, Vehicle listing — documentation removed in September 2025.
This markup is still valid schema.org and does not break anything; Google simply does not turn it into a visual feature. Whether to keep it is a question of maintenance effort, not of risk.
JSON-LD added by JavaScript or Google Tag Manager
Many sites inject structured data with a script or a Custom HTML tag in Google Tag Manager. Google’s guide on generating structured data with JavaScript confirms that Google Search can process markup that is in the DOM when it renders the page. Two consequences:
- Tools that read only the raw HTML, including ours, will not see such markup. Test these pages with the Rich Results Test (it works with the rendered code) or with URL Inspection in Search Console. Another option: open the page in Chrome DevTools, copy the rendered
<html>element (Elements → Copy → Copy outerHTML) and paste it into a validator. - For Product markup Google warns that dynamically generated markup can make Shopping crawls less frequent and less reliable. If price and availability change often, put the JSON-LD into the server-side HTML.
In GTM, build the markup from page variables rather than typing values into the tag, otherwise the markup drifts away from what visitors see.
Checking structured data in Search Console
The rich result reports are in the Enhancements section; product snippets and merchant listings are under Shopping. A few things to know when reading them:
- A report appears only after Google finds valid markup of a supported type. No report for FAQ or How-to is expected.
- The numbers count items, not pages: one page with three Event objects gives three items.
- The report shows a sample, not every URL. For a specific page, use URL Inspection.
- An item with a critical issue is invalid and cannot appear as a rich result; non-critical issues are warnings.
- After fixing an issue, start validation from the issue details page; the report shows the validation status.
How to do it in PromoPilot
Enter a URL or paste code into the schema validator. It finds every JSON-LD, Microdata and RDFa item and checks it in three layers:
- Syntax: JSON errors with line and column, the reason in plain language, and safe automatic fixes (trailing commas, comments, curly quotes, line breaks inside values, several objects in a row) with a corrected block ready to copy.
- Vocabulary: types and properties against schema.org (currently release 30.1), with hints for typos and wrong case, superseded terms, enumeration values, ISO 8601 dates and durations.
- Google rules: required and recommended fields for articles, products, reviews, breadcrumbs, organizations, local businesses, events, recipes, videos, software apps and job postings.
It also assembles @graph, follows @id references and flags duplicate entities. Pasted code can be up to 512 KB; a fetched page is cached for 10 minutes. To create markup from scratch, use the schema generator (Article, Product, FAQ, Organization, LocalBusiness, Breadcrumbs) or the FAQ schema generator.
What our validator does not do
- It does not run JavaScript, so markup added by GTM or a single-page app is invisible to it. It tells you when the page uses GTM or looks like an SPA.
- It does not compare the markup with the visible text. A price in JSON-LD that differs from the page is a policy violation, but it cannot be caught automatically.
- It cannot promise a rich result — nobody outside Google can.
Related reading
- Structured data and Schema.org — what it is and which types matter.
- Featured snippet — the answer block that structured data does not control.
- Checking meta tags and snippet preview — the rest of how a page looks in search.