Valid markup is permission, not a promise. Google's documentation says structured data makes a page eligible for a rich result and never guarantees one. Six things usually sit in that gap, and they fail in a fixed order.
Does valid markup guarantee a rich result?
No. Validation confirms that your structured data parses and carries the properties Google asks for. Whether the result renders is a separate decision Google makes later, per query. Between the two stages sit indexing, canonical selection, whether the feature still exists, whether the markup matches the visible page, and ranking. A validator can only see the first stage, which is why it keeps telling you everything is fine.
Which validator did you use, and what does it actually check?
Each tool answers a narrower question than its name suggests. Running the wrong one is the most common reason a team believes the problem is solved.
| Tool | What it checks | What it cannot tell you |
|---|---|---|
| Schema.org validator | Syntax and conformance to the schema.org vocabulary | Whether Google supports that type for any search feature at all |
| Google Rich Results Test | Whether the page or the pasted schema markup qualifies for a specific Google feature | Whether Google will choose to show it |
| Search Console enhancement reports | What Google saw on URLs it has already indexed, with errors and warnings | Anything about URLs that are not indexed |
| URL Inspection, live test | The markup Google reads right now, after rendering the page | The state of the version currently in the index |
A type that passes the schema.org validator and fails the Rich Results Test is not broken markup. It is markup for something Google does not turn into a feature.
Is the page indexed, and is it the canonical?
Rich results come only from indexed pages, and Google reads markup from the URL it picked as canonical. Markup sitting on a duplicate that Google folded into another address is simply not being read. URL Inspection names the Google-selected canonical explicitly, which makes this a one-minute check rather than a theory. Parameterized URLs, paginated variants and staging copies are where this hides. A page excluded from the index has no path to any kind of organic search enhancement, and no amount of markup changes that.
A validator answers "is this markup correct?" Search Console answers "did Google use it?" Only the second question has a consequence, and the two answers disagree far more often than teams plan for.
Does the rich result you want still exist?
Some features were retired, and markup for a retired feature validates forever while showing nothing. Google announced in 2023 that FAQ rich results would be limited to well-known authoritative government and health sites, and that HowTo rich results would be dropped. In 2019 it ended support for self-serve review snippets on Organization and LocalBusiness markup, so review schema a business writes about itself is eligible for nothing at all. Google has also split product results into separate experiences with different required properties, so product schema that qualifies as a product snippet may not qualify as a merchant listing. Check the current feature documentation for your type before you debug anything else.
Does your markup describe what the page actually shows?
Google's general structured data guidelines require marked-up content to be visible to the reader on the page. A price that appears only in JSON-LD, a rating assembled from a source the visitor cannot see, a review count that exists nowhere in the HTML: each fails that check. The failure mode is worse than silence, because the spam policy for structured markup is enforced with manual actions, and those arrive in Google Search Console rather than in any validator.
Marking up an aggregate rating that appears nowhere on the page is the fastest way to lose eligibility across an entire template, because a manual action can be applied to a whole section of a site rather than to the single URL that triggered it.
Is Google simply choosing not to show it?
This is the residual case, and it is the most common one on healthy sites. Eligibility is decided per page; display is decided per query, per device and per result layout. The same URL can carry a rich result for one phrasing and a plain link for another, and a page that ranks below the set of results the feature draws from shows nothing even while being perfectly eligible. The Performance report's search appearance dimension is the honest test: filter to the URL and see whether that appearance has ever fired for it.
What should you check first?
Run URL Inspection on the exact URL and read three lines: is it indexed, is the Google-selected canonical the URL you expected, and is the markup detected after rendering. Then confirm the feature still exists for your type. Then compare the JSON-LD against what a visitor can see. Only after those three does editing the markup make sense.
If all three come back clean and the snippet still does not appear, you are not looking at a structured data problem. You are looking at a ranking problem that happens to show up as a missing rich result, and it needs content and links, not another property in the JSON-LD. Those are two different projects with two different owners, and the next decision is which one you are actually funding.