Writing valid JSON-LD is only half the battle. Before any structured data you author can influence search appearance, it must survive three gates: it must be syntactically valid (parseable JSON), schema-correct (uses recognised types and properties), and eligible for rich results (meets Google's content policies and required-field rules). The Rich Results Test is the tool that measures all three simultaneously — and it does so by rendering the page the same way Googlebot does, not just reading the raw source. This module turns the Rich Results Test from a "click and hope" step into a deliberate debugging workflow.
Most developers treat the Rich Results Test as a validator. It is — but it is more precisely a rendered-HTML inspector with an eligibility overlay. When you submit a URL, the tool:
The critical distinction: because the tool renders JavaScript, it can detect structured data injected by a framework like React, Vue, or Next.js on the client side. However, this also means a page that relies on client-side JSON-LD injection appears valid here but may still experience indexing delays in production, because rendering in the real crawl pipeline happens asynchronously and at scale. Passing the Rich Results Test is necessary but not sufficient — always verify with View Source that your JSON-LD is present in the raw server-sent HTML.
Two tools are commonly used to validate structured data. They serve different purposes.
search.google.com/test/rich-results):
Google's tool. Tests eligibility for Google's rich result features specifically. Uses rendering. Reports errors and warnings against Google's requirements, which are a strict subset of the schema.org vocabulary. Use this to confirm a page is eligible for a SERP feature.
validator.schema.org):
Maintained by schema.org. Validates against the full schema.org vocabulary without applying Google's eligibility rules. Does not render JavaScript — it reads raw HTML only. Use this to check schema.org correctness in isolation, especially for types Google does not currently feature (e.g., Service, MedicalEntity) or to debug raw-HTML structured data without the rendering layer.
In practice, run both. The Schema Markup Validator catches schema.org-level property typos that the Rich Results Test might silently ignore; the Rich Results Test catches Google-specific eligibility failures that schema.org validation would pass.
The tool offers two input modes:
Code snippet mode does not render JavaScript. If your JSON-LD is injected by a framework at runtime, code snippet mode will not detect it. Always switch to URL mode to confirm the final deployed state.
The tool lets you toggle between mobile and desktop crawl. Since Google primarily uses the mobile Googlebot for indexing (mobile-first indexing), always test with the mobile user agent as your default. A page may pass on desktop and fail on mobile if the structured data is conditionally omitted or a layout switch removes the JSON-LD block.
After a successful fetch and render, the results panel has three sections:
Every structured data block found is listed by its @type. Each block shows:
Product, BreadcrumbList, Organization)Expand every block and read the parsed values carefully. It is common to see properties parsed with unexpected whitespace, empty strings, or the wrong data type (e.g., a price parsed as a string when a number was expected).
Errors indicate a required property is missing or malformed. A block with errors is not eligible for a rich result. Common errors:
name on a Productoffers (specifically, no Offer with a price and priceCurrency) on a ProductratingValue on an AggregateRatingitemListElement on a BreadcrumbList@type that Google does not support for rich results (not an error per se, but no feature is available)Warnings indicate recommended properties are missing. The block is eligible despite warnings, but the resulting rich result may be less informative or less likely to display. Common warnings:
image on a Product (strongly recommended; without it, the product rich result is less likely to appear in image-enriched formats)description on an ArticlereviewCount alongside ratingCount on AggregateRatingDo not dismiss warnings. Google's documentation frequently upgrades recommended properties to required ones during algorithm updates. Treat warnings as technical debt.
This is the most important concept in this module. A green "eligible" result means your markup meets the minimum structural requirements. It does not mean your page will show a rich result in the SERP. Google applies additional signals before displaying rich results:
Product schema on a blog post will not earn product rich results, and fabricating reviews or ratings earns a manual action.noindex or a canonical mismatch will never show a rich result, regardless of markup quality.The correct mental model: the Rich Results Test tests eligibility at the markup level. Rich result appearance in the SERP is a separate, downstream decision made by Google's ranking and display systems.
If the tool finds no structured data on a URL you know has JSON-LD, diagnose in this order:
<script type="application/ld+json"> block in the raw HTML? If yes, the JSON is likely malformed (a syntax error causes the browser to skip the block entirely). Run the raw JSON through a JSON linter (jsonlint.com or your IDE).
noindex directive. The tool still parses structured data on noindex pages, but this is a likely explanation for why rich results aren't appearing in production even when the tool shows eligibility.
The Rich Results Test will report a parse failure if your JSON-LD is invalid JSON. Common sources:
")& or broken tags inside the JSONWhen a JSON syntax error is reported, the tool typically shows the line and character offset. Use that to locate the malformed character. A well-structured development workflow validates JSON-LD programmatically in CI before deployment.
The tool will parse and display any valid schema.org type, but it will only report rich result eligibility for types Google supports as features (Article, BreadcrumbList, Event, FAQ, HowTo, LocalBusiness, Movie, Product, Recipe, Review, VideoObject, etc.). If you use Service or WebSite or Person, the tool detects them but does not report a rich result feature for them. This is expected and not an error — those types contribute to entity understanding rather than direct SERP features.
Google's guidelines require structured data to represent content that is visible to users. If your AggregateRating shows a ratingValue of 4.9 but no reviews are visible on the page, or if the price in your Offer block does not match the displayed price, you risk:
The Rich Results Test does not enforce content-markup alignment — that is a human audit step. Build a habit of comparing the parsed property values in the tool against the visible page content whenever you validate.
A frequent issue with complex, nested JSON-LD (e.g., Product containing AggregateRating containing Review) is that an inner type has an error, and because it's nested, the outer type's eligibility is also affected. Always expand every nested block in the tool's results and check for errors at each nesting level independently.
Example of a fully nested structure where the tool will inspect each block separately:
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Titanium Carry-On Suitcase",
"image": "https://example.com/images/suitcase.jpg",
"brand": {
"@type": "Brand",
"name": "Nomad Gear"
},
"offers": {
"@type": "Offer",
"url": "https://example.com/products/titanium-carry-on",
"priceCurrency": "USD",
"price": "349.00",
"availability": "https://schema.org/InStock",
"priceValidUntil": "2025-12-31"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.7",
"reviewCount": "84"
}
}
In the tool, this will appear as three detected blocks: Product, Offer, and AggregateRating. A missing reviewCount on AggregateRating would surface as an error on that inner block, and the Product itself would lose eligibility for star ratings in rich results.
The Rich Results Test is the first step, not the final step. Use this three-stage workflow for every implementation:
When authoring or refactoring structured data before a page is published, use this rapid iteration loop:
<!DOCTYPE html><html><head><script type="application/ld+json">...</script></head><body></body></html>Manually running the Rich Results Test on individual URLs does not scale to a site with thousands of templates. Layer in these automation approaches:
validator.schema.org validator has a queryable endpoint. You can script batch validation of representative pages per template type and alert on errors in CI/CD.
application/ld+json scripts from the rendered DOM, parses them, and asserts required properties are present. Run in your CI pipeline on every deploy.
Being precise about the tool's limits prevents false confidence:
priceCurrency from the Offer. Remove reviewCount from AggregateRating. Paste into Code Snippet mode. Document every error and warning the tool reports. Then fix each one and confirm a clean pass.
validator.schema.org. Compare the two outputs. Document any properties that the Schema Markup Validator flags that the Rich Results Test ignored, and explain why.
You are ready to advance from this module when you can do all of the following without looking things up: