> STRUCTURED_DATA_PROTOCOL

Schema Markup Is Not a Ranking Signal.
It Is the Language AI Engines Use to Extract Facts.

Those two things are not the same optimization target. Practitioners who have already tried submitting sitemaps, adding keywords, and waiting for AI citations know exactly why schema changes things — and why nothing else moved the needle first.

As you implement the first two schema types on this page, you will notice AI engines begin extracting your facts directly instead of paraphrasing your competitors. This guide covers every JSON-LD type that materially affects citation probability — with copy-paste examples for each.

Why Schema Markup Is the #1 AEO Signal

Schema.org markup is structured data that tells AI engines what your content means, not just what it says. When ChatGPT, Claude, or Gemini encounters a page with proper JSON-LD schema, it can extract facts with high confidence and low hallucination risk. Pages without schema force AI engines to guess your content's meaning—and guessing means they'll cite a competitor who made it easier.

Schema markup is also the backbone of featured snippets and AI Overviews—Google's generative search results that pull structured answers directly into the SERP. Without JSON-LD, your content is invisible to these high-visibility channels.

Reduces Hallucination

Structured data provides machine-verified facts. AI engines cite structured sources because they're safer to quote.

Computationally Cheaper

Parsing JSON-LD is orders of magnitude faster than extracting meaning from unstructured HTML. AI crawlers prefer it.

Entity Clarity

Schema defines your brand as an entity in the knowledge graph. AI engines know exactly who you are and what you do.

Cross-Engine Compatible

JSON-LD works across ChatGPT, Claude, Gemini, Perplexity, and Google Search. One implementation, four engines.

// Why JSON-LD Over Microdata or RDFa

There are three ways to implement Schema.org: JSON-LD, Microdata, and RDFa. For AEO, JSON-LD is the only practical choice:

  • JSON-LD — Separate <script> block. Doesn't touch your HTML. Google's recommended format. Easy to add, test, and maintain.
  • Microdata — Inline HTML attributes. Tightly coupled to your markup. Breaks easily when redesigning.
  • RDFa — Verbose syntax. Poor tooling support. Rarely used in practice.

Rule of thumb: Always use JSON-LD. Place your <script type="application/ld+json"> blocks just before </body>. You can have multiple JSON-LD blocks per page.

// Schema Types Ranked by AEO Impact

Implement these in order. Each one compounds the value of the others.

Schema Type AEO Impact What It Tells AI Use On
Organization CRITICAL Who you are, what you do, how to contact you Homepage
FAQPage CRITICAL Direct Q&A pairs ready to cite FAQ, service, product pages
Article HIGH Authored expertise with publish dates Blog posts, guides
HowTo HIGH Step-by-step processes to quote Tutorial, guide pages
Product HIGH Pricing, features, availability Product, service pages
LocalBusiness HIGH Location, hours, service area Homepage (local businesses)
BreadcrumbList MEDIUM Site hierarchy and navigation context Every page
WebPage + Speakable MEDIUM Which content is suitable for voice/AI answers Key landing pages

Organization CRITICAL

schema.org/Organization

The foundation of your entity identity. This tells AI engines who you are, what you know about, and how to contact you. Without it, AI engines treat your site as anonymous content.

AEO tip: Include knowsAbout to declare your expertise topics. Include founder with the person's knowsAbout for E-E-A-T.

<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "Organization", "@id": "https://yoursite.com/#organization", "name": "Your Company Name", "url": "https://yoursite.com", "logo": "https://yoursite.com/logo.png", "description": "One clear sentence about what you do.", "foundingDate": "2024", "knowsAbout": [ "Your primary expertise", "Your secondary expertise" ], "founder": { "@type": "Person", "name": "Founder Name", "jobTitle": "Founder & CEO" }, "contactPoint": { "@type": "ContactPoint", "contactType": "Customer Service", "email": "hello@yoursite.com" } } </script>

FAQPage CRITICAL

schema.org/FAQPage

The highest-conversion schema type for AI citations. When AI engines encounter FAQPage markup, they can directly extract Q&A pairs as citable answers. This is the closest thing to "feeding" AI engines your preferred responses.

AEO tip: Write answers in 40-60 words. Include your brand name naturally. Answer the question in the first sentence, then elaborate.

