NeverRanked · Schema library

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.

Why this exists: NeverRanked customers' per-query playbooks (the prepped punch list inside the kickoff appendix) name specific schema types to deploy per page type. This library is the deployable form of those recommendations. The schema is generic. The proprietary work is the per-customer measurement and the per-query playbook telling you which schema to deploy where and why.
What is measured vs what is inferred. The schema blocks themselves are deployable as-is and validate against schema.org. The per-engine notes (e.g., "ChatGPT search quotes 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.
Where the line is. NeverRanked publishes this library as a spec. The customer's developer (or the customer's agency) deploys the schema, validates it, and ships the page. NeverRanked does not touch the customer's site, CMS, deploy pipeline, or schema-validator setup. The boundary is structural: we measure, we hand off a spec, the customer or agency executes. That separation is the engagement. Crossing it (NeverRanked deploying schema directly) would compromise the integrity of the measurement, since we cannot honestly measure what we are also responsible for shipping.

Schema types in this library

How to use these blocks

  1. Copy the block for the page type you are building.
  2. Replace every bracketed placeholder (e.g., [YOUR FIRM NAME]) with the actual value for your firm.
  3. Paste inside <script type="application/ld+json">...</script> in the page head.
  4. Validate at validator.schema.org. The validator should report no warnings.
  5. Test the page renders correctly. Schema is invisible to humans but should not break the page.
  6. 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

PropertyWhy it matters
@idStable identifier AI engines use to link this LocalBusiness to other schema (Service, Person) on the same page. Use the firm's domain + #localbusiness.
nameMust match the firm's primary brand name exactly. AI engines cross-reference this with web mentions.
addressFull PostalAddress object. AI engines extract location signal here for geographic queries. Address must also appear in visible body text.
geoLat/lng coordinates. Some AI engines (particularly Google AI Overviews) prefer geo over address for distance-based ranking.
openingHoursSpecificationArray of day-range objects. AI engines surface "open now" and "open late" facts directly from this. Get it right.
sameAsArray of authoritative profile URLs (LinkedIn, Facebook, industry directory). AI engines use these to confirm entity identity.
priceRangeOptional. $, $$, $$$, or $$$$. AI engines use this for budget-shaped queries.
Per-engine notes
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

PropertyWhy it matters
serviceTypeUse the exact service name a buyer would type. "Fee-only tax planning" beats "Tax services." Match the query intent.
description50-150 words. AI engines often quote this directly. Lead with the deliverable, not your firm's history.
providerReference the firm's LocalBusiness via @id. This links the service to the firm and lets AI cite both together.
areaServedGeographic scope. Critical for long-tail-by-geo queries. Use specific city/region names, not "United States."
audienceBuyer-type signal. AI engines reward pages that visibly target a named audience over generic service pages.
offersIf you can publish pricing (even a range), do. AI engines preferentially cite price-transparent pages for budget-shaped queries.
Per-engine notes
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

Per-engine notes
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

PropertyWhy it matters
knowsAboutArray of subject areas. The single highest-leverage Person property for AI citation. List specific specialties, not generic categories.
hasCredentialProfessional credentials. AI engines cite credentialed people more often for trust-shaped queries.
alumniOfEducational background. Particularly important for attorneys (law school) and financial advisors (designations).
sameAsProfessional profile URLs. LinkedIn is most important. Industry-specific profiles (Bar association, AICPA, CFP Board) add weight.
worksForLinks to the firm's LocalBusiness via @id. Lets AI cite person + firm together.
Per-engine notes
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

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."

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

Validation

After deploying any schema:

  1. Paste your live URL into validator.schema.org.
  2. Fix any errors (these block AI engines from reading the schema at all).
  3. Address warnings where they apply (these reduce AI confidence in the schema).
  4. For Google-specific validation, also test at Google Rich Results Test.
  5. Re-validate any time you change the schema.

What happens next

Schema deployment is necessary but not sufficient for AI citation. The full path:

  1. Deploy the schema matching the page's intent (this library).
  2. Match the body content shape the cited competitors use (median word count, H2 structure, FAQ presence, all surfaced in your per-query NeverRanked playbook).
  3. Internal link the page from existing high-traffic site sections so crawlers find it within the first re-index cycle.
  4. 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.
  5. 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