Rich Results Test errors, decoded

Google’s structured data messages tell you which field is wrong. They rarely tell you why it is wrong, and never tell you what to do about it. This page decodes the errors and warnings you will actually meet — including the worst category of all: the markup that validates cleanly and still never produces a result.

26 messages decoded 5 categories Last reviewed September 2026

Parsing errors — Google never read your markup

These come first because nothing else matters until they are gone. The block was found but could not be turned into data, so every property inside it is invisible.

Unparsable structured data
What it meansThe JSON inside your <script type="application/ld+json"> tag is not valid JSON, so Google discarded the whole block.
Why it happensAlmost always a trailing comma after the last property, a missing closing brace, or curly “smart quotes” substituted for straight quotes by a CMS editor.
How to fix itPaste the block into a JSON validator. If your CMS keeps rewriting the quotes, insert the markup through a code or header block rather than the rich-text editor.
Parsing error: Missing ',' or '}' in object declaration
What it meansThe JSON structure breaks at a specific point — usually the exact character position is given.
Why it happensHand-editing generated markup and dropping a comma between two properties, or pasting two JSON objects into one script tag without wrapping them in an array.
How to fix itRegenerate the block rather than patching it. If you need several types on one page, either use separate script tags or one @graph array.
No items detected / structured data not found
What it meansGoogle fetched the page and found no structured data at all.
Why it happensThe markup is injected by JavaScript after load, sits behind a cookie wall, or was added to a staging template that never shipped. It can also mean the URL you tested redirects somewhere else.
How to fix itView the page source (not the inspector) and confirm the script tag is in the raw HTML. Test the live canonical URL, not a preview link.
Duplicate field "…"
What it meansThe same property appears twice in one object. Google may take either value or drop the object.
Why it happensUsually a theme and a plugin both emitting schema, or a manual block added on top of one your CMS already outputs.
How to fix itAudit the rendered page for every ld+json block. One entity should be described once.

Missing field errors — the rich result is switched off

The markup parses, but a property Google treats as mandatory is absent. The result will not appear until you add it. Our generators list these before you copy anything.

Missing field "name"
What it meansThe entity has no name, so there is nothing to display as the result title.
Why it happensAn empty form field, or a name nested at the wrong level — for example on the offer instead of the product.
How to fix itAdd a name to the top-level entity. Check nesting: Product.name, not Product.offers.name.
Rebuild this with live checks: Product generator →
Missing field "image"
What it meansImage-led result types (Product, Article, LocalBusiness, Recipe) cannot render without one.
Why it happensA relative path was used and silently rejected, or the image property was left out entirely.
How to fix itUse a full absolute https:// URL. Confirm the image is not blocked by robots.txt — Google must be able to fetch it.
Rebuild this with live checks: Article generator →
Missing field "location"
What it meansEvery Event needs a location, including online-only events.
Why it happensMost event generators simply do not have a location field. For online events people assume it does not apply.
How to fix itPhysical events take a Place with a PostalAddress. Online events take a VirtualLocation with the streaming URL. Hybrid events take both, as an array.
Rebuild this with live checks: Event generator →
Missing field "hiringOrganization"
What it meansA job posting with no employer cannot be shown in the jobs experience.
Why it happensThe company was written into the job title or description instead of its own property.
How to fix itAdd hiringOrganization.name with the actual employer — not the job board or recruiter.
Rebuild this with live checks: JobPosting generator →
Either "author.name" or "author.url" should be specified
What it meansArticle markup has an author object with nothing usable inside it.
Why it happensAn author node emitted with an empty name, common when a CMS has no author set for the post.
How to fix itGive the author a real person or organization name. Generic values such as “Admin”, “Editor” or the site name alone are frequently ignored.
Rebuild this with live checks: Article generator →
Missing field "offers", "review" or "aggregateRating"
What it meansFor Product, Google needs at least one of the three to build a useful snippet.
Why it happensProduct markup describing only the name and image, with pricing rendered by JavaScript that never made it into the markup.
How to fix itAdd offers with price and priceCurrency. Only add review or aggregateRating if genuine reviews are visible on the page.
Rebuild this with live checks: Product generator →

Invalid value errors — the property is there but the wrong shape

This group causes the most confusion, because the field is clearly populated. Schema.org types are strictly specified, and a value in the wrong format is treated as a plain string and discarded.

