ProfilePage schema: describing the person or brand behind a profile
ProfilePage schema marks a page whose main subject is one person or one organization connected to the site: a member profile on a forum, an author page on a news site, the About page of a personal blog. The page itself is the ProfilePage; the person or brand goes in mainEntity with at least a name or an alternateName.
Its main job is to connect content to its creator. Forum posts, answers and articles all carry an author.url, and a marked-up profile at the end of that link tells Google who the creator is, how long they have been active and how others interact with them. Use it together with Person, which describes the individual; ProfilePage describes the page about them.
JSON-LD example
Copy this into a <script type="application/ld+json"> tag and replace the values with your own.
{
"@context": "https://schema.org",
"@type": "ProfilePage",
"dateCreated": "2021-03-09T11:00:00-06:00",
"dateModified": "2026-07-18T08:30:00-05:00",
"mainEntity": {
"@type": "Person",
"name": "Priya Raman",
"alternateName": "priyacooks",
"identifier": "1047",
"description": "Recipe developer and former pastry chef. Writes about laminated doughs and home baking.",
"image": "https://example.com/wp-content/uploads/2024/05/priya-raman-portrait.jpg",
"sameAs": [
"https://www.instagram.com/priyacooks",
"https://www.youtube.com/@priyacooks"
],
"agentInteractionStatistic": {
"@type": "InteractionCounter",
"interactionType": "https://schema.org/WriteAction",
"userInteractionCount": 186
}
}
}
Properties
| Property | Status | What it is |
|---|---|---|
mainEntity | Required | The Person or Organization the page is about. If you can't tell which one an account is, Google says to default to Person. |
mainEntity.name | Required | The main way the creator is identified. Use real names here and handles in alternateName. alternateName alone satisfies the requirement when there is no name. |
alternateName | Recommended | A handle or other public identifier, such as @mquill. |
identifier | Recommended | Your internal user ID, which stays stable even if the handle changes. |
description | Recommended | The byline or credential shown on the profile. |
image | Recommended | The real profile photo. Leave it out rather than supplying a default avatar or placeholder. |
interactionStatistic | Recommended | Stats about the creator on this platform only: followers (FollowAction), likes of the creator (LikeAction), mutual connections (BefriendAction). |
agentInteractionStatistic | Recommended | What the creator has done here: accounts followed (FollowAction), likes given (LikeAction), posts written (WriteAction), reshares (ShareAction). |
sameAs | Recommended | The creator's profiles or home pages elsewhere. |
dateCreated / dateModified | Recommended | When the profile was created and when a person last edited its details. |
Which pages are profile pages
Google's test is that the page's main focus is a single person or organization affiliated with the site.
- Valid: a user profile on a forum or social site, an author page on a news site, an "About me" page on a blog, an employee page on a company site.
- Not valid: a store's home page, which carries plenty besides profile information, or a review site's page about a company that has nothing to do with the site.
A WordPress author archive fits when it leads with the author's bio and photo. An archive that is just a list of post titles under a name is a weaker candidate; add the bio first.
Two kinds of stats
The two statistics properties are easy to mix up.
interactionStatisticdescribes what others do toward the creator: how many follow them, how many likes their content has collected.agentInteractionStatisticdescribes the creator's own activity: how many posts they have written, how many accounts they follow.
Count only activity on your platform. Google's own warning is not to claim that the creator has 100,000 followers on some other site. On a blog, the natural statistic is posts written, which WordPress counts for you.
Author archives in WordPress
Author archives are the obvious place for this markup on most WordPress sites. Hydrogen SEO's Schema screen covers the Organization or Person behind the site; for per-author profiles, append a block on author archives with the hydrogen_seo_schemas filter:
add_filter( 'hydrogen_seo_schemas', function ( $schemas ) {
if ( ! is_author() ) {
return $schemas;
}
$user = get_queried_object();
$schemas[] = [
'@context' => 'https://schema.org',
'@type' => 'ProfilePage',
'mainEntity' => [
'@type' => 'Person',
'name' => $user->display_name,
'identifier' => (string) $user->ID,
'description' => get_the_author_meta( 'description', $user->ID ),
'image' => get_avatar_url( $user->ID, [ 'size' => 512 ] ),
'agentInteractionStatistic' => [
'@type' => 'InteractionCounter',
'interactionType' => 'https://schema.org/WriteAction',
'userInteractionCount' => (int) count_user_posts( $user->ID ),
],
],
];
return $schemas;
} );
One catch: get_avatar_url() returns a Gravatar default image for users who never uploaded a photo. Google asks you to omit placeholder images, so skip image for those users.
Pointing content at the profile
A profile does the most good when other markup links to it. Set author.url in Article, DiscussionForumPosting and QAPage to the exact profile URL, trailing slash included, so every signal lands on one address. Google also recommends images of at least 50,000 pixels (width times height), ideally in 16x9, 4x3 and 1x1 versions, and they must be crawlable, so check that your media folder isn't blocked in robots.txt.
Common questions
Is ProfilePage the same as Person schema?
No. Person describes the individual. ProfilePage describes a page about them and holds the Person in mainEntity.
Can a company use ProfilePage?
Yes. mainEntity can be an Organization, for example a brand's page on a community platform or a company's page on its own site.
Should I include follower counts from Instagram?
No. Google asks for statistics about the platform the profile page is on, not counts from other sites.
Does every author on my blog need one?
Only authors with a real profile page. Contributors who have no bio or archive gain little from it.