The short version
- The
@idmatters more than any descriptive property. Without it you get a new vague person on every page instead of one node. alternateNameis for genuine other names — handles, spellings, former names. Never for search queries.jobTitleaccepts an array. Use it if you hold several honest descriptors; do not invent a fourth.- Pair the Person with exactly one
ProfilePageand pointmainEntityOfPageat it. - Every claim should be checkable by a human reading your site. If it is not, delete it.
Why most Person markup does nothing
Here is the schema I find on most consultant and founder sites:
{
"@type": "Person",
"name": "Jane Smith",
"jobTitle": "Marketing Consultant",
"image": "https://example.com/jane.jpg"
}
Technically valid. Practically useless. Three problems, in order of severity:
- No identifier. This block appears on twelve pages, so Google sees twelve unlinked mentions of somebody called Jane Smith rather than one person mentioned twelve times.
- No corroboration hooks. Nothing points at a profile anyone else controls, so there is no way to confirm the claim.
- No relationships. Jane is not connected to her company, her work, or a page that describes her.
Everything below is about fixing those three, in that order. Adding more descriptive properties to the block above does not help; it just makes twelve vague mentions more detailed.
Start with the identifier
An @id is a stable URI that names the node. It does not have to resolve to a page — a fragment on your domain is the conventional choice:
"@id": "https://example.com/#jane"
Two rules. Use the same @id on every page — that is what merges the mentions into one node. And never change it — changing the @id creates a new entity and discards whatever confidence the old one had accumulated.
Once the node has an identifier, every other schema block on the site can point at it by reference instead of redeclaring the person:
"author": { "@id": "https://example.com/#jane" }
This is the single highest-leverage change in this article. One node with an @id, referenced everywhere, beats a fully-described Person block copy-pasted onto every page.
The eight properties that earn their place
| Property | Why it earns its place |
|---|---|
@id | Merges every mention into one node. Non-negotiable. |
name | The canonical display name. One value, matching what your site actually shows. |
alternateName | Genuine other names. See the next section — this is the abused one. |
description | One or two plain sentences saying who this is and how they relate to the business. Cheap and underrated. |
jobTitle | What they do. An array is valid and often more honest than picking one. |
sameAs | Profile URLs. The only property that invites external corroboration. |
worksFor / brand | The link to the organisation. brand is the correct property when the business is the person’s own brand. |
mainEntityOfPage | Which URL is the canonical page about this person. |
Two more are worth adding when genuinely true: knowsAbout for subject expertise, and address or homeLocation when location is part of how you are found. Both are easy to over-claim, so keep them narrow.
Free tool · See your rendered markup
Check whether your structured data actually parses
Paste a URL and the checker reports the structured data blocks it finds in the rendered HTML, alongside the head tags and heading structure — so you can confirm your Person node is present, valid and consistent.
alternateName: the field people abuse
alternateName means other names this thing is genuinely called. That includes:
- Platform handles that differ from the display name —
@janesmithdesign,jane_smith. - Spelling variants forced by usernames — a one-word form of a two-word brand.
- Former names, maiden names, transliterations.
- A shortened form people actually use.
It does not include search queries. These are all misuse:
"alternateName": [
"best marketing consultant london", <-- a query
"affordable SEO expert", <-- a query
"Jane Smith Marketing Consultant UK" <-- a title tag
]
The reason to care is not that Google punishes it specifically. It is that alternateName is an identity signal, and filling it with non-names dilutes the one field whose entire job is telling Google what this thing is called. If every string in the list is a name, the list is evidence. If half of them are marketing copy, the list is noise.
The test
- Would a human introduce you using this string? → it is a name.
- Would a human type this string into a search box? → it is a query.
- Queries belong in your copy, headings and service pages. Never in a name field.
Connecting the person to the brand
For a person-led business you want the relationship stated in both directions, so each node reinforces the other:
// on the Person
"worksFor": { "@id": "https://example.com/#brand" },
"brand": { "@id": "https://example.com/#brand" }
// on the Organization
"founder": { "@id": "https://example.com/#jane" },
"employee": { "@id": "https://example.com/#jane" }
worksFor alone reads as employment — true but incidental. brand is the property that says this organisation is this person’s brand, which is the actual relationship in a solo practice. Using both is not redundant; they describe different facets.
Then say it in prose as well. Put a sentence in the description of each node that names the other one. Structured data states the relationship formally; the description states it in the language a model reading your page will actually quote.
One ProfilePage, not several
ProfilePage is the page type for a page that is primarily about one person or organisation. The rule is simple and frequently broken: one per entity.
The common failure is typing both the homepage and the about page as ProfilePage for the same person. Both then claim to be the page about that person, and Google has to pick. Make the about page the ProfilePage, leave the homepage as a plain WebPage, and point at the profile from everywhere:
// on the Person, on every page
"mainEntityOfPage": { "@id": "https://example.com/about/#profilepage" }
// on the about page only
{
"@type": "ProfilePage",
"@id": "https://example.com/about/#profilepage",
"isPartOf": { "@id": "https://example.com/#website" },
"mainEntity": { "@id": "https://example.com/#jane" }
}
Watch isPartOf — it takes a WebSite, not an Organization. Pointing it at your brand node is a type error that validators will not always flag.
Person schema on articles
On a blog post, do not describe the author again. Reference the node:
"author": { "@id": "https://example.com/#jane" }
If you want the author’s name to appear in the article block for readability, adding name alongside the @id is harmless — matching values merge cleanly. What you must not do is give the same @id conflicting values for the same property across pages. One page saying the job title is “Consultant” and another saying “Director” leaves Google holding two contradictory facts about one node.
The other half of author markup is the part schema cannot do: a visible byline, linking to the profile page, with the author’s name as the anchor text. Markup declares authorship; the link is what a crawler follows.
What to leave out
- Anything unverifiable. Awards, client lists, credentials, founding dates you cannot point at on the page. A contradiction costs more than the property gains.
aggregateRatingon a Person. Not a valid use, and a well-known source of manual actions when faked.- Dead
sameAsURLs. Audit them periodically. A 404 insameAsis a failed corroboration attempt. - Properties that duplicate
name.givenNameandfamilyNameare fine and mildly useful;legalNameon a Person is not a thing. - Contact details you do not want scraped. Schema is public. Use a role address, not a personal one.
The standard to hold yourself to: every property in your Person schema should be something a human could confirm by reading your website. If they could not, it is not entity clarity — it is decoration with downside.
FAQ
Do I need both Person and Organization schema?
If the business is genuinely you, yes — and link them in both directions. The Person is the thing people search for by name; the Organization is the thing that publishes, serves an area and carries the brand. Collapsing them into one node loses that distinction. The exception is a pure personal site with no business framing at all, where a Person alone is honest and sufficient.
Can I put my keywords in alternateName?
No. alternateName is for other genuine names of the same entity — handles, spellings, former names. Search phrases are not names. Filling the field with queries dilutes the one signal whose job is telling Google what your entity is called, and it reads as manipulation to anyone reviewing the page.
Should the Person schema go on every page or just the about page?
Every page, identically, referenced by the same @id. That is what merges the mentions into a single confident node. The about page additionally carries the ProfilePage block that marks it as the canonical page about that person — but the Person node itself should be site-wide and byte-identical.
Does Person schema help me get a knowledge panel?
It helps Google understand the entity, which is a precondition, but it is not a trigger. Panels depend on notability signals that mostly live off your site — independent coverage, established profiles, corroborated facts. Clean Person schema makes a panel more likely over time; it will not produce one for an entity the wider web has not noticed.
What happens if two pages give the same @id different job titles?
Google merges properties for a shared @id, so it ends up holding both values with no way to know which is current. That is a soft contradiction — not an error, but it lowers confidence in the node. If you genuinely hold several titles, put them in one array on every page rather than different single values on different pages.