Technical AEO is the practice of implementing structured data — schema markup, JSON-LD, and AI-readable content patterns — so that AI systems like ChatGPT, Google AI Overview, and Perplexity can extract precise facts about your business and cite you in answers. Without structured data, AI systems have to guess what your business does, where you serve, and why you're credible. With it, you're handing them the answer. This guide covers exactly what to implement and how.
Why Structured Data Is the Foundation of AI Visibility
When ChatGPT or Google AI Overview generates a recommendation for "best HVAC company in Phoenix," it's not reading your homepage and inferring what you do. It's pulling from structured signals — machine-readable data that explicitly states your business name, service type, location, hours, ratings, and service area. That data comes from your schema markup, your Google Business Profile, your citations across directories, and the structure of your web content.
The gap between businesses that appear in AI answers and businesses that don't often isn't content quality or reputation — it's schema. A contractor with 80 Google reviews and no LocalBusiness schema is less AI-visible than a competitor with 40 reviews and complete structured data. AI systems prefer certainty over ambiguity. Schema removes the ambiguity.
This is the core insight behind Answer Engine Optimization: you're not optimizing for a human reader deciding which link to click. You're optimizing for a machine deciding which business to recommend. The technical requirements are different — and mostly ignored by traditional SEO agencies.
JSON-LD vs. Microdata vs. RDFa — Why JSON-LD Wins for AI
There are three ways to add structured data to a webpage: JSON-LD, Microdata, and RDFa. All three can technically communicate schema information to crawlers, but they are not equivalent for AEO purposes.
| Format | Where it lives | AI/Google recommendation | Maintainability |
|---|---|---|---|
| JSON-LD | <script> tag in <head> or <body> | Google official recommendation | Easy — separate from HTML markup |
| Microdata | Inline HTML attributes (itemscope, itemprop) | Supported but not preferred | Brittle — tied to HTML structure |
| RDFa | Inline HTML attributes (vocab, property) | Supported but complex | Complex — steep learning curve |
Google explicitly recommends JSON-LD in its developer documentation. It lives in a <script type="application/ld+json"> tag that you can place in the <head> or <body> without touching your visible HTML. That separation makes it easy to update, test, and validate. For AI crawlers — which often process pages at scale and prefer clear signal extraction — JSON-LD's standalone structure is faster and more reliably parsed than Microdata embedded throughout the DOM. Use JSON-LD. The other formats are legacy.
LocalBusiness Schema — The Foundation for Local Contractors
LocalBusiness schema is the single most important structured data implementation for any local service business. It explicitly tells AI systems and search engines your business name, type, address, phone number, hours, service area, and aggregate customer rating. Without it, AI systems must infer this information from unstructured page text — a lossy process that introduces uncertainty and reduces the likelihood of being cited.
Use the most specific @type available for your trade. Schema.org has dedicated types for Plumber, HVACBusiness, Electrician, LegalService, MedicalBusiness, and dozens more. Specificity signals authority. A generic LocalBusiness type competes in a broader pool; a specific HVACBusiness type sends a precise categorical signal to AI systems handling HVAC queries.
Here's a complete LocalBusiness schema for a roofing contractor. Every field included is meaningful to AI systems — don't strip them down to the minimum:
{
"@context": "https://schema.org",
"@type": "RoofingContractor",
"name": "Summit Roofing & Exteriors",
"url": "https://www.summitroofingnc.com",
"logo": "https://www.summitroofingnc.com/images/logo.png",
"image": "https://www.summitroofingnc.com/images/team-photo.jpg",
"description": "Licensed roofing contractor serving Charlotte and surrounding areas. Residential roof replacement, storm damage repair, and gutter installation.",
"telephone": "+17045550192",
"email": "contact@summitroofingnc.com",
"address": {
"@type": "PostalAddress",
"streetAddress": "4821 Prosperity Church Rd",
"addressLocality": "Charlotte",
"addressRegion": "NC",
"postalCode": "28269",
"addressCountry": "US"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 35.3395,
"longitude": -80.7974
},
"areaServed": [
{ "@type": "City", "name": "Charlotte", "sameAs": "https://www.wikidata.org/wiki/Q49111" },
{ "@type": "City", "name": "Concord" },
{ "@type": "City", "name": "Huntersville" },
{ "@type": "City", "name": "Mooresville" }
],
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
"opens": "07:00",
"closes": "18:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Saturday",
"opens": "08:00",
"closes": "14:00"
}
],
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.9",
"reviewCount": "127",
"bestRating": "5",
"worstRating": "1"
},
"sameAs": [
"https://www.google.com/maps?cid=1234567890",
"https://www.yelp.com/biz/summit-roofing-charlotte",
"https://www.facebook.com/summitroofingnc"
]
} Three fields that most implementations skip — and that AI systems weight heavily: areaServed (explicitly tells AI your geographic scope, not just your physical address), aggregateRating (AI systems surface ratings as part of recommendations — missing this forces them to omit your review signal), and sameAs (cross-references to your Google Business Profile and major directories confirms identity consistency across the web).
FAQPage Schema — Your Direct Pipeline to AI Answer Extraction
FAQPage schema is the most direct AEO lever available to content marketers. When you mark up a page's Q&A section with FAQPage schema, you're explicitly labeling extractable question-answer pairs for AI systems. ChatGPT, Google AI Overview, and other AI answer engines actively look for these pairs when constructing responses to user questions.
The key is matching your FAQ questions to the actual queries people ask AI systems in your category. Don't write FAQ questions that sound like marketing copy. Write them the way a homeowner would phrase a search: "How much does it cost to replace a roof?" not "What are Summit Roofing's pricing options?" The former is what gets extracted and cited. The latter is ignored.
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "How much does roof replacement cost in Charlotte, NC?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Roof replacement in Charlotte typically costs between $8,000 and $22,000 depending on square footage, roofing material, and pitch complexity. Architectural shingles on a 2,000 sq ft home run $10,000–$14,000 installed. Metal roofing runs $16,000–$22,000. Most Charlotte homeowners with standard insurance claims pay $0–$3,000 out of pocket after storm damage claims."
}
},
{
"@type": "Question",
"name": "How long does a roof replacement take?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Most residential roof replacements in Charlotte take 1–2 days for a standard single-story home. Larger homes (3,000+ sq ft) or complex roof lines with multiple valleys, skylights, or dormers may take 2–3 days. Weather delays are the most common cause of extended timelines."
}
},
{
"@type": "Question",
"name": "Does homeowners insurance cover roof replacement?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Homeowners insurance typically covers roof replacement when damage is caused by sudden events like hail, wind, or fallen trees. It does not cover gradual deterioration or age-related wear. If you've had a recent storm, request a free inspection — insurance adjusters can miss damage that a qualified roofer will document on your behalf."
}
}
]
}
Each acceptedAnswer text should be a complete, self-contained answer — the kind that can be extracted verbatim and cited without additional context. Avoid referencing "as mentioned above" or "see our pricing page." AI systems extract these answers in isolation. Vague or incomplete answers get skipped. This connects directly to the broader difference between SEO and AEO — you're writing for extraction, not for click-through. Contractors using ChatGPT should also review our 7-step ChatGPT optimization playbook for the non-technical implementation side.
Service Schema — Tell AI Exactly What You Offer
Service schema is the most underused structured data type in local AEO. Most contractors mark up their business entity (LocalBusiness) and stop there. But AI systems handling intent-specific queries — "who does emergency AC repair in Charlotte" — need service-level data to match the query to the right provider. Service schema provides that link.
Each major service line should have its own Service schema block, either on a dedicated service page or nested within the LocalBusiness schema using hasOfferCatalog. Include areaServed on each service — AI systems use this to disambiguate businesses that serve overlapping markets.
{
"@context": "https://schema.org",
"@type": "Service",
"name": "Emergency AC Repair",
"description": "Same-day emergency air conditioning repair in Charlotte, NC. Available 7 days a week. All major brands serviced. Diagnostic fee waived on repair.",
"serviceType": "HVAC Repair",
"provider": {
"@type": "HVACBusiness",
"name": "Comfort Zone HVAC",
"url": "https://www.comfortzonehvac.com",
"telephone": "+17045550847"
},
"areaServed": [
{ "@type": "City", "name": "Charlotte", "addressRegion": "NC" },
{ "@type": "City", "name": "Matthews", "addressRegion": "NC" },
{ "@type": "City", "name": "Mint Hill", "addressRegion": "NC" }
],
"offers": {
"@type": "Offer",
"priceRange": "$$",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"validFrom": "2026-01-01"
},
"termsOfService": "https://www.comfortzonehvac.com/terms",
"url": "https://www.comfortzonehvac.com/services/emergency-ac-repair"
}
The priceRange field using dollar signs ($, $$, $$$) is a lightweight signal that AI systems use when answering price comparison queries. The availability field set to InStock signals that this service is currently active — AI systems can use this to filter out businesses that may have discontinued a service line.
Content Structure Patterns That AI Systems Extract
Schema markup tells AI systems what your business is. Content structure tells them what you know. Both signals matter for AI citation. Pages that get extracted and cited in AI answers share predictable structural patterns — and they're distinct from the long-form content patterns that rank in Google.
Answer-first paragraphs
State the answer in the first sentence, then explain it. AI systems extract the first 1–2 sentences of paragraphs when constructing summaries. "Emergency AC repair in Charlotte typically costs $150–$400 for common failures like capacitor or contactor replacement" is extractable. "When your AC goes out on a hot Charlotte summer day, you need fast, reliable service you can trust" is not.
Explicit comparison tables
Tables with clear column headers comparing services, costs, or timelines are a reliable AI extraction target. Structure them with specific values, not ranges where possible. AI systems prefer "2–4 hours" over "varies."
Numbered process lists
Step-by-step processes (how a service works, what to expect during an inspection) get extracted and cited when users ask procedural questions. Each step should be a complete sentence with an actionable result.
Standalone Q&A sections
FAQ sections that mirror the exact phrasing of real search queries — not marketing questions — are the highest-yield content investment for AEO. Combine these with FAQPage schema for maximum extraction probability.
Testing Tools and the Mistakes That Kill AI Visibility
Schema only works if it's valid. An invalid JSON-LD block is silently ignored by crawlers — you won't get an error on your page, and you won't know it's broken until you check. Three tools every business should use after implementing schema:
Google Rich Results Test — search.google.com/test/rich-results
Validates schema against Google's specific requirements and previews which rich result types your page qualifies for. Run this on every page where you add schema.
Schema.org Validator — validator.schema.org
Checks structural validity against the full Schema.org specification. Catches errors that Google's tool doesn't flag — useful when implementing less common types like Service or ItemList.
Google Search Console — search.google.com/search-console
The Enhancements panel shows schema errors across your entire site at scale, with affected page counts. Check this monthly — schema errors accumulate silently as content changes.
The mistakes that most commonly break AI visibility:
Missing @context — Every JSON-LD block must start with "@context": "https://schema.org". Without it, the entire block is unparseable. This is the single most common schema error and the easiest to fix.
Generic @type instead of specific subtype — Using "LocalBusiness" instead of "Plumber" or "HVACBusiness" loses the vertical signal that AI systems use for trade-specific queries. Always use the most specific type available for your business category.
Outdated or conflicting data — A schema block with last year's phone number or a discontinued service creates a conflict with what AI systems find in directories and your GBP. AI systems resolve conflicts by trusting you less. Audit your schema whenever business details change.
Omitting aggregateRating — If you have reviews, not including aggregateRating in your LocalBusiness schema means AI recommendations won't include your rating — and ratings are a primary signal in how AI systems rank business recommendations.
FAQ answers that are incomplete or self-referential — "Contact us for details" or "see our services page" are non-answers in the context of FAQPage schema. Each acceptedAnswer must be a complete, self-contained response that can be extracted and cited without additional context.
Common Questions About Technical AEO
What is JSON-LD and why does it matter for AEO?
JSON-LD (JavaScript Object Notation for Linked Data) is a structured data format embedded in a <script> tag on your page. It lets you label exactly what your business is, what it does, where it operates, and what customers think of it — in a format AI systems and search engines can parse directly, without interpreting prose. Google officially recommends it over all other structured data formats, and it's the primary signal format for AI answer extraction.
Which schema types are most important for local businesses?
For local service businesses, the three highest-impact types are LocalBusiness (or a vertical subtype like HVACBusiness or Plumber), FAQPage, and Service. LocalBusiness establishes your entity and location signals. FAQPage creates extractable Q&A pairs that AI systems cite directly. Service tells AI systems precisely what jobs you take and where.
How do I test if my schema markup is valid?
Use Google's Rich Results Test (search.google.com/test/rich-results) to validate against Google's requirements. Use the Schema.org Validator (validator.schema.org) for full structural validation. Monitor Google Search Console's Enhancements panel monthly for schema errors across your site. All three tools are free.
What are the most common schema mistakes that hurt AI visibility?
Missing @context (the block won't parse at all), using a generic @type instead of a specific subtype, omitting aggregateRating when you have reviews, having outdated business data that conflicts with your GBP or directory listings, and writing FAQ answers that are incomplete or reference other pages. Each of these either silently disables the schema or reduces the trust signal it carries.
Getting Your Schema Right — Where to Start
If you're starting from zero, implement in this order: LocalBusiness schema on your homepage and contact page first — this is the foundational entity signal that everything else builds on. Then add FAQPage schema to your highest-traffic service pages, writing questions that match real user queries. Then add Service schema to individual service pages with accurate areaServed and priceRange fields.
Validate everything with the Rich Results Test before publishing. Set a recurring monthly reminder to check Google Search Console for schema errors — they appear when content changes and nobody updates the corresponding markup.
Schema is the technical layer that amplifies every other AEO signal. Your Google reviews, citation consistency, and GBP completeness all carry more weight when AI systems can read your structured data and trust that the signals are consistent. It's not optional if AI visibility is the goal. For a full breakdown of the other AEO signals that work alongside schema, see our AEO agency overview →