How to write and validate schema markup for AEO
Put a JSON-LD block written in schema.org vocabulary in the page HEAD. Use BlogPosting, FAQPage, and BreadcrumbList together on content articles, and place Organization, WebSite, and Service (or Product) site-wide on a company site. JSON-LD is the only implementation format you need. Microdata and RDFa are also in the standards documents, but there's no reason to use them on a newly built site.
Instead of summarizing a whole page, AI search picks out only the fragments of fact it will use in an answer. For that excerpt to be accurate, the page has to mark, in a form machines can read, "this is the publisher, this is the question, this is the answer, this is the price." Schema markup is that marking.
Why does AEO need schema?
Schema is the minimum condition for becoming a citation candidate. When ChatGPT or Perplexity builds an answer, it chooses which sentences on a page to cite. With plain HTML alone, nothing in the tags marks which question this Q&A answers, who the publisher is, or what the product costs, so the basis for choosing is hazy.
In a controlled experiment Search Engine Land ran in September 2025, a case was reported in which, of two pages with the same content, only the one with properly written JSON-LD appeared in Google AI Overviews. When you open pages with a citation rate of 0 on a category's main prompts, most either have no schema or have schema whose company information is inconsistent from page to page.
Adding schema doesn't automatically get you into answers. Without schema you're left out of the candidates; with it, you become one. Which of the candidates actually appear is decided by how well the content answers the question and how trustworthy the company is.
BlogPosting, FAQPage, and BreadcrumbList for content articles
Put all three types together on a single blog or guide page. The signals the three types handle don't overlap, so if you add only one, the other signals are missing.
| Type | Signal handled | Fields you must fill |
|---|---|---|
| BlogPosting | Who wrote the article, when, and on what topic | headline, datePublished, dateModified, author, publisher, mainEntityOfPage |
| FAQPage | The question–answer pairs on this page | Question inside mainEntity[] → acceptedAnswer(Answer) |
| BreadcrumbList | The article's location within the site | position, name, item of itemListElement |
Don't leave dateModified empty. AI answers tend to give citation priority to recent articles, so an article that looks years old is at a disadvantage to that extent. Even if you didn't substantially rewrite the text, if you reviewed the content again, update the date to the day you reviewed it.
Of the three types, FAQPage has the most direct AEO effect. If you follow schema.org's FAQPage definition, putting Question items in the mainEntity array and connecting an acceptedAnswer to each Question, each question-and-answer pair takes the form of an answer AI can take and use as is. Google Search Central's FAQPage documentation requires you to mark up only Q&A actually visible in the body text. Putting a question that isn't on the screen only in the schema is a policy violation.
BreadcrumbList is the value AI engines use to understand a site's structure and Google's desktop search results use to show where a page sits within the site. You only need to write position, name, and item in order, so it pays off well for the effort.
On PION's own blog, all three types are added automatically when a post is published. When the FAQ in the body is wrapped in a className="faq-section" container, the builder extracts the questions and answers and adds FAQPage JSON-LD to the page.
Organization, WebSite, and Service/Product for company sites
Key pages such as the home, about, services, and products pages get a separate schema that registers the company as a single entity. It's a layer placed across the whole site, separate from the schema on individual articles.
The field to pay most attention to in Organization is sameAs. Most sites fill in name, url, logo, and description. If the sameAs array is empty, AI has no basis for checking whether "the company at getpion.com" and "the company on LinkedIn and in press coverage" are the same, so the company name wavers when it's cited. Even if you link LinkedIn, Crunchbase, and articles, it has no effect if the company name, domain, and logo differ across the linked pages. sameAs works when the company appears consistently under the same name elsewhere on the web.
WebSite is metadata for the domain itself, and the publisher connection ties it to the BlogPosting of individual articles. The sitelinks search box that SearchAction used to trigger in search results was removed by Google starting in November 2024, and WebSite structured data is still used to display site names.
Whether to use Service or Product depends on your business model. A marketing agency like PION uses Service; an e-commerce brand that sells goods uses Product. For a brand using Product to be cited for a prompt like "how much is the cream," it has to fill in everything through sku, brand, offers, and aggregateRating. With Service, include provider (a reference to Organization), areaServed, serviceType, and hasOfferCatalog.
Where on the page does JSON-LD go?
JSON-LD usually goes in the page HEAD. It also works at the end of the BODY, but in the HEAD the crawler picks up the metadata first, at the start of the document. If a page has several schemas, combine them into a graph or add a separate <script type="application/ld+json"> block for each type.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "How do I apply schema markup for AEO?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Insert a JSON-LD block into the page HEAD and ..."
}
}
]
}
</script>
Follow these rules in day-to-day operation.
- Text in the schema = text in the on-screen body. Putting a sentence that isn't in the body only in the schema violates Google's policy and draws a penalty.
- Link entities to each other with @id. When Organization, WebSite, BlogPosting, and Person reference each other via @id, AI engines recognize the whole site as a connected set of entities. Without references, they treat the pages of the same site as separate, unconnected pages.
Validation steps before deployment
Once you've written the schema, run it through both tools before deploying. The two tools check different things, so one alone isn't enough.
- Google Rich Results Test shows the rich result types Google recognizes, along with errors and warnings, when you enter a URL or code snippet. It checks whether the markup meets Google's display policies.
- Schema.org Markup Validator checks the grammar of the standard vocabulary itself. It catches vocabulary errors the Rich Results Test misses.
Passing both tools means the grammar is correct; whether the page is actually cited is measured separately. Once the fixes PION proposed have been applied to a client site, PION checks the site with both tools, then enters a category's main prompts into AI engines (ChatGPT, Gemini, Google AI Overviews, and AI Mode) and measures how the citation rate moves. Schema isn't reflected right away but enters the next indexing cycle, so PION's standard procedure is to measure again on a set schedule.
Frequently asked questions
How do I apply schema markup for AEO?
Apply it by putting a JSON-LD block in the page HEAD. Use BlogPosting + FAQPage + BreadcrumbList together on content articles, and place Organization + WebSite + Service (or Product) site-wide. The text in the schema must exactly match the on-screen body text, and you deploy only after passing both the Google Rich Results Test and the Schema.org Validator.
How do I write the FAQPage, Product, and Organization schemas?
For FAQPage, put Question items in the mainEntity array and connect an acceptedAnswer(Answer) to each Question. For Product, you have to fill in everything through sku, brand, offers, and aggregateRating to be cited in answers about price or ratings. For Organization, fill in name, url, logo, description, sameAs, founder, and foundingDate, and link external pages such as LinkedIn, Crunchbase, and press coverage in sameAs to tell AI they're the same company.
Do I have to write schema markup only in JSON-LD?
For a new site in 2026, JSON-LD alone is enough. Microdata and RDFa are also part of the schema.org standard, but Google treats JSON-LD as its recommended format, and they're rarely used on new sites. Because JSON-LD is a script block separate from the HTML body, it also has the advantage of carrying the lowest risk of the schema breaking when you edit content.
If I apply schema markup, will my content appear in AI answers right away?
Not right away. Schema is a condition for becoming a citation candidate; actual visibility is decided by how well the content answers the question, the trustworthiness of the company entity, and the site's authority. How soon schema changes show up in AI answers depends on the industry and the question, so PION keeps measuring on a set schedule even after the schema is deployed, to capture the change.
Where do I validate schema markup?
Use two tools: the Google Rich Results Test and the Schema.org Markup Validator. The Rich Results Test checks against Google's display policies, and the Markup Validator checks the grammar of the schema.org standard vocabulary. Deploy after resolving all errors and warnings from both tools, and check again that the text in the schema matches the on-screen body text.
- Category
- Guide
- Tag
- #Guide #Technology