Search Console → Enhancements → Articles starts flagging “Missing field ‘author.name’” on a few pages. Days later it is 200 pages. A week later your articles stop getting the byline chip in SERP. The frustrating part: you DO have an author. The byline reads “By Jane Lee” right under the title. Open the JSON-LD and you see why Google is unhappy — the author field is a bare string or an object missing the inner name property. Google’s Article schema is picky: author must be a structured object with at least @type and name. A plain string fails validation even though the human reads it as a name.
Common causes
Ordered by frequency in production templates.
1. author is a string, not an object
Template emits "author": "Jane Lee". Schema.org accepts a string for many fields but Google specifically requires author to be a Person or Organization object for Article rich results.
How to spot it: View source on JSON-LD. If "author" is a quoted string, this is the bug.
2. author is { "name": null } because the data field is empty
CMS has an author field that is sometimes null. The generator emits { "@type": "Person", "name": null }. Google reads this as “name field present but empty.”
How to spot it: Some articles have valid author objects, others have null or empty string in the name slot.
3. author object has givenName and familyName but no name
The generator splits the name properly but never emits the combined name field. Schema.org allows the split form but Google’s Article rich result requires name specifically.
How to spot it: JSON-LD has "givenName": "Jane", "familyName": "Lee" but no "name".
4. author is an array of strings instead of objects
Multi-author articles emit "author": ["Jane Lee", "Sam Park"]. The array shape is correct but each entry must be an object.
How to spot it: View source on a co-authored article and inspect the array contents.
5. author nested under the wrong parent
Generator puts author inside publisher or mainEntityOfPage instead of at the Article root.
How to spot it: Search the JSON-LD for "author" and confirm its parent key is the top-level Article object.
6. CMS migration dropped the structured author data
After a CMS migration, the new system stores authors as text only. The schema generator falls back to the team byline or “Editorial Team” as a string.
How to spot it: All recent articles share the same generic author string; older articles have varied authors.
Before you start
- Pull the list of affected URLs from Search Console → Enhancements → Articles → “Missing field ‘author.name’”. Save the list — you will measure cleanup against it.
- Identify the template or generator that emits the JSON-LD.
- Decide on your data model: do you have a real authors table, or only freeform strings?
- Confirm whether
authorshould be aPerson(typical) orOrganization(for editorial team content).
Information to collect
- Raw HTML for 5-10 affected pages, focusing on the JSON-LD block.
- The template code that builds
author. - The CMS / data source: structured author records or freeform strings.
- Whether your site has both Article and BlogPosting types, or only one.
- Sample data for typical authors (single, co-authored, anonymous editorial).
Step-by-step fix
Cheapest first.
Step 1: Confirm the shape with a Rich Results Test
Run any affected URL through Google’s Rich Results Test. The error message will quote the exact field path: author[0].name is missing or author is a string, expected object. That tells you which variant of the bug you have.
Step 2: Fix the schema generator
Minimum valid shape:
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "How to bake sourdough",
"datePublished": "2026-05-10",
"author": {
"@type": "Person",
"name": "Jane Lee"
}
}
In template code:
function authorBlock(article) {
if (!article.author?.name) {
// No reliable author — omit the field entirely rather than fake it
return undefined;
}
return {
"@type": "Person",
"name": article.author.name,
...(article.author.url && { url: article.author.url }),
};
}
const jsonLd = {
"@context": "https://schema.org",
"@type": "Article",
"headline": article.title,
"datePublished": article.publishedAt,
...(authorBlock(article) && { author: authorBlock(article) }),
};
Step 3: Handle multi-author articles correctly
Each author must be its own object:
"author": [
{ "@type": "Person", "name": "Jane Lee", "url": "https://example.com/team/jane" },
{ "@type": "Person", "name": "Sam Park", "url": "https://example.com/team/sam" }
]
In code:
const authorArr = article.authors
.filter(a => a?.name)
.map(a => ({ "@type": "Person", "name": a.name, ...(a.url && { url: a.url }) }));
if (authorArr.length === 1) jsonLd.author = authorArr[0];
else if (authorArr.length > 1) jsonLd.author = authorArr;
// else: omit
Step 4: Editorial-team content uses Organization
For content without a named individual:
"author": {
"@type": "Organization",
"name": "Acme Editorial",
"url": "https://example.com/about/editorial"
}
Resist the temptation to invent a fake person.
Step 5: Backfill missing author data in CMS
For affected URLs:
# Find articles with missing author.name in JSON-LD
for url in $(cat affected.txt); do
curl -s "$url" | grep -q '"author":\s*"' && echo "STRING_AUTHOR: $url"
curl -s "$url" | grep -q '"name":\s*null' && echo "NULL_NAME: $url"
done
Either edit each one or write a one-off script to set a sensible default (real author for legacy posts, editorial Org for anonymous).
Step 6: Add CI assertion for required schema fields
// scripts/validate-schema.mjs
import { parse } from 'node-html-parser';
for (const url of sampleUrls) {
const html = await fetch(url).then(r => r.text());
const root = parse(html);
const ld = root.querySelectorAll('script[type="application/ld+json"]');
for (const node of ld) {
const data = JSON.parse(node.text);
if (data['@type'] !== 'Article' && data['@type'] !== 'BlogPosting') continue;
if (typeof data.author === 'string') throw new Error(`String author: ${url}`);
if (!data.author?.name && !Array.isArray(data.author)) throw new Error(`Missing author.name: ${url}`);
}
}
Run on every deploy. Catches regressions before users see them.
Step 7: Re-request indexing
URL Inspection → Request indexing on a sample of fixed URLs. Watch Search Console → Enhancements → Articles for the warning count to fall over 1-3 weeks.
Verify
- Rich Results Test on five fixed URLs reports zero warnings on
author. - Search Console → Enhancements → Articles shows “Missing field ‘author.name’” count trending toward zero.
- Byline chips reappear in SERP for affected URLs.
- CI assertion runs green on every PR.
- New articles never ship without a structured
authorobject.
Long-term prevention
- Treat schema fields as part of the content contract: validate them as you would required form inputs.
- Use TypeScript types for your JSON-LD generators so missing fields fail at compile time.
- Document the canonical
authorshape in your repo README or schema-registry doc. - Establish a rule: if there is no real human author, use Organization; never fall back to a string.
- Quarterly audit of Search Console enhancement warnings to catch slow drifts.
Common pitfalls
- Setting
"author": ""(empty string) instead of omitting the field. Google flags empty values as worse than missing. - Using
@type: "Thing"for author. It is a valid type but not what Google’s Article rich result expects. - Including
authoronly in microdata or RDFa but not JSON-LD. Pick one format; Google’s documentation focuses on JSON-LD. - Adding
author.imageorauthor.sameAsbut forgettingauthor.name. Name is the only field that is actually required. - Listing the author’s URL as
https://twitter.com/handleand assuming it counts as aname. URL and name are separate fields.
FAQ
Q: Can author be a URL pointing to an author page instead of an inline object?
Schema.org allows that pattern but Google’s rich results documentation recommends inline Person objects with name. Use inline objects for safety.
Q: Do anonymous editorials qualify for Article rich results?
Yes, but the author must be a named Organization. “Editorial Team” or your publication’s name is fine. “Anonymous” or empty does not satisfy the requirement.
Q: What if the author has a pen name? Should I expose the legal name?
Use whatever name appears in the byline on the page. Schema must mirror visible content. If the visible byline is “J. Doe,” the schema name is “J. Doe.”
Q: Will fixing this immediately bring back byline chips in SERPs?
Not always — byline chips also depend on broader trust signals. But fixing the warning is a prerequisite. Without a valid author.name, the chip will not even be considered.
Related
- Structured Data Rich Results Warning
- Structured Data Became Invalid After a Template Change
- Article Date and JSON-LD Date Mismatch
- FAQ Schema Invalid
- Website JSON-LD Inconsistency
Tags: #SEO #Troubleshooting #Structured data #article-schema #author