llmranks.io
Structured Data & Schema

AEO Markup Patterns

Answer engine optimization (AEO) markup works in two layers: the visible HTML structure that actually earns extraction, and the schema that supports…

6 min read · updated 2026-08-03

Answer engine optimization (AEO) markup works in two layers: the visible HTML structure that actually earns extraction, and the schema that supports eligibility and grounding. The visible layer matters more — structure your content so answers are self-contained, quotable chunks, then add schema to corroborate it. There is no single "AEO schema type"; the right pattern depends on your content type.

Why the visible layer beats schema

Schema helps with eligibility and grounding, but the structure that actually earns extraction is your visible HTML. Grade both layers, and give the visible one more weight. Engines reconstruct answers from the DOM they render, so proximity, ordinality, and clean atomic values do more work than any markup block.

Schema is corroboration, not a substitute. When you emit structured data, make it match what a reader sees on the page — otherwise it adds nothing. For the broader mechanics, see Structured Data & Schema and how markup relates to Rich Results vs LLM Citations.

FAQ blocks

Structure each question-and-answer pair as a self-contained, extractable chunk. The visible HTML matters more than the FAQPage schema.

  • Put the question in a heading element (<h2>/<h3>) with a stable id for fragment-anchored citation.
  • Place the answer in the immediately following sibling — no ads, CTAs, or wrapper divs breaking Q→A proximity.
  • Make the first sentence a complete, standalone answer, then add supporting detail.
  • Keep answers concise and standalone (roughly 40–80 words). This is an editorial heuristic, not a measured threshold — short complete answers get quoted; long multi-paragraph ones rarely get quoted whole.
  • Avoid <details>/<summary> accordions where the answer is display:none by default; some retrievers down-weight collapsed content. If you must use accordions, keep the text in the server HTML and not hidden/aria-hidden at render.

Emit FAQPage schema only when the page is genuinely Q&A-dominant. Never blanket-apply it.

Comparison tables

Comparison queries ("X vs Y", "best X for Y") are where AI engines extract aggressively, and tables are the most quotable structure. There is no dedicated schema.org "comparison" type — be skeptical of any tool claiming otherwise. The visible table is the actual lever.

  • Use a real <table>, not CSS-grid <div>s. Engines reconstruct row/column relationships from <th scope="row">, scope="col">, and <caption>. Div-grids serialize as flat token soup and lose the matrix.
  • Write one <caption> that names the compared subjects explicitly — it becomes the answer's framing sentence.
  • Keep cell values atomic ("$29", "Yes", "10"), not paragraphs. If a cell needs explanation, link out to an anchored section.
  • Add a 2–3 sentence plain-text verdict before or after the table. Engines quote the verdict and reproduce the table.

For the schema layer, model each compared item as its own Product, SoftwareApplication, or Offer entity with shared property names, optionally wrapped as an ItemList. This corroborates but does not replace the visible table.

Definitions and glossary terms

Definitional queries are dominant in AI Overviews. The pattern engines reward is term → one-sentence canonical definition → expansion.

  • Write the definition as a complete predication: "X is a [category] that [distinguishing function]." That is the exact shape engines lift for "what is X" answers.
  • Put the term in a <dt> or heading, with the definition in the immediately adjacent <dd> or paragraph.
  • Avoid openers like "X refers to..." or "When it comes to X..." — these read poorly when quoted, and engines sometimes skip them. Lead with the term as the grammatical subject.
  • Bold the defined term on first use for visual and parsing salience.

For schema, use DefinedTerm within a DefinedTermSet, and reference Wikidata via sameAs for disambiguation. DefinedTerm produces no Google rich result, but it is clean grounding metadata and is parsed by entity-extraction pipelines. See Schema Types That Matter for how to choose among types.

How-to and procedural content

HowTo rich results are gone, so optimize for the visible numbered procedure that AI Overviews extract for "how to X" queries.

  • Use an ordered list <ol>, not paragraphs — ordinality is the signal.
  • Open each step with an imperative verb in bold (the action), then the detail. Engines extract the bolded action sequence as the answer skeleton.
  • State total time and required tools or materials in plain text before the list; AI Overviews surface these.
  • Add per-step id anchors for passage-level citation.
  • Keep each step to one action. "Press and hold, then wait, then reconnect" should be three steps.

HowTo markup remains valid syntax with no rich result, so it is optional. One exception: if your content is a recipe, use Recipe.recipeInstructions with HowToStep, which does still drive Recipe rich results.

Statistics and data citations

Engines preferentially cite pages that present discrete, attributable stats.

  • Write one stat per sentence: "73% of enterprises adopted RAG in 2025, according to the Example 2026 State of AI report."
  • Include the figure, the subject, the timeframe, and the source inline. This quadruple is what gets quoted with attribution to your domain.
  • Mark up the source as Claim/ClaimReview only in fact-check contexts — otherwise it is overkill. For ordinary stats, a <cite> element plus a linked source suffices.
  • Give tables of stats a <caption> naming the dataset and time period; they get cited as a unit.

Pros/cons and list content

For "best X" and "should I X" queries, use explicit structure engines can map to balanced answers.

  • Use <h3>Pros</h3> / <h3>Cons</h3> headings followed by <ul>.
  • Write each bullet as a complete clause, not a fragment ("Generous free tier with 1 user" beats "Free tier").
  • For listicles ("10 best X"), use an <h2> per item with the item name, model each as a list entry, and wrap the set in ItemList schema with position and url per ListItem. ItemList can drive carousel eligibility in some verticals and is cleanly extracted into ranked AI answers.

Pattern quick reference

Content typeVisible leverSchema layer
FAQHeading Q + adjacent standalone AFAQPage (Q&A-dominant only)
ComparisonReal <table> + caption + verdictPer-item Product/Offer, optional ItemList
DefinitionTerm → one-sentence definitionDefinedTerm + sameAs
How-to<ol> with bold imperativesHowTo (optional); Recipe for recipes
StatisticsFigure + subject + timeframe + source<cite>; ClaimReview only for fact-check
Lists / pros-cons<h2> per item, <ul> under headingsItemList with position, url

Validate whatever schema you emit — see Schema Validation Tools — and keep the structured data honest to the visible page. For where these patterns sit in the wider picture, see AEO & GEO.

What to do

  1. Audit each key page against its content type and confirm the visible HTML follows the pattern above before touching schema.
  2. Rewrite every answer, definition, and step so the first sentence is a complete, standalone statement.
  3. Convert any CSS-grid comparison layouts into real <table> markup with scope attributes and a naming <caption>, then add a plain-text verdict.
  4. Add stable id anchors to questions, steps, and glossary terms for passage-level citation.
  5. Apply schema that matches the content type — FAQPage only on genuine Q&A pages, DefinedTerm for glossaries, ItemList for ranked lists — and keep it consistent with the visible content.
  6. Rewrite stats to include the figure, subject, timeframe, and source in a single sentence.
  7. Validate all emitted structured data and remove any blanket-applied or mismatched markup.

save this card

AEO Markup Patterns — key takeaways cardDownload card

1080×1350 · post it anywhere

put it to work

See how ChatGPT, Gemini and Google AI actually talk about your brand.

Check your AI visibility — free
AEO Markup Patterns · LLMRanks