Skip to content
pageinspection

Author and publisher as entities, not strings

"author": "Jane Doe" passes every validator you can point at it. It also says nothing that the byline printed above the article did not already say, and it is what the majority of Article blocks on the web contain. This is the difference between naming somebody and identifying them.

The short answer

An author property holding a plain string is valid markup and a dead end: it names a person nobody can resolve. Use a Person object with a name, a url pointing at a real profile and, where possible, a sameAs. Reference the publisher by @id rather than retyping the organisation on every article.

ImportantAudit check · Author & Publisher properties

A string byline is valid markup and a dead end

Set author to a string and you have told a parser that the characters J, a, n, e and so on are associated with this article. It cannot tell whether the Jane Doe on this post is the Jane Doe on the other ninety, whether she works for you, or whether she exists. There is nothing to follow and nothing to cross-check.

The version that goes somewhere is a nested object with a type, a stable identifier and at least one link off your own domain. That turns ninety separate mentions of a name into ninety references to one thing, and gives the one thing an address where a claim about it can be verified. Same mechanism as the publisher entity, applied to a person.

A name is a label. An entity is a label you can look up.

Two flavours of the failure, both extremely common. The first is a string where an object belongs. The second is an object with nothing in it except @type and name, which is the same dead end with more braces around it.

What a Person entity has to carry

Four properties do the work. name, exactly the name and nothing else. @id, a stable fragment on the page that describes this person. url, that page. And sameAs, the off-site profiles that let somebody who does not trust you check the claim.

author.html
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@type": "Person",
      "@id": "https://example.com/authors/jane-doe#person",
      "name": "Jane Doe",
      "url": "https://example.com/authors/jane-doe",
      "jobTitle": "Principal data engineer",
      "description": "Eleven years building ingestion pipelines, six of them here.",
      "image": "https://example.com/img/jane-doe.jpg",
      "worksFor": { "@id": "https://example.com/#organization" },
      "knowsAbout": ["Data pipelines", "Postgres", "Change data capture"],
      "sameAs": [
        "https://www.linkedin.com/in/janedoe-example/",
        "https://github.com/janedoe",
        "https://orcid.org/0000-0000-0000-0000"
      ]
    },
    {
      "@type": "ProfilePage",
      "@id": "https://example.com/authors/jane-doe#page",
      "url": "https://example.com/authors/jane-doe",
      "mainEntity": { "@id": "https://example.com/authors/jane-doe#person" }
    }
  ]
}
</script>

That block belongs on the author page. Every article she writes then references the identifier rather than repeating any of it, which is the second half of the fix and the section after next.

Three rules about name that account for a large share of broken author markup.

  • No decoration.Google's documentation is explicit that the value is the name alone. By Jane Doe is wrong, so is Jane Doe, Principal Data Engineer, and so is Jane Doe | Northwind. The role goes in jobTitle. Templates that interpolate the rendered byline straight into the property produce all three.
  • Two authors are two objects. An array of Person nodes, not one string containing the word and. A single entity called Jane Doe and Amir Khan is a person who does not exist.
  • Check what your CMS put there before you check anything else. A default install writes whatever the account is called, which is why a measurable slice of the web publishes articles authored by admin, editor or the name of an agency that stopped working there in 2022. It validates cleanly.

urlshould point at a page about the person on your site, with enough on it to be worth landing on. Pointing it at the article's own URL, or at an archive listing that is just their last ten posts with no biography, satisfies the syntax and wastes the property.

Checking how your own bylines are built

The quick manual version: open one article, find the JSON-LD, and look at what sits to the right of author. If it is a quoted string you have the problem this page is about. If it is an object, check whether it carries anything beyond a name, and whether the identifier in it is the same one your other articles use.

This one needs the full crawl

This looks at how the author and publisher properties are built inside a block, a nested entity against a bare string, which needs the contents of the markup rather than the list of types on the page.

The instant search on this site audits a single page, so rather than show you a verdict it cannot support, this guide sends you to the place the check actually runs.

Reference the publisher, do not retype it

publisher has the same string problem and a worse version of it, because publisher data is longer, so people copy more of it into more places. The pattern to avoid is every article carrying a full Organization object with a name, a URL and a logo object nested inside it.

It validates. What it means is that each article declares its own publisher, and a consumer reading four hundred of your posts has no way to know it is the same publisher four hundred times rather than four hundred organisations with matching names. Then someone rebrands, the old value stays in a cached template, and now there are two.

