Search Console’s “Enhancements” report shows red structured-data warnings like “Missing field ‘image’”, “Invalid value in field ‘datePublished’”, “Either ‘author’ or ‘publisher’ must be specified.” These don’t directly hurt indexing, but you lose rich snippets — no author card, no star ratings, no FAQ expansion. CTR typically drops 10-30%.
The fix is field-by-field validation against Schema.org and Google’s structured data requirements.
Common causes
1. Required field missing
Most-commonly missed:
| Type | Required (Google) | Often omitted |
|---|---|---|
Article / BlogPosting | headline, image, datePublished, author | image, author |
Product | name, image, offers (with price + priceCurrency) | offers.priceCurrency |
Recipe | name, image, recipeIngredient, recipeInstructions | recipeInstructions |
FAQPage | mainEntity array, each with name and acceptedAnswer.text | acceptedAnswer.text |
Event | name, startDate, location | location format |
How to confirm: Rich Results Test names the exact field.
2. Wrong type (Article vs BlogPosting vs NewsArticle)
Article is the base; BlogPosting is for blog posts; NewsArticle is for news. Declaring two on one page conflicts. News sites need NewsArticle to qualify for Google News; personal blogs use BlogPosting; general technical guides use Article.
3. Date format wrong
Google wants ISO 8601:
"datePublished": "2026-05-21T10:00:00Z" // OK, with timezone
"datePublished": "2026-05-21" // also OK
"datePublished": "2026/05/21" // wrong
"datePublished": "May 21, 2026" // wrong
"datePublished": "2026-05-21T10:00:00" // wrong, no timezone
4. image field format
image can’t always be just a string URL (depends on type). Prefer ImageObject:
// Simple (works in some contexts)
"image": "https://yourdomain.com/cover.jpg"
// Full recommended
"image": {
"@type": "ImageObject",
"url": "https://yourdomain.com/cover.jpg",
"width": 1200,
"height": 630
}
The image URL must be absolute (include https://), not /cover.jpg.
5. author as bare string
// Wrong
"author": "Jane Doe"
// Right
"author": {
"@type": "Person",
"name": "Jane Doe",
"url": "https://yourdomain.com/about"
}
6. JSON-LD syntax errors (trailing commas, mismatched quotes)
JSON-LD must be valid JSON. A trailing comma invalidates the whole block. Schema.org validator and Rich Results Test both report “Parsing error.”
Shortest path to fix
Step 1: Get the specific error from Rich Results Test
https://search.google.com/test/rich-results
Paste the live URL. You’ll see:
- Which schema types were detected
- Each field’s value
- Red warnings = required field missing or invalid value
- Yellow notices = recommended field missing
Note the flagged field names.
Step 2: Cross-reference Schema.org
For example, an Article image warning:
https://schema.org/Article (Article)
https://developers.google.com/search/docs/appearance/structured-data/article (Google's extra requirements)
Confirm whether the field is required / recommended, or whether your type is wrong.
Step 3: Generate JSON-LD from one helper
// src/lib/jsonld.js
export function articleJsonLd({ title, slug, image, publishedAt, modifiedAt, author }) {
const url = `https://yourdomain.com/articles/${slug}/`;
return {
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": title,
"image": {
"@type": "ImageObject",
"url": image.startsWith("http") ? image : `https://yourdomain.com${image}`,
"width": 1200,
"height": 630
},
"datePublished": new Date(publishedAt).toISOString(),
"dateModified": new Date(modifiedAt || publishedAt).toISOString(),
"author": {
"@type": "Person",
"name": author?.name || "AI Productivity Guide Team",
"url": author?.url || "https://yourdomain.com/about"
},
"publisher": {
"@type": "Organization",
"name": "Your Site",
"logo": {
"@type": "ImageObject",
"url": "https://yourdomain.com/logo.png",
"width": 600,
"height": 60
}
},
"mainEntityOfPage": {
"@type": "WebPage",
"@id": url
}
};
}
In the layout:
---
import { articleJsonLd } from "../lib/jsonld.js";
const ld = articleJsonLd(Astro.props);
---
<script type="application/ld+json" set:html={JSON.stringify(ld)} />
Step 4: Add CI validation
// scripts/check-jsonld.mjs
import fg from "fast-glob";
import fs from "node:fs";
const issues = [];
for (const f of fg.sync("dist/**/*.html")) {
const html = fs.readFileSync(f, "utf8");
const blocks = [...html.matchAll(/<script[^>]+ld\+json[^>]*>([\s\S]+?)<\/script>/g)];
if (blocks.length === 0) { issues.push(`NO JSON-LD: ${f}`); continue; }
for (const [, body] of blocks) {
try {
const data = JSON.parse(body);
if (!data["@type"]) issues.push(`MISSING @type: ${f}`);
if (data["@type"] === "BlogPosting") {
if (!data.headline) issues.push(`MISSING headline: ${f}`);
if (!data.image) issues.push(`MISSING image: ${f}`);
if (!data.datePublished) issues.push(`MISSING datePublished: ${f}`);
if (!data.author) issues.push(`MISSING author: ${f}`);
}
} catch (e) {
issues.push(`INVALID JSON: ${f} — ${e.message}`);
}
}
}
if (issues.length) { console.error(issues.join("\n")); process.exit(1); }
Step 5: Search Console “Validate fix” after deploy
Go to the specific enhancement report → click “Validate fix.” Google re-evaluates in 7-14 days.
You can speed it up: pick 5-10 most important URLs and Request indexing in URL Inspection.
Prevention
- JSON-LD is always generated from one helper — no hand-writing
- One schema type per page; never declare Article + BlogPosting together
- Dates always
new Date(...).toISOString()— no string concatenation - Every URL field (image url, author url, publisher logo) must be absolute with https://
- Rich Results Test required for green status before merging
- CI parses every HTML’s JSON-LD; missing required fields fail the build
Related
Tags: #SEO #Google #Search Console #Indexing