field note
first published 2026-10-09
Schema markup in 2026: build the entity graph, not the plugin output
What schema markup is, what it does and doesn't do for rankings, why most sites' structured data is a scatter of islands no machine can join, and how to write one connected graph that Google and the AI engines can read, validate and trust.
1,155 words · 5 min read · structured data
Most websites have structured data in the same way most houses have a drawer of cables: a plugin put some there, nobody knows what it connects to, and it has never once been used. The markup validates, more or less. It describes an Article on one page and an Organization on another and a FAQPage on a third, and nothing says those three things belong to the same business.
Machines do not want a drawer of cables. They want a graph.
What schema markup is, and what it is for
Schema markup is a page's description of itself in a vocabulary machines share. The vocabulary is schema.org; the delivery is almost always a JSON-LD script in the page. A Person has a name, a jobTitle, an address, a list of sameAs profiles. An Article has a headline, a datePublished and an author. The point is that a search engine, or an AI model deciding whether to cite you, can read facts instead of inferring them from the prose and the layout.
Two uses, and they are different. The first is rich results: Google uses specific types to decorate listings with stars, prices, FAQs and breadcrumbs. That is the use most people mean, it is well documented, and it is narrower than the marketing suggests. The second is entity understanding: the machine working out who is speaking and whether the facts hold up. That use has grown enormously since the answer engines arrived, and it is the one most sites get wrong.
Islands versus a graph
Here is the drawer of cables, as a typical plugin emits it: an Organization block on the homepage with a logo; an Article block on each post with an author that is a bare string; a FAQPage block wherever the editor ticked a box; a BreadcrumbList everywhere. Four types, no relationships. The author string does not point at the organisation. The organisation does not list the site's profiles. Nothing has an @id, so nothing can be referred to.
Here is the graph. One Person or Organization is the root, with a stable @id such as https://example.com/#org. The WebSite names it as publisher. Every Article names the same @id as author and publisher. Every Service or Product names it as provider or brand. The root carries sameAs links to the profiles that say the same thing elsewhere: LinkedIn, the company register, the industry body. Now a machine reading any page can walk to the entity behind it, and from there to everything else the site says, and check that it all agrees.
The difference is not cosmetic. When three small businesses on three platforms came to me with "schema issues", the fix on each was the same: delete the islands, write one connected graph, validate to zero errors. Framer, Elementor and Beaver Builder each needed a different way of injecting the script. The graph itself was identical in shape.
What the markup must never do
Describe what is not on the page. A Product price the page does not show, an aggregateRating with no reviews a human can see, a FAQPage whose questions appear nowhere in the copy. Google's guidelines call this out, the validators cannot catch it, and the AI engines increasingly cross-check. Markup that contradicts the page is worse than no markup, because it gives a machine a reason to distrust everything else you say.
Disagree with itself. One founding year in the Organization, another in the about page, a third in the footer. A Person whose jobTitle says one thing and whose LinkedIn says another. The sites being deposed by agents, which I wrote about earlier this year, fail on exactly this kind of inconsistency.
Stack types for the sake of it. Twelve blocks on a homepage is not thoroughness. A machine spends its effort reconciling them and finds nothing to reconcile them to.
A graph you can copy
The site you are reading serves this on every page, in one script in the head. Simplified:
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Person",
"@id": "https://jamiemckaye.com/#jamie",
"name": "Jamie McKaye",
"jobTitle": "Technical SEO consultant & full-stack developer",
"url": "https://jamiemckaye.com",
"address": { "@type": "PostalAddress", "addressLocality": "Hersham", "addressRegion": "Surrey", "addressCountry": "GB" },
"sameAs": ["https://www.linkedin.com/in/jamieseo", "https://x.com/jamiemckaye", "https://medium.com/@jmckaye"]
},
{
"@type": "WebSite",
"@id": "https://jamiemckaye.com/#site",
"url": "https://jamiemckaye.com",
"name": "jamiemckaye.com",
"publisher": { "@id": "https://jamiemckaye.com/#jamie" }
}
]
}
Each piece of writing then adds an Article whose author and publisher are { "@id": "https://jamiemckaye.com/#jamie" }, and each service page adds a Service whose provider is the same reference. Nothing is repeated; everything points home. Pages that genuinely answer questions add a FAQPage built from the same question list the page renders, so the two cannot drift apart.
If you are on WordPress, the better plugins can be configured to emit something close to this; the worse ones cannot, and a short custom snippet in the theme's head beats them. On Shopify and most builders, a theme-level script with the root entities and per-template additions does the job. The platform is rarely the obstacle. The decision to have one graph is.
How to check it, honestly
- Validate. The schema.org validator for correctness, Google's Rich Results Test for eligibility. Zero errors, and read the warnings.
- Read it against the page. Every fact in the markup should be visible on the page. Every important fact on the page should be in the markup. The exercise takes ten minutes and finds the price that changed in March.
- Walk the graph. From any page, can you follow
@idreferences to the root entity and from there to the profiles? If a reference points at an@idthat no block defines, the graph is broken, and the validators will not tell you. - Fetch it as a machine. The JSON-LD has to be in the HTML the crawler receives. A plugin that injects it with JavaScript after load serves it to browsers and to Google's renderer eventually, and to the AI crawlers never. Check the raw response.
- Grade it. The Agent-Ready Grader on this site reads structured data as one of its weighted categories and is specific about dangling references and islands. It is free, and it is the same instrument I run for clients.
Why this matters more than it did
For a decade, structured data was a rich-results feature with a modest ceiling: do it right and get stars; do it wrong and get nothing. The answer engines moved the ceiling. ChatGPT, Perplexity and Google's own AI features decide what to cite by working out who is behind a page and whether the page can be trusted, and a connected graph is the cheapest, clearest way a site has of answering both questions. The sites that treat it as a plugin checkbox are legible to a 2019 crawler. The sites that treat it as the entity's description of itself are legible to whatever reads them next.
asked straight — answered straight
01What is schema markup?
Structured data added to a page, almost always as JSON-LD, that describes the things the page is about in a vocabulary machines share: an Organization, a Person, a Product, an Article, a FAQ. It lets a search engine or an AI model read facts without guessing them from the prose.
02Does schema markup improve rankings?
Not directly, and Google has said so for years. It makes pages eligible for rich results, and it makes the entities behind a page clearer, which matters more now that AI engines cross-check what they cite. Treat it as legibility, not a lever.
03Which schema types should a business website use?
Organization or Person at the root, WebSite, WebPage for the pages, Service or Product for what you sell, Article for what you write, FAQPage where you genuinely answer questions, and LocalBusiness if you serve an area. Fewer types, properly linked, beat every type a plugin can emit.
04How do I check my schema markup?
Run the page through Google's Rich Results Test for eligibility and the schema.org validator for correctness, then read the output against the page. Zero errors is the floor. The real test is whether the graph says what the page says, with nothing invented and nothing missing.
next step — ai search optimisation
AI search optimisation as engineering.
Make your site legible to ChatGPT, Perplexity and AI Overviews — then measure it. Send a brief — a few lines about the site, the problem and the evidence you have — and the reply is a straight read on fit and shape, from the person who does the work.
no forms · no funnels · jamie@jamiemckaye.com

written by
Technical SEO consultant and full-stack developer in Hersham, Surrey, in practice since 2007. One person, no handoffs: the audits, the code and the writing come from the same pair of hands. This site is the working proof — it grades itself on the same instrument it runs for clients.