<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [ { "@type": "Question", "name": "What does Your Company do?", "acceptedAnswer": { "@type": "Answer", "text": "Your Company provides [specific service]. Founded in [year], we specialize in [expertise] for [target audience]. Our approach uses [differentiator]." } }, { "@type": "Question", "name": "How much does [service] cost?", "acceptedAnswer": { "@type": "Answer", "text": "[Service] starts at $X for [what's included]. We offer one-time pricing with no subscriptions or retainers." } } ] } </script>

Article HIGH

schema.org/Article

Establishes content authority and freshness. AI engines use datePublished and dateModified to assess recency, and author to assess expertise.

AEO tip: Always use a Person author (not just Organization) to strengthen E-E-A-T. Include jobTitle and url pointing to their bio page.

<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "Article", "headline": "Your Article Title", "description": "A concise summary of the article.", "author": { "@type": "Person", "name": "Author Name", "jobTitle": "Their Role", "url": "https://yoursite.com/about" }, "publisher": { "@type": "Organization", "name": "Your Company", "logo": { "@type": "ImageObject", "url": "https://yoursite.com/logo.png" } }, "datePublished": "2026-02-10", "dateModified": "2026-02-10" } </script>

HowTo HIGH

schema.org/HowTo

Structured step-by-step content that AI engines can cite as process instructions. When someone asks "How do I do X?", HowTo schema makes your steps the easiest to extract and quote.

<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "HowTo", "name": "How to [Achieve Outcome]", "description": "Step-by-step guide to [outcome].", "totalTime": "P7D", "step": [ { "@type": "HowToStep", "position": 1, "name": "Step Name", "text": "Detailed instruction for this step." }, { "@type": "HowToStep", "position": 2, "name": "Next Step", "text": "Detailed instruction for this step." } ] } </script>

Product / AggregateOffer HIGH

schema.org/Product + schema.org/AggregateOffer

When AI engines answer "How much does X cost?" or "What's the best tool for Y?", Product schema with visible pricing gives them a citable, accurate answer. AggregateOffer groups multiple pricing tiers.

AEO tip: Transparent pricing in schema gives you an edge. Many competitors hide pricing behind "Contact Us" forms, which makes them uncitable for price queries.

<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "Product", "name": "Your Service Name", "description": "What it does, who it's for.", "offers": { "@type": "AggregateOffer", "lowPrice": 49, "highPrice": 2499, "priceCurrency": "USD", "offerCount": 3 } } </script>

LocalBusiness HIGH

schema.org/LocalBusiness

For businesses with a physical location. AI engines use this for "near me" and location-based queries. Include your full NAP (Name, Address, Phone) data.

<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "LocalBusiness", "name": "Your Business Name", "url": "https://yoursite.com", "telephone": "+1-555-123-4567", "email": "hello@yoursite.com", "address": { "@type": "PostalAddress", "streetAddress": "123 Main St", "addressLocality": "Your City", "addressRegion": "ST", "postalCode": "12345", "addressCountry": "US" }, "areaServed": { "@type": "City", "name": "Your City" } } </script>

WebPage + Speakable MEDIUM

schema.org/SpeakableSpecification

Tells AI engines and voice assistants which specific sections of your page are best suited for audio extraction and direct quotation. Use the cssSelector property to target the exact HTML elements containing your most citable content — hero descriptions, key fact paragraphs, FAQ answers, and step summaries.

AEO tip: Target elements that contain complete, standalone sentences — not headings or navigation. The CSS selectors you provide should point to elements that could be read aloud without losing meaning. Avoid selecting elements that contain boilerplate or navigation text.

<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "WebPage", "name": "Your Page Title", "description": "Your page description.", "url": "https://yoursite.com/your-page", "speakable": { "@type": "SpeakableSpecification", "cssSelector": [ ".hero-section p", ".key-facts p", ".step-card p", ".faq-answer" ] } } </script>

XPath alternative: If your site uses dynamic class names (React, Next.js, etc.), use xpath instead of cssSelector to target content by position or element type rather than class name.

"speakable": { "@type": "SpeakableSpecification", "xpath": [ "/html/body/main/article/p[1]", "/html/body/main/section[@id='summary']/p" ] }