Invalid value type for field "…"
What it meansThe value does not match the type the property expects — a string where an object is required, or the reverse.
Why it happensClassic case: address given as one line of text when Google expects a PostalAddress object with separate street, locality, region and country.
How to fix itBreak the value into the structured object the property expects.
Rebuild this with live checks: LocalBusiness generator →
Invalid object type for field "…"
What it meansThe nested object has an @type that is not allowed in that position.
Why it happensUsing a made-up or misspelled type, or attaching a property to the wrong type — such as serviceLocation on a Service, where it only exists on ServiceChannel.
How to fix itCheck the property on schema.org and confirm which types list it under “Used on these types”.
Rebuild this with live checks: Service generator →
The value provided for "…" must be a valid URL
What it meansA URL property contains something that is not a resolvable absolute URL.
Why it happensRelative paths like /images/photo.jpg, protocol-relative //cdn.example.com/x.jpg, or a data: URI pulled from a favicon.
How to fix itAlways emit a complete https://… URL. Google reads structured data separately from the page, so it cannot resolve relative paths.
Invalid enum value / not a recognised value
What it meansA property that only accepts a fixed vocabulary was given free text.
Why it happensTyping “In Stock” produces https://schema.org/In Stock, which is not a real value. Same for itemCondition and courseMode.
How to fix itUse the exact identifiers: InStock, OutOfStock, PreOrder, BackOrder, SoldOut, LimitedAvailability, InStoreOnly, OnlineOnly, Discontinued.
Rebuild this with live checks: Product generator →
The value provided for "startDate" / "uploadDate" / "datePosted" is invalid
What it meansA date or date-time property is not in ISO 8601.
Why it happensHuman-readable dates such as “March 14, 2026”, or a date-time with no timezone offset where the time genuinely matters.
How to fix itUse 2026-03-14 for dates and 2026-03-14T09:00:00+04:00 for date-times. Include the offset for events and live streams.
Rebuild this with live checks: Event generator →
The value provided for "duration" is invalid
What it meansDuration must be an ISO 8601 duration, not prose.
Why it happens“2 minutes 30 seconds” or “2:30” instead of the encoded form.
How to fix itWrite PT2M30S. P is the period marker, T separates the time part: PT1H5M is one hour five minutes.
Rebuild this with live checks: VideoObject generator →
Value in field "ratingValue" must be between …
What it meansThe rating sits outside the scale defined by worstRating and bestRating.
Why it happensA percentage (85) or a ten-point score (8.5) published against the default 1–5 scale.
How to fix itEither convert to the 1–5 scale or set bestRating and worstRating explicitly to describe your real scale.
Rebuild this with live checks: Review generator →
The value provided for "validThrough" is in the past
What it meansThe job posting has already expired, so it will be dropped from the jobs experience.
Why it happensA static expiry date left in a template, or listings that are never taken down.
How to fix itSet validThrough when the role genuinely closes, and remove or 404 expired listings rather than leaving them live.
Rebuild this with live checks: JobPosting generator →

Warnings — valid, but a weaker result

Warnings never block a rich result. They tell you the result will be plainer than a competitor’s, or that it may behave badly over time. Treat them as a ranked to-do list, not errors.

No global identifier provided (e.g. gtin, mpn, isbn)
What it meansGoogle cannot confidently match your product to the same product on other sites.
Why it happensOwn-brand or handmade products often genuinely have no GTIN.
How to fix itAdd gtin8/12/13/14 where a barcode exists, otherwise sku and mpn. If the product truly has no identifier this warning is safe to leave.
Rebuild this with live checks: Product generator →
Missing field "priceValidUntil"
What it meansGoogle does not know how long the price is good for and may show it less readily.
Why it happensOmitted because the price is not time-limited.
How to fix itSet a future date for genuine promotions. Do not invent one for a permanent price — a stale date is worse than none.
Rebuild this with live checks: Product generator →
Missing field "aggregateRating"
What it meansNo star rating will be shown, which is the single most visible part of a product or software result.
Why it happensThe site has no reviews yet.
How to fix itOnly add this once you genuinely collect ratings from users. Publishing invented ratings is a policy violation, not a shortcut.
Rebuild this with live checks: AggregateRating generator →
Missing field "dateModified"
What it meansGoogle cannot tell whether the article has been maintained.
Why it happensTemplates that only emit a publication date.
How to fix itEmit dateModified when the content actually changes. Bumping it on every page render, with no real edit, is a manipulation signal.
Rebuild this with live checks: Article generator →

