Skip to content

Schema field: @id

What this field is: @id is a stable, canonical identifier for a node in your structured data. It is not a link people click; it is a name that lets your other schema nodes reference this exact entity. People get it wrong constantly, so this field is worth understanding.

Stable means identical on every page. The scan compares the Organization @id across the pages it reads. Two pages emitting https://example.com/#org and https://example.com/about/#org are, to a consuming engine, two different companies — so your brand gets split into as many records as you have variants, and nothing can merge them. Pick one string and emit that exact string everywhere.

The same rule applies to author. An Article whose author is a plain string gives an engine a label with nothing behind it. An Article whose author is an inline Person object with no @id is worse in a specific way: every article that repeats the block mints another Person, so a writer with twenty posts becomes twenty people no engine can reconcile into one author. Define the Person once at a stable @id (https://example.com/team/jane-doe#person) and reference it from every article. This is exactly the rule that has always applied to publisher; it applies to author for the same reason.

Structured data is a graph of nodes (your Organization, your WebSite, each Article, each Person). Without stable ids, every node that mentions your organization has to re-describe it inline, and engines cannot tell that the “publisher” of an article and the site’s Organization are the same thing. A shared @id is the wire that connects them: define the Organization once, give it an @id, and every other node points at that id instead of repeating the data. This is what makes the entity resolve to one confident record.

Use a URL-shaped id anchored to your origin with a fragment that names the node type:

{
"@type": "Organization",
"@id": "https://example.com/#org",
"name": "Example Inc"
}

Common conventions:

  • Organization: https://example.com/#org
  • WebSite: https://example.com/#website
  • Person: https://example.com/about#author or a per-author id
  • A specific page: the page’s canonical URL plus a fragment

Then reference it elsewhere by id, rather than re-describing the entity:

"publisher": { "@id": "https://example.com/#org" }
  • It must be stable. Keep the @id identical across every page and even across a domain migration (the URL changes, the entity does not).
  • The fragment (#org) makes it distinct from the page URL, so it never collides with a real page.
  • Reuse the same id everywhere the node is mentioned. That reuse is the entire point.