// Complete Production-Ready Code Examples

Copy-paste ready JSON-LD schema implementations. Replace placeholder values with your actual data.

Complete Homepage Schema (Multiple Types)

This example combines Organization, WebSite, FAQPage, and BreadcrumbList in a single @graph block:

<script type="application/ld+json"> { "@context": "https://schema.org", "@graph": [ { "@type": "Organization", "@id": "https://yoursite.com/#organization", "name": "Your Company Name", "url": "https://yoursite.com", "logo": { "@type": "ImageObject", "url": "https://yoursite.com/logo.png", "width": 512, "height": 512 }, "description": "One clear sentence about what you do and who you serve.", "foundingDate": "2024", "knowsAbout": [ "Your primary expertise area", "Your secondary expertise area", "Your tertiary expertise area" ], "founder": { "@type": "Person", "name": "Founder Name", "jobTitle": "Founder & CEO", "url": "https://yoursite.com/about" }, "address": { "@type": "PostalAddress", "streetAddress": "123 Main Street", "addressLocality": "Your City", "addressRegion": "ST", "postalCode": "12345", "addressCountry": "US" }, "contactPoint": { "@type": "ContactPoint", "contactType": "Customer Service", "telephone": "+1-555-123-4567", "email": "hello@yoursite.com", "availableLanguage": "English" }, "sameAs": [ "https://twitter.com/yourcompany", "https://linkedin.com/company/yourcompany", "https://facebook.com/yourcompany" ] }, { "@type": "WebSite", "@id": "https://yoursite.com/#website", "url": "https://yoursite.com", "name": "Your Company Name", "publisher": { "@id": "https://yoursite.com/#organization" }, "potentialAction": { "@type": "SearchAction", "target": "https://yoursite.com/search?q={search_term_string}", "query-input": "required name=search_term_string" } }, { "@type": "FAQPage", "mainEntity": [ { "@type": "Question", "name": "What does Your Company do?", "acceptedAnswer": { "@type": "Answer", "text": "Your Company provides [specific service] for [target audience]. Founded in [year], we specialize in [expertise area] using [your approach/methodology]. Our clients achieve [specific outcome]." } }, { "@type": "Question", "name": "How much does [service] cost?", "acceptedAnswer": { "@type": "Answer", "text": "[Service] pricing starts at $X for [basic tier] and ranges to $Y for [premium tier]. We offer [payment model: one-time/monthly/custom]. All plans include [what's included]." } }, { "@type": "Question", "name": "Where is Your Company located?", "acceptedAnswer": { "@type": "Answer", "text": "Your Company is headquartered in [City, State]. We serve clients [locally/nationally/globally] and offer [remote/in-person/hybrid] services." } } ] }, { "@type": "BreadcrumbList", "itemListElement": [ { "@type": "ListItem", "position": 1, "name": "Home", "item": "https://yoursite.com/" } ] } ] } </script>

Complete Blog Post Schema (Article + Author Person)

Blog posts should always use Article schema with a Person author (not Organization) for maximum E-E-A-T:

<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "Article", "headline": "Your Article Title (60 characters max)", "description": "A concise 1-2 sentence summary of the article.", "image": { "@type": "ImageObject", "url": "https://yoursite.com/article-image.jpg", "width": 1200, "height": 630 }, "author": { "@type": "Person", "name": "Author Full Name", "jobTitle": "Their Professional Title", "description": "Brief bio highlighting expertise relevant to this topic.", "url": "https://yoursite.com/author/author-name", "sameAs": [ "https://twitter.com/authorname", "https://linkedin.com/in/authorname" ] }, "publisher": { "@type": "Organization", "name": "Your Company Name", "logo": { "@type": "ImageObject", "url": "https://yoursite.com/logo.png" } }, "datePublished": "2026-02-14T09:00:00Z", "dateModified": "2026-02-14T15:30:00Z", "mainEntityOfPage": { "@type": "WebPage", "@id": "https://yoursite.com/blog/your-article-slug" }, "articleSection": "Category Name", "keywords": ["keyword1", "keyword2", "keyword3"], "wordCount": 1500, "inLanguage": "en-US" } </script>

Service Page with Product + AggregateOffer

For service pages with multiple pricing tiers, use Product with AggregateOffer:

