Skip to main content

Technical GEO

Schema Markup for AI Search: 8 Types Every Local Business Needs

AI engines do not skim your homepage the way a person does. They need entity facts in a format they can parse without guessing. Here are the schema types that supply those facts, with full JSON-LD templates you can copy today.

GEO / AI SearchAugust 31, 202611 min read1980 words

Why schema matters more for AI search than it ever did for Google

Google has spent two decades building a ranking system that tolerates ambiguity. Its crawlers read messy HTML, infer entities from context, and cross-reference a page against a trillion other signals before deciding where it belongs in a results page. Schema markup helps that process, but a page with zero structured data can still rank well in Google if the content and authority are strong enough.

A large language model answering a chat query does not have that luxury. It is retrieving a handful of candidate documents, reading them in a limited context window, and deciding in one pass whether it has enough confidence to name your business by name. There is no ten-blue-links safety net. If the model cannot quickly confirm who you are, where you operate, what you charge and whether you are a real, currently-operating business, it moves on to a competitor whose page answered those questions in a format it trusts.

That is what schema markup does for AI search that it never had to do for Google: it removes the interpretive work. JSON-LD is a direct, machine-readable statement of fact — this business is a Dentist, it is located at this address, it serves these cities, it charges in this range. An LLM can lift that fact and use it in an answer with far more confidence than it can lift an inference pulled from marketing prose. In our audits, sites with complete, well-structured JSON-LD get cited in ChatGPT and AI Overviews at a noticeably higher rate than sites with the same content but no schema, even when the visible copy is nearly identical.

The 8 schema types that actually move the needle

Schema.org defines hundreds of types, and most of them are irrelevant to a local business trying to get cited by an AI engine. These eight cover the entity facts, service details, trust signals and page structure that LLMs consistently pull from in our client audits. Implement all eight correctly and you have covered the overwhelming majority of what AI retrieval systems look for.

  • Organization / LocalBusiness (plus your industry subtype) — declares who you are as an entity. Minimum fields: name, address, telephone, url. AI-specific fields that matter most: sameAs (links to your Google Business Profile, Facebook, industry directories), areaServed, and priceRange. Always use the most specific subtype available — Dentist, LegalService, HomeAndConstructionBusiness, Restaurant, RoofingContractor — rather than the generic LocalBusiness, since specificity is itself a signal of legitimacy.
  • Service — declares a specific offering separately from the business itself. Minimum fields: serviceType, provider (referencing your business @id). AI-specific fields: areaServed at the service level (it can differ from your business-wide service area) and an offers block with actual pricing. A page that bundles ten services into one paragraph with no Service markup is much harder for a model to extract a clean answer from than a page with one Service block per offering.
  • FAQPage — the single most valuable type for citation. Minimum fields: mainEntity as an array of Question/Answer pairs. AI-specific consideration: write the answer text the way you want it quoted verbatim, front-loaded with the fact, because models frequently lift the acceptedAnswer text nearly word for word.
  • Product / Offer — for businesses selling packaged services or physical products (teeth whitening kits, HVAC maintenance plans, legal document packages). Minimum fields: name, offers with price and priceCurrency. AI-specific field: availability, which lets an engine confidently state whether something can be booked or purchased right now.
  • Review / AggregateRating — third-party validation the model can cite as social proof. Minimum fields: itemReviewed, ratingValue, reviewCount. AI-specific caution: only mark up reviews that genuinely exist on your page and are verifiable — fabricated or scraped review markup is one of the fastest ways to get a page distrusted once an engine cross-references it against Google or Yelp data.
  • BreadcrumbList — establishes your site hierarchy and helps a retrieval system understand how a service page relates to your homepage and location pages. Minimum fields: itemListElement with position, name and item for each level. This matters more for AI search than most people expect, because it helps a model correctly attribute a specific service page to the right parent business entity.
  • WebSite — a single sitewide declaration with your name, url and, ideally, a SearchAction. Minimum fields: name, url. This is a small type but it anchors your @graph and gives crawlers a canonical entry point for your entity.
  • ImageObject — declares your logo, storefront photo or team photo with proper attribution. Minimum fields: url, width, height. AI-specific field: caption, since some multimodal retrieval pipelines now use image captions as additional entity-verification signal alongside text.