Policy rejections — valid markup Google deliberately ignores

This is the most frustrating category, because the Rich Results Test shows a clean pass and nothing ever appears in search. The markup is correct; the use of it is not allowed.

Self-serving reviews
What it meansReview and AggregateRating markup about your own business, placed on your own site, is ignored for LocalBusiness and Organization.
Why it happensAdding a five-star rating for your own company to your homepage.
How to fix itRating markup belongs on the things you sell or produce — products, software, courses, recipes — not on your own organization.
Rebuild this with live checks: Review generator →
Markup does not match visible content
What it meansThe structured data describes something a user cannot see on the page.
Why it happensFAQ markup on a page with no visible FAQ, prices in markup that differ from the page, or ratings for reviews that live elsewhere.
How to fix itEvery marked-up value must be visible to a user on that same URL. This is a manual-action risk, not just a lost snippet.
Rebuild this with live checks: FAQPage generator →
FAQ rich results limited to authoritative sites
What it meansGoogle narrowed FAQ rich results so most sites no longer receive them, regardless of markup quality.
Why it happensA 2023 policy change, not an error in your implementation.
How to fix itKeep the markup — it still helps Google understand the page and is used by other surfaces — but do not expect the FAQ dropdown in results.
Rebuild this with live checks: FAQPage generator →
Content behind a paywall or login
What it meansGooglebot could not see the content the markup describes.
Why it happensConsent walls, aggressive bot protection, or geo-blocking that serves Googlebot a different page.
How to fix itUse the URL Inspection tool in Search Console to see exactly what Googlebot rendered, and compare it to what a visitor sees.

Most of these errors are avoidable at the point of generation rather than discovered afterwards. Our generators check the same requirements as you type, name the missing properties, and refuse to emit malformed dates, URLs and currency codes.

See every required and recommended property →

Why “valid” and “eligible” are not the same thing

This trips up almost everyone. The Rich Results Test answers a narrow question: is this markup well-formed, and does it carry the properties this result type needs? A pass means you have cleared the technical bar. It is not a prediction.

Whether a rich result actually appears depends on three further things the test cannot see: whether the page is indexed at all, whether the content is good enough for Google to want to feature it, and whether the use of that markup is permitted under Google’s policies for the result type. A page can be perfectly marked up, fully valid, and still show nothing because it is not indexed — or because the markup describes content that is not visible.

The practical sequence is: validate with the Rich Results Test, publish, confirm the URL is indexed with URL Inspection, then watch the relevant enhancement report in Search Console over the following days. Search Console is the only place that tells you what Google accepted on the live URL.

Three habits that prevent most of this

Common questions

My markup passes the Rich Results Test but no rich result appears. Why?

The Rich Results Test only answers whether the markup is well-formed and complete. It does not promise a result. Eligibility also depends on your page content and quality, and on Google's policies for that result type — self-serving reviews, for example, are perfectly valid markup that Google ignores by design. Check the relevant Search Console report for the live URL, which is the only place that shows whether Google accepted the markup in production.

What is the difference between an error and a warning?

An error means the rich result is switched off — Google will not use the markup until it is fixed. A warning means the markup works but the result will be plainer or less competitive, for example without a star rating or a price. Fix all errors first; treat warnings as a ranked improvement list.

Why does the test pass but Search Console report errors?

The Rich Results Test renders the URL live, on demand. Search Console reports what Googlebot saw the last time it actually crawled the page, which may be days old or may have rendered differently. If the two disagree, trust Search Console for the live state and use URL Inspection to see the rendered HTML Google really got.

Does fixing structured data errors improve rankings?

Not directly. Structured data is not a ranking factor. It makes pages eligible for richer presentations in search, which can raise click-through rate. Fixing errors restores that eligibility; it does not move you up the results page on its own.

Can I have more than one JSON-LD block on a page?

Yes. Multiple script tags are valid, and so is a single block using an @graph array. The problem is not the number of blocks but describing the same entity twice with different values, which is a common cause of duplicate-field errors when a theme and a plugin both emit schema.