Fixing Schema for AI Answers
Structured data will not make an AI assistant quote you, but it can help machines work out who you are.
When the markup on a site describes the business, its people and its pages as separate, linked things, a search engine or assistant can tell which company wrote an article, who the author is, when it was updated and which social profiles are official. When the markup is missing, split across plugins or contradicts the page, that picture blurs. This guide shows how to build one connected graph of entity markup, what each part is for, and where the limits are.
What schema can and cannot do for AI answers
It helps to be clear about the evidence. Google says it uses structured data to understand page content and the entities on it, and that AI Overviews are built on its normal Search systems. Microsoft recommends structured data in its Bing webmaster guidance. Beyond that, AI companies have said very little about whether their assistants read JSON-LD directly when writing an answer. Any claim that a particular schema property "gets you cited" goes further than the public evidence.
What schema does reliably is remove ambiguity. It can state, in a form software does not have to guess at:
- the exact name of the business and its official website;
- which social and directory profiles belong to it;
- who wrote a page and what that person's role is;
- when a page was published and last changed;
- how the page, the business and the author relate to one another.
Those are the facts that go wrong in AI answers when they are left for a model to infer. Schema does not replace a clear answer in the visible text. Assistants quote what readers see, so the page still has to answer the question well.
One connected graph instead of loose blocks
Many sites have several separate JSON-LD blocks that never refer to each other: a theme outputs an Organization, a plugin outputs an Article with the author as a plain name, and a reviews widget outputs a LocalBusiness with a slightly different name. To a machine these look like three unrelated things.
The fix is to give each entity an @id, a URL-style identifier that stays the same on
every page, and to point to it wherever the entity is mentioned. The Article says its publisher is https://www.example.co.uk/#organization;
every page that mentions the business uses that same identifier. Now there is one business, described
once, referred to many times.
A working example
This graph is for a blog post on a fictional firm, Brookfield Garden Rooms. It is valid JSON and can be adapted.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
"@id": "https://www.example.co.uk/#organization",
"name": "Brookfield Garden Rooms Ltd",
"alternateName": "Brookfield Garden Rooms",
"url": "https://www.example.co.uk/",
"logo": "https://www.example.co.uk/images/logo.png",
"description": "Designs and builds insulated garden rooms and garden offices in West Yorkshire.",
"address": {
"@type": "PostalAddress",
"streetAddress": "Unit 4, Mill Lane",
"addressLocality": "Wakefield",
"postalCode": "WF1 1AA",
"addressCountry": "GB"
},
"sameAs": [
"https://www.facebook.com/example-garden-rooms",
"https://www.linkedin.com/company/example-garden-rooms"
]
},
{
"@type": "Person",
"@id": "https://www.example.co.uk/about/sam-carter/#person",
"name": "Sam Carter",
"jobTitle": "Lead designer",
"url": "https://www.example.co.uk/about/sam-carter/",
"worksFor": { "@id": "https://www.example.co.uk/#organization" }
},
{
"@type": "WebPage",
"@id": "https://www.example.co.uk/blog/garden-room-planning/#webpage",
"url": "https://www.example.co.uk/blog/garden-room-planning/",
"name": "Do garden rooms need planning permission?",
"isPartOf": { "@id": "https://www.example.co.uk/#website" }
},
{
"@type": "WebSite",
"@id": "https://www.example.co.uk/#website",
"url": "https://www.example.co.uk/",
"name": "Brookfield Garden Rooms",
"publisher": { "@id": "https://www.example.co.uk/#organization" }
},
{
"@type": "Article",
"@id": "https://www.example.co.uk/blog/garden-room-planning/#article",
"headline": "Do garden rooms need planning permission?",
"mainEntityOfPage": { "@id": "https://www.example.co.uk/blog/garden-room-planning/#webpage" },
"author": { "@id": "https://www.example.co.uk/about/sam-carter/#person" },
"publisher": { "@id": "https://www.example.co.uk/#organization" },
"datePublished": "2026-03-02T09:00:00+00:00",
"dateModified": "2026-08-14T10:30:00+01:00"
}
]
}
</script>
The name, address and people here are invented. Use your own real details, and only list profiles
in sameAs that you actually control.
The properties that carry identity
| Property | On | Why it matters for AI answers |
|---|---|---|
@id | Every node | Lets every page refer to the same business and the same people, rather than creating new copies. |
name, alternateName | Organization | The registered or full name, plus the short name people actually use. Helps separate you from similarly named firms. |
url, logo | Organization | Ties the entity to your official website and brand image. |
sameAs | Organization, Person | Lists official profiles elsewhere, so they can be connected to you instead of treated as separate entities. |
address, telephone | Organization or LocalBusiness | Must match your Business Profile and directories exactly; mismatches are a common source of wrong facts. |
author | Article, BlogPosting | Points to a Person node, not a bare string, so the author can be identified across pages. |
jobTitle, worksFor | Person | States the author's role and links them to the business. |
datePublished, dateModified | Article | Gives a clear date, which matters when facts change. Must match the visible dates. |
Properties such as knowsAbout are valid schema.org and can describe specialisms, but
there is no public evidence that assistants give them special weight. Add them if they are accurate;
do not expect them to change results on their own.
The fix, step by step
Step 1
List the entities your site needs to identify
Write down the things an assistant should recognise: the business itself, each separate location if you have several, the people who write or are quoted on your pages, your main products or services, and the website. For each, note its exact official name, its main page on your site and any official profiles elsewhere. This list becomes the plan for your markup and stops you describing the same entity differently in different places.
Step 2
Give each entity one stable @id
Choose
an identifier for each entity from your list, based on the URL of its main page plus a fragment, such
as https://www.example.co.uk/#organization for the business and https://www.example.co.uk/about/sam-carter/#person
for an author. Use exactly the same string on every page, including the protocol, the www and the trailing
slash. The identifier does not need to load anything; it only needs to be unique and never change.
Step 3
Build a complete Organization node
Give
the Organization, or the more specific LocalBusiness type if you serve customers at an address, its full
name, a url, a logo, a one-sentence description of
what you do and, where relevant, address and telephone. Add sameAs
links to the profiles you control, such as LinkedIn, Facebook and trade directories. Output this node
on every page, or at least the home page, and refer to it by its @id everywhere else.
Step 4
Mark up authors as Person entities
Create
a short profile page on your site for each person who writes or reviews content, stating their role and
relevant experience in plain words. On that page, output a Person node with name, jobTitle,
url, worksFor pointing to the Organization @id, and sameAs
links to their professional profiles if they are happy for those to be public. Use the same Person @id
in every article they write.
Step 5
Connect articles to their author and publisher
In the Article or BlogPosting markup on each content page, set author
to the Person @id and publisher to the Organization @id instead
of plain text names. Add headline, datePublished, dateModified
and mainEntityOfPage pointing to the WebPage node. For service and product pages that are
not articles, link the WebPage to the Organization with publisher or about
so every page connects back to the business.
Step 6
Check that markup and visible text agree
Compare each value in the markup with what a reader sees. The business name, address and phone number must match the footer and contact page. The author named in markup must be the author shown on the page. Dates must match the visible published and updated dates. Where they differ, correct the source of the wrong value, which is often a plugin setting, rather than hiding the difference. Conflicting information is worse than none, because it creates the confusion you are trying to prevent.
Step 7
Remove duplicate and conflicting blocks
View the page source and search for application/ld+json. If the theme, an
SEO plugin and a reviews app each output their own Organization, keep the one that sits in the connected
graph and switch the others off in their settings. Then paste the live URL into the Schema Markup Validator
and the Rich Results Test, confirm there are no errors and that only one Organization and one Article
appear, and repeat for a page of each template.
Finding what your site outputs now
Most sites already have some markup, and most of the work is tidying it rather than starting again. Check a small sample: the home page, the about or contact page, one service or product page and one blog post.
- Count the blocks. In the page source, count
application/ld+jsonscripts. More than one is fine if they refer to each other by@id; separate unconnected blocks are the problem. - Look for plain-text authors.
"author": "Sam"or"author": {"@type": "Person", "name": "Admin"}tells a machine almost nothing. "Admin" is a common default in WordPress. - Compare names. Does the Organization name in markup match the name on your Business
Profile and invoices? Trading names and registered names often differ; use
legalNamefor the registered one. - Check dates. Some themes set
dateModifiedto the current time on every page load, which makes every page look freshly updated and the date meaningless.
Platform notes
WordPress
Yoast SEO and Rank Math both output a connected graph with @id values already. The common
gaps are settings, not code: the site representation set to a Person when it should be an Organization,
no logo, empty social profile fields, and authors left as "admin". Fill in the Organization details in
the plugin's site settings and each author's user profile. Avoid adding a second schema plugin, which
usually creates duplicate nodes.
Shopify
Themes output their own Organization and Product markup, and many apps add more. Check the theme's
theme.liquid and product templates for JSON-LD, and each installed SEO or review app's settings,
then choose one source for the Organization. If you add a blog author graph by hand, reference the same
Organization @id the theme uses rather than creating a new one.
Custom and static sites
Generate the graph in one shared template or component, fed by one configuration file holding the
business details and one data file for authors. Build the JSON with a proper encoder, such as json_encode()
in PHP or JSON.stringify() in JavaScript, so a quote mark in a name can never break the
block.
Keeping it accurate
- One source of business details. Store the name, address, phone and profiles once and output them everywhere from there, so a change of address updates the site and the markup together.
- Review after plugin and theme updates. Updates are the usual cause of a new duplicate Organization or a reset author setting.
- Add new authors properly. Create the profile page and Person node when someone starts writing, not months later.
- Remove leavers carefully. Keep the profile of a former author if their articles remain, updated to say they have left, so the articles still point to a real page.
For assistants stating wrong facts about your business, see fixing wrong attribution. For the wider schema checks, see the AI Schema guide.
1. Does schema markup help my site get cited by ChatGPT or Perplexity?
There is no public confirmation that either assistant reads JSON-LD directly when choosing sources, so nobody can promise that. What schema does is state clearly who the business is, who wrote each page and when it changed, in a form search engines use. That supports correct identification and fewer wrong facts. The pages that get quoted still need a clear, visible answer, because assistants quote the text readers see, not the markup behind it.
2. What is an @id and why does it matter?
An @id is an identifier you give to an entity in your markup, usually your page URL plus a fragment such as #organization. When the same @id is used on every page, search engines can see that every mention refers to the same business or the same author, rather than a series of separate, slightly different ones. It does not need to load a real page. It just needs to be unique to that entity and never change.
3. Should I use Organization or LocalBusiness?
Use LocalBusiness, or one of its more specific subtypes such as a trade or shop type, when customers visit you at an address or you serve a defined local area from one. Use Organization for businesses without a public location, such as online-only firms. LocalBusiness is a kind of Organization, so it carries all the same identity properties. Whichever you choose, give it one @id and use it consistently across the whole site.
4. What should I put in sameAs?
Links to official profiles about the same entity that you control or that clearly represent you, such as your LinkedIn company page, Facebook page, trade association listing or Wikidata item if one exists. Do not add links to pages that merely mention you, such as news articles or review pages, and do not add profiles you do not own. Each sameAs link should be a page about exactly the same business or person as the node it sits on.
5. Do I need author markup if we are a small business?
It is worth doing if your site has advice or blog content, because it tells machines who is behind the information and connects that person to your business. It does not need to be elaborate. A short profile page stating the person's role and experience, with a matching Person node linked from each article, is enough. For pages with no individual author, such as service pages, linking the page to the Organization is sufficient.
6. Is knowsAbout worth adding for AI search?
knowsAbout is a valid schema.org property for describing what an organisation or person has expertise in, and adding accurate values does no harm. However, there is no public evidence that AI assistants give it particular weight when choosing sources, so it should not be treated as a ranking or citation lever. Put your effort first into the properties that establish identity, such as name, url, sameAs and author links, then add knowsAbout if it fits.
7. How do I test entity markup that the Rich Results Test ignores?
Use the Schema Markup Validator at validator.schema.org, which shows every type and property it finds, including Organization and Person nodes that do not produce a Google rich result. Paste the live URL, expand the graph and check that each entity appears once, that references by @id resolve to the right node, and that the values match the visible page. Use the Rich Results Test alongside it for types such as Article that Google does report.
The AI Visibility Tracker asks AI assistants the questions your customers ask and records whether your brand is cited, mentioned, recommended or missing, so you can see where identity problems show up and track progress over time.
Open AEO Fixes โ