Template 1: complete JSON-LD for a dentist

This template stacks LocalBusiness (using the Dentist subtype), Service and FAQPage into a single @graph block, which is the pattern we recommend for most single-location local businesses — one script tag, one set of connected entities, referenced by @id rather than duplicated. Swap in your real business details, service and FAQ content before publishing.

{ "@context": "https://schema.org", "@graph": [ { "@type": "Dentist", "@id": "https://example-dental.com/#business", "name": "Example Family Dental", "image": "https://example-dental.com/images/office-exterior.jpg", "url": "https://example-dental.com", "telephone": "+1-813-555-0142", "priceRange": "$$", "address": { "@type": "PostalAddress", "streetAddress": "412 Bayshore Blvd", "addressLocality": "Tampa", "addressRegion": "FL", "postalCode": "33606", "addressCountry": "US" }, "geo": { "@type": "GeoCoordinates", "latitude": 27.9378, "longitude": -82.4602 }, "openingHoursSpecification": [ { "@type": "OpeningHoursSpecification", "dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday"], "opens": "08:00", "closes": "17:00" } ], "areaServed": [ { "@type": "City", "name": "Tampa" }, { "@type": "City", "name": "Brandon" }, { "@type": "City", "name": "South Tampa" } ], "sameAs": [ "https://www.google.com/maps/place/example-family-dental", "https://www.facebook.com/exampledental", "https://www.healthgrades.com/dentist/example-family-dental", "https://www.zocdoc.com/dentist/example-family-dental" ] }, { "@type": "Service", "@id": "https://example-dental.com/services/invisalign/#service", "serviceType": "Invisalign Clear Aligners", "provider": { "@id": "https://example-dental.com/#business" }, "areaServed": { "@type": "City", "name": "Tampa" }, "offers": { "@type": "Offer", "priceCurrency": "USD", "price": "3500", "priceValidUntil": "2026-12-31" } }, { "@type": "FAQPage", "@id": "https://example-dental.com/services/invisalign/#faq", "mainEntity": [ { "@type": "Question", "name": "How much does Invisalign cost in Tampa?", "acceptedAnswer": { "@type": "Answer", "text": "Invisalign treatment at Example Family Dental in Tampa starts at $3,500 and typically runs $3,500 to $6,000 depending on case complexity. We offer 0% interest payment plans over 24 months." } }, { "@type": "Question", "name": "How long does Invisalign treatment take?", "acceptedAnswer": { "@type": "Answer", "text": "Most adult patients at our Tampa office complete treatment in 12 to 18 months, with mild cases finishing in as little as 6 months." } } ] } ] }

Template 2: complete JSON-LD for a home services contractor

The pattern is identical, but the subtype and fields shift to match a service-area business rather than a fixed-storefront practice. Note the added hasOfferCatalog block, which is worth adding for any contractor offering more than two or three distinct services, since it gives a model a single place to see your full service menu at once.

