We create digital solutions that work for businesses
SEO and marketing
You may also like
JSON-LD syntax, required properties per type and logical errors.
A tool checks one thing. We’ll go through your whole site for free and send a report: what’s holding you back in Google and what to fix first.
Broken markup fails silently: the rich result simply never appears, and working out why without a check is hard.
One caveat: valid markup does not guarantee a rich result in Google. That decision is always the search engine’s, and no third-party validator can predict it.
Nine things the validator catches most often. For each one, the broken code and the corrected version. Google silently skips most of these: the markup simply does not work, and nobody tells you.
JSON is stricter than JavaScript: a stray comma before } or ] breaks the whole block. The browser does not complain; Google does not read the markup.
// before
{ "@type": "Organization", "name": "BB STUDIO", }
// after
{ "@type": "Organization", "name": "BB STUDIO" }
JSON allows only double quotes. Code with single quotes looks fine but does not parse.
// before
{ '@type': 'Article', 'headline': 'Title' }
// after
{ "@type": "Article", "headline": "Title" }
Without "@context": "https://schema.org" the parser does not know that Product is a Schema.org type rather than an arbitrary word. The whole block is ignored.
// before
{ "@type": "Product", "name": "Laptop" }
// after
{ "@context": "https://schema.org", "@type": "Product", "name": "Laptop" }
A developer left // TODO or /* ... */, and it is no longer JSON. Comments must be removed entirely.
For Article it is headline; for Product, name; for Event, name, startDate and location. Without them Google will not show a rich result even if everything else is perfect. The full table is below.
The most dangerous error: aggregateRating on a page where no review is visible. Google calls this self-serving reviews, and it is the most common reason for manual actions, which remove every rich snippet on the site, not just this one.
// before — on every page of the site
{ "@type": "Organization", "name": "...",
"aggregateRating": { "ratingValue": "5", "reviewCount": "9" } }
// after — only on the page where reviews appear as text
{ "@type": "Organization", "name": "..." }
"price": "9 900 UAH" is not a number. It should be "price": "9900" with a separate "priceCurrency": "UAH".
// before
"offers": { "@type": "Offer", "price": "from 9 900 UAH" }
// after
"offers": { "@type": "Offer", "price": "9900", "priceCurrency": "UAH" }
The parser will not understand "datePublished": "12.09.2026". Correct is "2026-09-12", or with time and zone: "2026-09-12T10:00:00+03:00".
The code says 9,900; the page says 12,900. The code has five FAQ questions; the page shows three. Google compares markup with visible content, and a mismatch is penalised the same way as hidden text. Markup describes the page; it does not decorate it.
The same rules the validator applies. Without required fields there is no rich result; recommended fields raise the odds of getting one.
| Type | Required | Recommended |
|---|---|---|
| Organization | name | url, logo, sameAs, contactPoint |
| LocalBusiness | name, address | telephone, openingHours, geo, url, image, priceRange |
| Article / BlogPosting | headline | author, datePublished, dateModified, image, publisher |
| Product | name | image, offers, description, brand, sku, aggregateRating |
| Offer | price, priceCurrency | availability, url, priceValidUntil |
| FAQPage | mainEntity (Question with name and acceptedAnswer) | — |
| BreadcrumbList | itemListElement | — |
| Event | name, startDate, location | endDate, description, offers, image |
| Service | name | provider, areaServed, description |
| WebSite | name, url | potentialAction (site search) |
| VideoObject | name, thumbnailUrl, uploadDate | description, duration, contentUrl |
Note for Product: aggregateRating is recommended, but only when the page genuinely shows reviews. Otherwise, see error 6.
"No errors" from the validator means the code is correct, not that Google will show stars or an FAQ in results. Rich results are Google's decision, and it decides differently for different sites and queries. What is up to you: the right type for the page's content, the required fields, markup that matches the text, and none of what is described in point 6.
For which markup types actually produce rich snippets in 2026, what gets them removed, and why LocalBusiness without an address is worse than no markup at all, read Schema.org structured data: what it gives and what loses it. Our markup generator builds correct JSON-LD for the typical cases — Organization, Article, FAQ, Product — so you do not have to write it by hand.