You paste your URL into Google’s Rich Results Test and the page lights up: Missing field "image", Missing field "datePublished", The value "string" is not a valid date. Search Console’s structured-data report shows the same. Your rich snippets — star ratings, breadcrumbs, product info — aren’t appearing in search.
Fastest fix: in the Rich Results Test result, separate the red errors from the yellow warnings first. Red errors block your rich result entirely and must be fixed. Yellow warnings are missing recommended (optional) fields — nice to have, but they do not stop the rich result. Then fix each error at the template level, not per page, so it stays fixed. JSON-LD must match schema.org exactly, and Rich Results Test is the source of truth.
One thing that trips people up first: as of June 2026, FAQPage and HowTo no longer produce any Google rich result (details below). If your “warnings” are on FAQ or HowTo markup, there is nothing to fix for Google — the rich result is gone regardless.
Error vs. warning: which one are you looking at?
This is the single most useful distinction, and the old “Structured Data Testing Tool” never made it clear.
| Signal | Color | What it means | Do rich results show? |
|---|---|---|---|
| Error | Red | A field Google needs for this rich result is missing or has the wrong type | No — eligibility is blocked until fixed |
| Warning | Yellow | A recommended (optional) field is missing | Yes — the rich result can still show; the field would just improve it |
Two consequences worth internalizing:
- A page can be green/valid with warnings and still earn the rich result. You do not have to clear every warning.
- Passing the test does not guarantee a rich result will appear — it only means you are eligible. Failing (a red error) means you are not eligible. Google decides display based on quality, query, and content match.
So before changing any code: open the result, click the item type, and read whether each line is an error or a warning.
Common causes
Ordered by hit rate, highest first.
1. Missing a field Google needs (error)
Google’s Article docs say there are technically no required properties, but skip headline, image, datePublished, or author and you won’t qualify for the Article rich result. The test reports these as Missing field.
How to spot it: Rich Results Test → click the detected item → look for red Missing field lines.
Most common misses, by type:
| Schema | Field commonly missing | Severity |
|---|---|---|
| Article / BlogPosting / NewsArticle | image, author.name, datePublished | Error (no rich result without them) |
| BreadcrumbList | itemListElement[].position, item | Error (needs at least 2 list items) |
| Product | image, offers.price, offers.priceCurrency | Error |
| Recipe | image, recipeIngredient, recipeInstructions | Error |
| VideoObject | name, thumbnailUrl, uploadDate | Error |
2. Wrong data type (error)
A field expects a date, you gave a free-text string. It expects a URL, you gave a path. It expects a Person object, you gave a bare name string.
"datePublished": "May 2026" // wrong: not ISO 8601
"datePublished": "2026-05-17T00:00:00Z" // correct (date + time + timezone)
"author": "Liziang Zheng" // wrong: bare string
"author": { "@type": "Person", "name": "Liziang Zheng" } // correct
Note: author.name should be only the name — no job titles, no “By”, no publisher prefix.
3. Wrong schema type for the content
Marking a tutorial as Product to chase star ratings, or a list of links as Recipe. This violates Google’s structured data policies: mark up only content that is actually visible on the page and that matches the type. A Product declaring "price": "49.99" while the page shows $59.99 validates fine in the tester but breaks the policy and can trigger a manual action.
How to spot it: read Google’s schema reference for your content type; if your @type doesn’t match the real content, change it.
4. The type no longer produces a rich result (FAQPage / HowTo)
As of June 2026 Google has retired several rich-result types. If your warnings are on these, there is no Google fix — the rich result is gone for everyone.
FAQPage— FAQ rich results stopped showing in Search on May 7, 2026. The FAQ rich-result report in Search Console and FAQ support inside the Rich Results Test were removed in June 2026; the Search Console API drops FAQ support in August 2026. (See Search Engine Land.)HowTo— no HowTo rich result on any surface since 2023.- Retired in mid-2025:
Book Actions,Course Info,Claim Review,Estimated Salary,Learning Video,Special Announcement,Vehicle Listing.
The schema types are still valid on schema.org and will not cause errors or manual actions if you leave them in. They just produce zero Google SERP lift now. You can keep the markup (other engines and AI surfaces may still read it) or remove it — your call.
5. Multiple JSON-LD blocks conflict (error or warning)
Two <script type="application/ld+json"> blocks on one page — one says Article, another BlogPosting, or they declare different @id. Google reads all blocks; inconsistencies fire warnings or errors.
How to spot it:
curl -s "https://yoursite.com/article" | grep -c '<script type="application/ld+json">'
A count above 1 means multiple blocks. Consolidate into one (use @graph if you genuinely need multiple types).
6. URL fields are relative (error)
"image": "/og-cover.png" — Google needs absolute, crawlable URLs. Use "https://yoursite.com/og-cover.png". The image must also be indexable (not blocked by robots.txt) and at least 50,000 pixels total (width times height), in a Google-supported format.
7. Field exceeds practical limits (warning)
headline should be concise — long titles get truncated. Keep name short and description reasonable. These usually surface as warnings, not errors.
8. JSON syntax error (error)
A trailing comma, an unescaped quote, or the wrong bracket type. Rich Results Test reports Cannot parse content as JSON.
How to spot it: paste the JSON-LD block into a validator like jsonlint.com.
Shortest path to fix
Step 1: Test the affected URL and triage
Open Rich Results Test → enter the live URL → click the detected item type → expand the issues.
For each line, record:
- Is it red (error — must fix) or yellow (warning — optional)?
- Which JSON-LD block (line range)
- Which field
- Expected type vs. the value you provided
Fix errors first. Only chase warnings if you have time.
Step 2: Generate a correct baseline
Don’t hand-write JSON-LD. Start from a known-good template. For an Article page:
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "Title of the article",
"image": ["https://yoursite.com/og-cover.png"],
"datePublished": "2026-05-17T00:00:00Z",
"dateModified": "2026-05-22T00:00:00Z",
"author": {
"@type": "Person",
"name": "Author Name",
"url": "https://yoursite.com/about"
},
"publisher": {
"@type": "Organization",
"name": "Site Name",
"logo": {
"@type": "ImageObject",
"url": "https://yoursite.com/logo.png"
}
},
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "https://yoursite.com/article"
}
}
Step 3: For multiple types, use @graph
If you legitimately need, say, Article plus BreadcrumbList on one page, put them in a single block:
{
"@context": "https://schema.org",
"@graph": [
{ "@type": "Article", "@id": "https://yoursite.com/article#article" },
{ "@type": "BreadcrumbList", "@id": "https://yoursite.com/article#breadcrumb" }
]
}
One <script> block, two types, no conflict. Use stable @id values ending in #identifier so entities link cleanly and don’t duplicate. (Note: don’t add FAQPage here expecting a rich result — it no longer produces one.)
Step 4: Fix at the template level
Don’t patch one article at a time. Find your layout’s JSON-LD generator and fix the bug once. For Astro:
---
const { article } = Astro.props;
const jsonLd = {
"@context": "https://schema.org",
"@type": "Article",
headline: article.title,
image: [new URL(article.image, Astro.site).toString()],
datePublished: new Date(article.publishedAt).toISOString(),
// ...
};
---
<script type="application/ld+json" set:html={JSON.stringify(jsonLd)}></script>
new URL(..., Astro.site) is what guarantees absolute URLs, and .toISOString() guarantees valid ISO 8601 dates — the two most common error sources.
Step 5: Validate in CI
Catch missing-field errors before they ship:
// scripts/check-json-ld.mjs
import fs from 'node:fs';
import path from 'node:path';
const required = {
Article: ['headline', 'image', 'datePublished', 'author'],
BlogPosting: ['headline', 'image', 'datePublished', 'author'],
Product: ['name', 'image', 'offers'],
BreadcrumbList: ['itemListElement'],
// ...
};
function walk(dir) {
for (const f of fs.readdirSync(dir)) {
const p = path.join(dir, f);
if (fs.statSync(p).isDirectory()) walk(p);
else if (p.endsWith('.html')) {
const html = fs.readFileSync(p, 'utf8');
const matches = html.match(/<script type="application\/ld\+json">([\s\S]+?)<\/script>/g) || [];
for (const m of matches) {
const json = JSON.parse(m.replace(/<\/?script[^>]*>/g, ''));
const type = json['@type'];
for (const field of (required[type] || [])) {
if (!json[field]) console.error(`MISSING ${field} in ${type} at ${p}`);
}
}
}
}
}
walk('dist');
Step 6: Re-test, then re-crawl
After deploy:
- Re-run Rich Results Test on the live URL → errors gone (warnings are OK).
- Search Console → URL Inspection → enter the URL → Request indexing so Google re-crawls and picks up the new markup.
- Wait roughly 1-2 weeks for the Search Console structured-data report to refresh (it updates from crawl data, not instantly).
How to confirm it’s fixed
- Rich Results Test shows the item type as valid with no red errors. Yellow warnings are fine.
- URL Inspection → “View tested page” → the rendered JSON-LD contains your fixed fields.
- A week or two later, the structured-data report in Search Console moves the URL from Invalid to Valid (or Valid with warnings).
- The actual snippet shows in search — verify with a
site:query or by searching the page’s title. Remember: eligibility is necessary but not sufficient; Google still decides display.
Prevention
- Generate JSON-LD from one template, never hand-write per page.
- One
<script type="application/ld+json">block per page; use@graphfor multiple types. - ISO 8601 dates with timezone:
2026-05-17T00:00:00Z. Never “May 2026” or “5/17/2026”. - Absolute, crawlable, indexable URLs only.
- Don’t invest in
FAQPage/HowTomarkup expecting Google rich results — those surfaces are gone as of 2026. - Run the CI check above (or the Rich Results Test API on sample URLs) on every deploy.
FAQ
Is a yellow warning going to stop my rich result? No. Warnings flag missing recommended fields. The rich result can still show. Only red errors block eligibility. Fix errors first; treat warnings as polish.
My FAQ markup shows warnings / disappeared from the report. What do I fix?
Nothing, for Google. FAQ rich results stopped showing on May 7, 2026, and FAQ support was removed from the Rich Results Test and Search Console reporting in June 2026 (API in August 2026). The FAQPage type is still valid schema.org and won’t cause penalties — leave it or remove it.
I fixed everything and the test is green, but no rich snippet appears. Why? Passing the test means you are eligible, not guaranteed. Google decides display by query, content quality, and freshness. Also give it time: re-crawl via URL Inspection and wait days to weeks.
Does datePublished have to be a real date?
The tester only checks format, not truth — 2026-01-15 validates even if you published in 2024. But faking dates violates Google’s policies and can hurt you. Use the real publication date in ISO 8601.
Error vs. warning — where exactly do I see which is which? In the Rich Results Test, click the detected item type to expand it. Errors are red and listed under the item; warnings are yellow. Search Console’s report uses the same labels: Invalid (errors), Valid with warnings, and Valid.
Should I fix structured data per page or in the layout? In the layout. If one article is wrong, the template that built it is almost always the cause, so every article shares the bug. Fix the generator once (Step 4) and redeploy.
Related
- Structured data warning
- Structured data getting started
- FAQ schema invalid
- Breadcrumb JSON-LD mismatch
Tags: #Troubleshooting #SEO #Debug #Structured data #Rich results