article-references.json
{
  "@context": "https://schema.org",
  "@type": "BlogPosting",
  "@id": "https://example.com/blog/cdc-without-tears#article",
  "author": { "@id": "https://example.com/authors/jane-doe#person" },
  "publisher": { "@id": "https://example.com/#organization" },
  "mainEntityOfPage": { "@id": "https://example.com/blog/cdc-without-tears" }
}

Two identifiers, no duplicated data, one place to edit when anything changes. The identifiers have to resolve to nodes a consumer can actually reach, which in practice means the organisation block is emitted site-wide by your layout and the person block sits on the author page, both with identifiers that never change.

The strict publisher logo rules came from somewhere specific.

If you have read that publisher.logo must be a raster image no more than sixty pixels tall and no wider than six hundred, that requirement belonged to the AMP top-stories carousel, which is what those numbers were sized for. Advice written for it is still being repeated as a general rule for every article on the web. Get the organisation logo right once, in the block that owns it, and stop carrying a decade-old carousel constraint into every post.

One legitimate case for a non-person author: work that genuinely has no individual byline, a documentation page or a policy, can name the organisation as author. That is honest and it is better than inventing a staff writer. What is not fine is attributing an opinion piece to a company because filling in a person felt like work.

What the markup claims, and what it cannot manufacture

The reason people care about this property is the set of signals search quality raters are asked to weigh: whether content shows first-hand experience, whether its author has any standing in the subject, whether the site is a reasonable place to read about it. Author markup is adjacent to all of that, and it is worth being precise about how.

Markup makes a claim machine-readable. It does not make the claim true, and no property here confers standing on anybody. There is no expertise field, and if one existed, setting it would achieve nothing. What the entity does is remove ambiguity from a claim you can already support: this named person, who has a biography here, who is credited on these eleven other pieces, who has a profile there that lists the same employer.

Which puts the work in the right order. The biography, the real credential, the byline that belongs to somebody who actually did the thing: those are the substance, and they live in whether the byline stands up at all. This check is about not throwing that substance away by encoding it as five characters of plain text. An empty entity around an anonymous name is still empty.

Why a bare string is rated Important

Nothing breaks. That is the honest starting point and it is why this cannot be Critical: a page with a string author is indexed, ranked and served exactly as it would be otherwise, and the block it sits in remains valid. There is no error to see and no feature withdrawn.

What is lost is the value of work already done. Somebody wrote the biography, somebody hired the expert, and the markup hands a consumer a name it cannot connect to either. Paying for substance and then encoding it in a form that discards the connection is a bad trade, and unlike most bad trades in markup it costs nothing to reverse.

It sits at Important rather than lower because the fix touches one property in one template and improves every article at once, and because the alternative to an identifier is name-matching, which fails on married names, transliterations and any newsroom with two people called James. Where each rating sits relative to the others is spelled out on the page that lists the checks.

Confirming every byline resolves to one person

Start with the identifier, because that is where the silent duplication lives. Pull the author identifier out of several articles by the same person and confirm you get one distinct value back rather than several near-identical ones.

check-authors.sh
for path in /blog/post-a /blog/post-b /blog/post-c; do
  curl -s "https://example.com$path" \
    | grep -o '"author":[^}]*}' \
    | head -1
done

# the author page has to actually serve the Person node
# those articles are pointing at
curl -s https://example.com/authors/jane-doe \
  | grep -c '#person'

Then read the rendered byline and the markup side by side. The name in the JSON should be the name on the page with the word by and any job title stripped off, the person's page should exist and load, and each profile URL should be a live page that names the same employer your markup does. A profile listing a job they left two years ago is a contradiction you have published about your own staff.

Do the same for the publisher identifier across a handful of templates. If your article properties are otherwise incomplete, the dates and the headline are the next thing to look at, since author is usually discovered while fixing those.

Questions this check raises

Is author as a plain string valid?
It is valid schema.org and Google accepts it, which is why it is so common. What it does not do is identify anyone: the string cannot be looked up, connected to other articles by the same person, or verified. A Person object with a url is the difference between a name and an entity.
What is the difference between author and publisher?
The author wrote it, the publisher published it. On most sites the publisher is the Organization and the author is a Person who works there. Setting both to the organisation is common and loses the distinction that makes authorship worth marking up at all.
Does author markup improve E-E-A-T?
It does not create expertise. What it does is make an existing credential machine-readable, so an author who genuinely has a track record can be connected to it across articles and sites. Marking up a byline with no substance behind it changes nothing except that the emptiness is now structured.