{ "@context": "https://schema.org", "@graph": [ { "@type": "HomeAndConstructionBusiness", "@id": "https://example-roofing.com/#business", "name": "Example Roofing & Exteriors", "image": "https://example-roofing.com/images/crew-truck.jpg", "url": "https://example-roofing.com", "telephone": "+1-407-555-0199", "priceRange": "$$", "address": { "@type": "PostalAddress", "streetAddress": "88 Colonial Dr", "addressLocality": "Orlando", "addressRegion": "FL", "postalCode": "32801", "addressCountry": "US" }, "areaServed": [ { "@type": "City", "name": "Orlando" }, { "@type": "City", "name": "Winter Park" }, { "@type": "City", "name": "Kissimmee" } ], "hasOfferCatalog": { "@type": "OfferCatalog", "name": "Roofing Services", "itemListElement": [ { "@type": "Offer", "itemOffered": { "@id": "https://example-roofing.com/services/roof-repair/#service" } }, { "@type": "Offer", "itemOffered": { "@id": "https://example-roofing.com/services/roof-replacement/#service" } } ] }, "sameAs": [ "https://www.google.com/maps/place/example-roofing-exteriors", "https://www.bbb.org/us/fl/orlando/example-roofing", "https://www.angi.com/companylist/us/fl/orlando/example-roofing" ] }, { "@type": "Service", "@id": "https://example-roofing.com/services/roof-repair/#service", "serviceType": "Roof Repair", "provider": { "@id": "https://example-roofing.com/#business" }, "areaServed": { "@type": "City", "name": "Orlando" }, "offers": { "@type": "Offer", "priceCurrency": "USD", "priceSpecification": { "@type": "PriceSpecification", "minPrice": "350", "maxPrice": "1800", "priceCurrency": "USD" } } }, { "@type": "FAQPage", "@id": "https://example-roofing.com/services/roof-repair/#faq", "mainEntity": [ { "@type": "Question", "name": "How much does roof repair cost in Orlando?", "acceptedAnswer": { "@type": "Answer", "text": "Roof repair in the Orlando area typically runs $350 to $1,800 depending on the extent of the damage, with most single-leak repairs falling between $450 and $900." } }, { "@type": "Question", "name": "How fast can you get someone out for an emergency roof leak?", "acceptedAnswer": { "@type": "Answer", "text": "We dispatch same-day for active leaks reported before 2pm across Orlando, Winter Park and Kissimmee, with emergency tarping completed within 4 hours of your call." } } ] } ] }

Common schema errors that quietly break your AI visibility

We find the same handful of mistakes across the majority of local business sites we audit, and each one undermines the entity clarity schema is supposed to provide.

  • Contradictory microdata and JSON-LD on the same page. Older WordPress themes and SEO plugins sometimes still output inline microdata or RDFa attributes while a separate plugin also injects JSON-LD. When the two disagree — different phone numbers, different hours — a crawler has to pick one, and an LLM reading the raw HTML may pick the wrong one or discount both. Audit for this by viewing page source and searching for itemscope alongside a script type="application/ld+json" block.
  • Missing @id references between related entities. When your Service and FAQPage blocks do not reference your business via @id, a model has no structural link telling it these three pieces of information describe the same business. This is the single most common defect we find in the templates above when businesses copy them without connecting the @id fields correctly.
  • Wrong or overly generic Schema.org types. Using LocalBusiness when Dentist, Electrician or LegalService exists, or using Organization for a business that should be a more specific subtype, throws away a free specificity signal. Check the full type hierarchy at schema.org before defaulting to the generic parent type.
  • Orphan @graph entries. A Service or FAQPage block with no provider or mainEntity connection back to the business entity floats disconnected in the graph. Validators frequently pass this as syntactically valid JSON-LD, which is exactly why it goes unnoticed — the markup is not broken, it is just not useful.
  • Stale data that contradicts your Google Business Profile. Schema stating hours, an address or a price range that no longer matches your live GBP listing is worse than having no schema at all, because it actively signals inconsistency to any system cross-referencing the two sources.

How to validate your schema before you trust it

Syntactically valid JSON-LD is not the same as effective JSON-LD. Run all three of these checks, in order, before considering a schema implementation done.

Start with Google's Rich Results Test at search.google.com/test/rich-results. Paste your URL or raw code and confirm it detects every type you intended — Dentist, Service, FAQPage — with zero errors and, ideally, zero warnings. This catches syntax problems and missing required fields fast.

