Deployable JSON-LD blocks for AI citation.
Pre-written schema blocks for the page types AI engines actually cite. Drop into a <script type="application/ld+json"> tag in your page head, fill in the bracketed values, validate at validator.schema.org. Annotated with notes on what each property does and which AI engines read which properties.
acceptedAnswer.text verbatim") are inferred from a combination of: (a) NeverRanked's measurement observations across the categories we have measured and seven AI tools, (b) public documentation from each engine, and (c) generally-accepted AEO best-practice. They are not direct A/B-tested findings on the specific schema property. Treat per-engine notes as informed prior, not as published fact. If a note conflicts with what you observe in your own measurement, your measurement wins.
Schema types in this library
- LocalBusiness. The root schema for any local-service firm.
- Service. One block per service variant the firm offers.
- FAQPage. The FAQ structure AI engines reward most.
- Person. Named partners, attorneys, advisors, principals.
- Article. Case studies, named-byline content, thought leadership.
- Offer. For pricing-transparent service pages.
- BreadcrumbList. Site navigation context.
- AggregateRating. For review-bearing pages.
- Organization. Parent schema for the firm itself.
How to use these blocks
- Copy the block for the page type you are building.
- Replace every bracketed placeholder (e.g.,
[YOUR FIRM NAME]) with the actual value for your firm. - Paste inside
<script type="application/ld+json">...</script>in the page head. - Validate at validator.schema.org. The validator should report no warnings.
- Test the page renders correctly. Schema is invisible to humans but should not break the page.
- Wait for AI engines to re-index (typically 4-8 weeks. See your monthly NeverRanked measurement for confirmation).
One page can have multiple schema blocks. A service-specific landing page might have Service + LocalBusiness + FAQPage + BreadcrumbList all on the same page. This is normal and AI engines handle it correctly.
LocalBusiness
The root schema for any local-service firm (CPA, attorney, dentist, wealth manager, bank branch, med spa, restaurant). Tells AI engines the firm exists, where it is, what it does, and how to reach it. Deploy this on the homepage and any location-specific page.
The block
// Drop inside <script type="application/ld+json">...</script> { "@context": "https://schema.org", "@type": "LocalBusiness", "@id": "https://[YOUR DOMAIN]/#localbusiness", "name": "[YOUR FIRM NAME]", "url": "https://[YOUR DOMAIN]/", "telephone": "+1-[AREA CODE]-[NUMBER]", "email": "[CONTACT EMAIL]", "image": "https://[YOUR DOMAIN]/[PATH TO PHOTO].jpg", "priceRange": "$$", "address": { "@type": "PostalAddress", "streetAddress": "[STREET ADDRESS]", "addressLocality": "[CITY]", "addressRegion": "[STATE 2-LETTER]", "postalCode": "[ZIP]", "addressCountry": "US" }, "geo": { "@type": "GeoCoordinates", "latitude": "[LAT]", "longitude": "[LNG]" }, "openingHoursSpecification": [{ "@type": "OpeningHoursSpecification", "dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], "opens": "08:00", "closes": "17:00" }], "sameAs": [ "https://www.linkedin.com/company/[YOUR LINKEDIN]", "https://www.facebook.com/[YOUR FACEBOOK]", "https://[OTHER PROFILE]" ] }
Property notes
| Property | Why it matters |
|---|---|
@id | Stable identifier AI engines use to link this LocalBusiness to other schema (Service, Person) on the same page. Use the firm's domain + #localbusiness. |
name | Must match the firm's primary brand name exactly. AI engines cross-reference this with web mentions. |
address | Full PostalAddress object. AI engines extract location signal here for geographic queries. Address must also appear in visible body text. |
geo | Lat/lng coordinates. Some AI engines (particularly Google AI Overviews) prefer geo over address for distance-based ranking. |
openingHoursSpecification | Array of day-range objects. AI engines surface "open now" and "open late" facts directly from this. Get it right. |
sameAs | Array of authoritative profile URLs (LinkedIn, Facebook, industry directory). AI engines use these to confirm entity identity. |
priceRange | Optional. $, $$, $$$, or $$$$. AI engines use this for budget-shaped queries. |
ChatGPT search / Gemini grounded: read all properties.
name, address, and sameAs drive the highest weight.Perplexity: heavily uses
address and openingHoursSpecification for local intent queries.Google AI Overviews: prefers
geo + address together, and cross-references with Google Business Profile.Microsoft Copilot (Bing): currently weak at extracting LocalBusiness schema. Bing Business Profile is the more direct path.
Claude / Gemma (training data): don't read live schema. LocalBusiness presence here matters only for future training data refreshes (months to years).
Service
One block per distinct service the firm offers. Deploy on service-specific landing pages. The most important schema for long-tail-by-service queries (e.g., "fee-only tax advisor", "estate planning attorney").
The block
{
"@context": "https://schema.org",
"@type": "Service",
"serviceType": "[EXACT SERVICE NAME]",
"name": "[SERVICE NAME AS A BUYER WOULD SAY IT]",
"description": "[ONE PARAGRAPH DESCRIBING WHAT THE SERVICE COVERS, WHO IT'S FOR, AND WHAT THE DELIVERABLE IS. 50-150 WORDS.]",
"provider": {
"@id": "https://[YOUR DOMAIN]/#localbusiness"
},
"areaServed": {
"@type": "AdministrativeArea",
"name": "[CITY OR REGION YOU SERVE]"
},
"audience": {
"@type": "Audience",
"audienceType": "[BUYER TYPE: small business, individuals, nonprofits, etc.]"
},
"offers": {
"@type": "Offer",
"priceCurrency": "USD",
"price": "[PRICE OR PRICE RANGE]",
"priceSpecification": {
"@type": "PriceSpecification",
"priceCurrency": "USD",
"price": "[PRICE]",
"description": "[Hourly, project-based, retainer, etc.]"
}
}
}
Property notes
| Property | Why it matters |
|---|---|
serviceType | Use the exact service name a buyer would type. "Fee-only tax planning" beats "Tax services." Match the query intent. |
description | 50-150 words. AI engines often quote this directly. Lead with the deliverable, not your firm's history. |
provider | Reference the firm's LocalBusiness via @id. This links the service to the firm and lets AI cite both together. |
areaServed | Geographic scope. Critical for long-tail-by-geo queries. Use specific city/region names, not "United States." |
audience | Buyer-type signal. AI engines reward pages that visibly target a named audience over generic service pages. |
offers | If you can publish pricing (even a range), do. AI engines preferentially cite price-transparent pages for budget-shaped queries. |
ChatGPT search: quotes
description field verbatim more than any other engine. Write it as a self-contained answer.Perplexity / Gemini grounded: use
serviceType + areaServed as a combined ranking signal for long-tail queries.Google AI Overviews: reads
offers for budget queries. Missing pricing drops you from "best for the money" answer sets.Microsoft Copilot: reads Service schema lightly and relies more on body text patterns.
FAQPage
One of the highest-leverage schemas for AEO. AI engines preferentially cite pages with FAQPage schema for question-shaped queries because the structured Q&A maps cleanly to what a buyer is asking. Deploy on service pages, location pages, and any page where buyers commonly have follow-up questions.
The block
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "[A QUESTION YOUR BUYER ACTUALLY ASKS]",
"acceptedAnswer": {
"@type": "Answer",
"text": "[DIRECT, COMPLETE ANSWER. 2-5 SENTENCES. WRITE AS IF QUOTED BY AI.]"
}
},
{
"@type": "Question",
"name": "[ANOTHER REAL QUESTION]",
"acceptedAnswer": {
"@type": "Answer",
"text": "[DIRECT ANSWER]"
}
}
]
}
Rules for the FAQ
- Questions must be real. Use questions buyers actually ask, not marketing-shaped questions. AI engines preferentially cite pages where the Q&A maps to common buyer intent.
- Answers must be direct. 2-5 sentences. AI engines quote the
textfield verbatim. Write it as if it's about to be the AI's answer to a buyer. - Visible AND schema. The same Q&A must appear in visible body text on the page, not just in schema. AI engines cross-check.
- 5-8 questions is the sweet spot. Fewer than 3 looks thin. More than 12 dilutes signal.
- No nested HTML in answers. Plain text only.
<br>or markup breaks AI quoting.
ChatGPT search: quotes
acceptedAnswer.text directly in answers. This is the single highest-leverage schema for ChatGPT citation.Perplexity: reads FAQPage but weights it lower than independent third-party content.
Google AI Overviews: heavily rewards FAQ schema and can surface individual Q&A pairs as standalone answers.
Microsoft Copilot: reads visible Q&A patterns from body text more than the schema itself.
Claude / Gemma: training-data only. FAQ schema matters only for future training refresh.
Person
Named partners, attorneys, advisors, principals. Critical for high-trust professional-services categories (law, wealth, accounting) where AI engines cite specific named professionals more often than firms.
The block
{
"@context": "https://schema.org",
"@type": "Person",
"@id": "https://[YOUR DOMAIN]/team/[SLUG]#person",
"name": "[FULL NAME]",
"jobTitle": "[ROLE: Partner, Senior Wealth Advisor, etc.]",
"image": "https://[YOUR DOMAIN]/[PHOTO PATH].jpg",
"description": "[ONE-PARAGRAPH BIO. 50-100 WORDS. NAME THE PERSON'S SPECIALTY, NOT GENERIC PRAISE.]",
"worksFor": {
"@id": "https://[YOUR DOMAIN]/#localbusiness"
},
"alumniOf": {
"@type": "EducationalOrganization",
"name": "[INSTITUTION]"
},
"hasCredential": [
"[CREDENTIAL: CPA, JD, CFP, MD, etc.]",
"[ADDITIONAL CREDENTIAL]"
],
"knowsAbout": [
"[SUBJECT AREA THIS PERSON SPECIALIZES IN]",
"[ANOTHER SUBJECT AREA]"
],
"sameAs": [
"https://www.linkedin.com/in/[LINKEDIN SLUG]",
"https://[OTHER PROFESSIONAL PROFILE]"
]
}
Property notes
| Property | Why it matters |
|---|---|
knowsAbout | Array of subject areas. The single highest-leverage Person property for AI citation. List specific specialties, not generic categories. |
hasCredential | Professional credentials. AI engines cite credentialed people more often for trust-shaped queries. |
alumniOf | Educational background. Particularly important for attorneys (law school) and financial advisors (designations). |
sameAs | Professional profile URLs. LinkedIn is most important. Industry-specific profiles (Bar association, AICPA, CFP Board) add weight. |
worksFor | Links to the firm's LocalBusiness via @id. Lets AI cite person + firm together. |
Claude / Gemma (training data): Person schema with strong
knowsAbout + sameAs compounds in training data over years. The slowest-moving but most defensible AEO surface for named professionals.ChatGPT search / Perplexity: use
jobTitle + knowsAbout as a combined relevance signal for expertise queries.Google AI Overviews: cross-references
sameAs URLs heavily. Missing LinkedIn drops you from named-expert answer sets.
Article
For case studies, named-byline thought leadership, technical explainers. Critical for high-trust professional services where editorial presence drives training-data engine citations over time.
The block
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "[ARTICLE TITLE, <= 110 CHARS]",
"description": "[ONE-SENTENCE SUMMARY]",
"image": "https://[YOUR DOMAIN]/[HERO IMAGE].jpg",
"datePublished": "YYYY-MM-DD",
"dateModified": "YYYY-MM-DD",
"author": {
"@id": "https://[YOUR DOMAIN]/team/[AUTHOR SLUG]#person"
},
"publisher": {
"@id": "https://[YOUR DOMAIN]/#localbusiness"
},
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "https://[YOUR DOMAIN]/[ARTICLE PATH]"
},
"about": [
"[SUBJECT AREA]",
"[ANOTHER SUBJECT AREA]"
]
}
Rules for Article
- Always reference a Person via
author.@id. Anonymous Articles get cited less. AI engines preferentially cite named-byline content. datePublishedanddateModifiedmatter. AI engines deprioritize stale content. Updated dates keep articles citation-eligible longer.aboutis the most overlooked property. Specific subject areas help AI route the article to the right query intents.
Offer
For service pages with transparent pricing. AI engines cite price-transparent pages more often for budget-shaped queries (e.g., "affordable", "best value", "under $X").
The block
{
"@context": "https://schema.org",
"@type": "Offer",
"name": "[OFFER NAME]",
"description": "[WHAT THE OFFER INCLUDES]",
"price": "[PRICE NUMBER, NO CURRENCY SYMBOL]",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"validFrom": "YYYY-MM-DD",
"itemOffered": {
"@type": "Service",
"name": "[SERVICE NAME]"
},
"priceSpecification": {
"@type": "UnitPriceSpecification",
"price": "[PRICE]",
"priceCurrency": "USD",
"unitText": "[per hour, per project, per month, etc.]"
}
}
For ranges, use PriceRange instead of Offer. For free initial consultations, set price to "0" with description noting "initial consultation."
BreadcrumbList
Site navigation context. Tells AI engines how this page fits in your site structure. Particularly important for service-specific or location-specific deep pages.
The block
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://[YOUR DOMAIN]/"
},
{
"@type": "ListItem",
"position": 2,
"name": "Services",
"item": "https://[YOUR DOMAIN]/services/"
},
{
"@type": "ListItem",
"position": 3,
"name": "[SPECIFIC SERVICE]",
"item": "https://[YOUR DOMAIN]/services/[SLUG]"
}
]
}
AggregateRating
For pages displaying review summaries. Use only with real, verifiable reviews. Fake or unverified ratings will get the page penalized.
The block
{
"@context": "https://schema.org",
"@type": "AggregateRating",
"itemReviewed": {
"@id": "https://[YOUR DOMAIN]/#localbusiness"
},
"ratingValue": "[ACTUAL AVERAGE, e.g., 4.8]",
"bestRating": "5",
"worstRating": "1",
"reviewCount": "[ACTUAL COUNT]"
}
Important: ratingValue and reviewCount must reflect a verifiable source (Google Business Profile, Yelp, etc.). Inflated or fabricated values violate Google's structured-data guidelines and risk de-indexing.
Organization
The umbrella schema for the firm as an entity (separate from a specific LocalBusiness location). Use for multi-location firms or firms whose primary entity is more abstract than a single physical location.
The block
{
"@context": "https://schema.org",
"@type": "Organization",
"@id": "https://[YOUR DOMAIN]/#organization",
"name": "[FIRM NAME]",
"url": "https://[YOUR DOMAIN]/",
"logo": "https://[YOUR DOMAIN]/[LOGO PATH]",
"description": "[ONE-PARAGRAPH FIRM DESCRIPTION]",
"foundingDate": "YYYY",
"founders": [{
"@type": "Person",
"name": "[FOUNDER NAME]"
}],
"areaServed": {
"@type": "AdministrativeArea",
"name": "[REGION YOU SERVE]"
},
"sameAs": [
"https://www.linkedin.com/company/[SLUG]",
"https://en.wikipedia.org/wiki/[WIKI SLUG IF EXISTS]"
]
}
Common mistakes to avoid
- Schema that contradicts visible page content. AI engines cross-check. If schema says you serve Hawaii and the body text says California, both signals get downweighted.
- Generic
descriptionfields. "Leading provider of services in our category" tells AI nothing. Specific, deliverable-focused descriptions get quoted. - Schema-only with no visible counterpart. The FAQ, the service description, the address all need to appear in body text too. Schema-only signals get treated as cloaking.
- Stale
dateModified. Update when you make material changes. AI engines penalize content marked fresh that hasn't actually changed. - Missing
@idlinkages. Without@id, AI engines can't connect Service to LocalBusiness to Person on the same page. Add stable@idvalues everywhere. - One giant block for everything. Use separate
<script type="application/ld+json">tags per schema type. Easier to validate, easier to update.
Validation
After deploying any schema:
- Paste your live URL into validator.schema.org.
- Fix any errors (these block AI engines from reading the schema at all).
- Address warnings where they apply (these reduce AI confidence in the schema).
- For Google-specific validation, also test at Google Rich Results Test.
- Re-validate any time you change the schema.
What happens next
Schema deployment is necessary but not sufficient for AI citation. The full path:
- Deploy the schema matching the page's intent (this library).
- Match the body content shape the cited competitors use (median word count, H2 structure, FAQ presence, all surfaced in your per-query NeverRanked playbook).
- Internal link the page from existing high-traffic site sections so crawlers find it within the first re-index cycle.
- Wait 4-8 weeks for AI engines to re-index. Training-data engines (Claude, Gemma) take much longer. They reflect schema changes on the next model training cycle.
- Verify in your monthly NeverRanked measurement that the page is now being cited on the target queries.
How NeverRanked measures · Public teardowns · Return to NeverRanked