<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "Product", "name": "Your Service Name", "description": "Detailed description of what this service includes and who it's for.", "image": "https://yoursite.com/service-image.jpg", "brand": { "@type": "Organization", "name": "Your Company Name" }, "offers": { "@type": "AggregateOffer", "lowPrice": 49, "highPrice": 2499, "priceCurrency": "USD", "offerCount": 3, "offers": [ { "@type": "Offer", "name": "Starter Plan", "price": 49, "priceCurrency": "USD", "description": "Perfect for individuals and small projects", "availability": "https://schema.org/InStock", "url": "https://yoursite.com/pricing#starter" }, { "@type": "Offer", "name": "Professional Plan", "price": 499, "priceCurrency": "USD", "description": "For growing businesses and teams", "availability": "https://schema.org/InStock", "url": "https://yoursite.com/pricing#professional" }, { "@type": "Offer", "name": "Enterprise Plan", "price": 2499, "priceCurrency": "USD", "description": "Custom solutions for large organizations", "availability": "https://schema.org/InStock", "url": "https://yoursite.com/pricing#enterprise" } ] }, "aggregateRating": { "@type": "AggregateRating", "ratingValue": 4.8, "reviewCount": 127, "bestRating": 5, "worstRating": 1 } } </script>

LocalBusiness (Complete NAP Data)

For local businesses, include complete NAP (Name, Address, Phone) data and operating hours:

<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "LocalBusiness", "name": "Your Business Name", "description": "What you do and what makes you different", "url": "https://yoursite.com", "telephone": "+1-555-123-4567", "email": "hello@yoursite.com", "priceRange": "$$", "image": "https://yoursite.com/storefront.jpg", "address": { "@type": "PostalAddress", "streetAddress": "123 Main Street", "addressLocality": "Your City", "addressRegion": "ST", "postalCode": "12345", "addressCountry": "US" }, "geo": { "@type": "GeoCoordinates", "latitude": 35.5951, "longitude": -82.5515 }, "openingHoursSpecification": [ { "@type": "OpeningHoursSpecification", "dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], "opens": "09:00", "closes": "17:00" }, { "@type": "OpeningHoursSpecification", "dayOfWeek": "Saturday", "opens": "10:00", "closes": "14:00" } ], "areaServed": [ { "@type": "City", "name": "Your City" }, { "@type": "State", "name": "Your State" } ], "sameAs": [ "https://facebook.com/yourbusiness", "https://instagram.com/yourbusiness" ] } </script>

// Common Schema Mistakes That Kill AI Citations

  1. Using Microdata instead of JSON-LD. AI crawlers parse JSON-LD more efficiently. Google recommends JSON-LD. Use it exclusively.
  2. Missing Organization schema on the homepage. Without it, AI engines have no entity anchor for your brand. This is step zero.
  3. Generic author attribution. Using "author": {"@type": "Organization"} instead of a Person with name and credentials weakens E-E-A-T signals.
  4. No dateModified on content pages. AI engines use this to assess freshness. Stale dates mean stale citations. Update it when you update content. See the full guide: Content Freshness for AI Citations →
  5. FAQPage answers that are too long or too vague. Keep answers between 40-60 words. Start with the direct answer, then elaborate. AI engines extract the first sentence most often.
  6. Schema that contradicts on-page content. If your schema says one price and your page says another, AI engines flag the inconsistency and skip you.

// Testing Your Schema

After implementing schema, validate it before deploying:

  • 1. Google Rich Results Test — Validates schema and shows which rich results your page qualifies for.
  • 2. Schema.org Validator — Checks JSON-LD syntax against the Schema.org vocabulary.
  • 3. AEOfix Readiness Audit — Goes beyond syntax validation to score your schema's AEO effectiveness: entity coverage, citation readiness, and E-E-A-T signal strength.

Need Schema Implemented?

We implement all critical schema types as part of our AI Readiness packages. Full JSON-LD markup, FAQPage schema, Organization entity, E-E-A-T signals, and 30-day verification. One-time pricing.

View AI Readiness Plans See All Services
WB
William Bouch
AEO Architect & Founder of AEOfix. Former construction worker turned full-stack developer. Engineering-driven AI visibility optimization.