Structured data guide
Why valid schema markup still shows nothing in search
You paste your markup into the official validator, it comes back clean, and weeks later there is still nothing in search. Nothing is broken — you asked a different question from the one you needed answered.
Three tools, three questions
validator.schema.org answers does this parse and do these properties exist in the vocabulary? It is a vocabulary checker. An Article with nothing but a name passes.
Google's Rich Results Test answers can Google show a rich result for this live URL? — the right question, but it needs a URL Google can fetch, and it reports only on the types it supports.
This validatoranswers the same question as Google's, on markup you have not shipped yet, and tells you which property is standing in the way rather than that something is.
What actually blocks a rich result
A required property is missing
Every type has a short list Google needs. Article needs an image — without one there is no rich result, whatever else is present. Productneeds a name and an image before price and rating can show. These lists are far shorter than schema.org's vocabulary, which is why "valid" and "eligible" come apart.
availability is written as a word
The most common Product mistake by a distance. schema.org expects a URL:
"availability": "InStock" ✗
"availability": "https://schema.org/InStock" ✓Dates that are not ISO 8601
21 August 2026 is not read. 2026-08-21 is, and 2026-08-21T09:00:00Z is better. This matters most on dateModified, which is what Google reads for freshness.
Half an aggregateRating
A ratingValue with no reviewCount shows nothing. Supply both or neither — and only when real ratings are visible on the page. Inventing them is one of the few structured-data mistakes that earns a manual action rather than silence.
Empty properties
"email": "" is worse than no email at all: it asserts the field exists and has no value. Remove it.
The rule that gets sites penalised
Structured data must describe what is on the page. FAQ markup for questions a visitor cannot see is the most common self-inflicted penalty in this area, and no validator can catch it — including this one, which is why it says so on every FAQ it reads rather than staying quiet.
@graph, and why one block can be several
Most real pages ship one script tag containing a @graph — an array of nodes sharing one @context:
{
"@context": "https://schema.org",
"@graph": [
{ "@type": "Organization", "name": "Example" },
{ "@type": "Article", "headline": "…" }
]
}@contextis inherited, so the members do not carry their own. A checker that reads each node in isolation reports every one as "not schema.org" — correct markup, confident wrong answer. This one carries the context down, and validates each node separately so one bad node does not condemn the others.
After you fix it
- Test the live URLin Google's Rich Results Test. Testing code proves it parses; testing the URL proves Google can fetch and read it.
- Watch the Enhancements reports in Search Console. Errors appear there long before results do.
- Confirm the page is crawlable at all — markup on a page blocked by robots.txt is never read. Our robots.txt & sitemap checker finds exactly that.
Frequently asked
Does schema markup improve rankings?
Not directly — Google has been consistent that it is not a ranking factor. It changes how your result is displayed, and a richer result earns more clicks at the same position.
My markup is valid but the Rich Results Test shows nothing. Why?
Usually one of three: a required property is missing, the type has no rich result at all (WebSite and Organization feed understanding rather than a visible feature), or the page is not fetchable. This tool separates the first two; the third needs the live URL.
Is anything I paste sent anywhere?
Pasted markup is validated and discarded — no model, no storage. Checking a URL fetches that page once and caches the result for an hour.
Where do I get correct markup to begin with?
Our schema markup generator builds it with the required fields marked, which is the same knowledge this validator checks against.