Follow with the Schema Markup Validator at validator.schema.org, which checks against the full Schema.org vocabulary rather than only the subset Google's tool cares about. This is where you catch an incorrect type name or a field that does not exist on the type you used, which Google's tool sometimes lets slide.

Then run the test that actually matters for GEO: ask an LLM directly. Open ChatGPT or Claude, paste your raw JSON-LD, and ask a plain question your own schema should answer — "Based on this data, what does this business charge for Invisalign in Tampa, and what areas does it serve?" If the model cannot answer confidently and correctly from the JSON-LD alone, an AI search engine retrieving that same page in a live query will struggle the same way. This step catches structurally valid but practically unreadable schema that the first two tools cannot detect.

llms.txt as a schema companion, not a replacement

llms.txt, placed at your site root, is a plain-language markdown file that gives an LLM a short, curated map of your site — who you are, your key pages, and a summary of what each one covers. It is gaining adoption quickly, but it is not a substitute for schema markup, and treating it as one is a mistake we see increasingly often.

Schema is machine-readable structured data that a system can parse deterministically. llms.txt is a human-readable summary a model reads more like prose. They serve different stages of the same process: schema gives an engine hard facts it can trust and quote; llms.txt gives it a fast orientation to your site so it retrieves the right pages in the first place. A minimal, effective llms.txt entry looks something like a short bullet list under an H1 with your business name, linking to your top service and location pages with a one-line description of each. Build both — llms.txt to get the model looking in the right place, schema to give it something solid once it gets there.

Frequently asked questions

Do I need schema markup if my content already clearly states my hours, address and pricing?

Yes. Visible text helps a human reader and helps to a lesser degree with retrieval, but an LLM extracting facts under time and context constraints trusts structured JSON-LD far more than it trusts parsing meaning out of prose. Sites with matching visible content and schema get cited more consistently in our audits than sites relying on prose alone, even when the underlying facts are identical.

Which schema type should I implement first if I can only do one?

LocalBusiness or your industry-specific subtype (Dentist, LegalService, HomeAndConstructionBusiness, and so on) on your homepage. It anchors your entity identity, and every other type — Service, FAQPage, Review — becomes more effective once it can reference that business via @id rather than standing alone.

Can I use a WordPress plugin to generate this schema automatically?

Plugins like Schema Pro or RankMath can generate a solid baseline, but check the output against the templates above for the AI-specific fields — sameAs, areaServed at both the business and service level, and connected @id references — since many plugins default to a minimal set built for Google rich results rather than full AI-readability.

Will adding FAQPage schema make my FAQ content look duplicated to search engines?

No. Schema markup is metadata layered onto the page, not a second copy of visible content in Google's eyes. What matters is that your visible FAQ text and your FAQPage schema say the same thing — mismatched visible and structured content is the actual risk, not duplication.

How often should I update my schema?

Any time your hours, pricing, service area or address change — treat it with the same urgency as updating your Google Business Profile. We also recommend a full schema audit every 6 months even without known changes, since plugin updates and theme changes silently break JSON-LD more often than site owners realize.

Does schema markup guarantee I will be cited by ChatGPT or AI Overviews?

No single factor guarantees citation. Schema removes ambiguity and makes your facts easier to trust and quote, which measurably improves citation rate in our audits, but it works alongside Bing indexing, content depth, and third-party corroboration through directories and reviews. See our ChatGPT ranking factors guide for the full picture.

Can Local Visibility AI audit or build this schema for my business?

Yes. Schema implementation is part of our AI Visibility service, and our $19 Pro Audit Report includes a full structured-data check showing exactly which of these 8 types you are missing or implementing incorrectly, alongside your current standing in ChatGPT, Perplexity, Google AI Overviews and the Local Pack.

Not sure how AI sees your business?

Get your 55-page Pro Audit for $19 — delivered in 48 hours. Shows exactly where you stand in ChatGPT, Perplexity, Google AI Overviews and the Local Pack.

Related services, industries, cities and resources from Local Visibility AI.