Refactor the monolithic seo-analyzer into two specialist agents orchestrated in parallel by the /seo skill, plus a standalone /geo skill for AI-only audits. Changes - agents/seo-analyzer.md: refocused on classical engines (Google, Bing, DuckDuckGo). Adds Core Web Vitals 2.0 (LCP/INP/CLS + VSI), CSP + full security headers, hreflang audit, video SEO (transcripts), accessibility as ranking signal, image/video sitemaps. - agents/geo-analyzer.md: new agent for AI engines (ChatGPT, Claude, Perplexity, Gemini, Google AI Overviews, Copilot). Covers AI crawler policy, llms.txt/llms-full.txt, Schema.org for AI extraction (QAPage, Speakable, Person+Article, Organization graph), entity SEO (Wikidata, sameAs, Knowledge Panel), content shape (Definition Lead, TL;DR, Q->A, citable stats, freshness), AI visibility testing. - agents/resources/: shared knowledge base referenced by both agents — ai-crawlers-2026.md (25+ bots, training vs retrieval categories, permissive/restrictive templates), llms-txt-template.md, geo-schemas.md (incl. deprecated list: ClaimReview, CourseInfo, etc. removed June 2025), entity-seo.md, content-shape-for-ai.md, ai-visibility-tools.md, automation-catalog.md. - skills/seo/SKILL.md: becomes parallel dispatcher. Collects context once (depth + business), spawns both agents in a single message for concurrent execution, merges envelopes into unified SEO.md. Includes authoritative file-ownership matrix to prevent parallel-edit races. - skills/geo/SKILL.md: new standalone wrapper for GEO-only audits. Scoring - Combined score: GLOBAL = 0.80 * SEO + 0.20 * GEO (local B2C), 0.75 * SEO + 0.25 * GEO (SaaS/national/content). - GEO axis weight raised from 5% (old) to first-class dimension. Policy - AI crawlers: permissive default (maximise AI citations). Restrictive template available for premium/regulated content. - Every user action in SEO.md section 11 must cite automation options from automation-catalog.md. Tools - WebFetch + WebSearch added to allowed-tools of both skills and both agents (needed for live CWV via PageSpeed API, AI visibility testing, Wikidata/Knowledge Panel lookups, competitor analysis). Research basis (2026 state of the art validated via WebSearch): - Core Web Vitals 2.0 (VSI signal, Google core update March 2026) - AI Overviews trigger on ~48% of Google searches - ClaimReview + 6 other schema types deprecated June 2025 - Definition Lead Architecture (CMU KDD 2024, +impression score) - Citations + stats add up to 40% AI visibility (Aggarwal 2024) - Wikidata grounds every major LLM (ChatGPT, Claude, Gemini, Perplexity) Backup - agents/seo-analyzer.md.bak kept for rollback reference. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
344 lines
11 KiB
Markdown
344 lines
11 KiB
Markdown
# Schema.org for GEO — types that matter in 2026
|
|
|
|
All examples use JSON-LD (the only format Google recommends in 2026).
|
|
Place inside `<script type="application/ld+json">` in `<head>` or
|
|
before `</body>`.
|
|
|
|
## DEPRECATED — do not emit
|
|
|
|
Google deprecated these in June 2025. Stop emitting them and remove
|
|
existing instances. They no longer produce rich results.
|
|
|
|
- `ClaimReview` (was a fact-check signal)
|
|
- `CourseInfo`
|
|
- `EstimatedSalary`
|
|
- `LearningVideo`
|
|
- `SpecialAnnouncement`
|
|
- `VehicleListing`
|
|
- `Book` actions (ReadAction, BuyAction on Book)
|
|
|
|
## TIER 1 — highest GEO impact
|
|
|
|
### QAPage — single Q&A format
|
|
|
|
Pages cited 58% more often by ChatGPT vs basic Article schema.
|
|
Use when the page is built around ONE primary question.
|
|
|
|
```json
|
|
{
|
|
"@context": "https://schema.org",
|
|
"@type": "QAPage",
|
|
"mainEntity": {
|
|
"@type": "Question",
|
|
"name": "What is the best framework for a public website in 2026?",
|
|
"text": "Should I use React SPA, Next.js, or Astro for a public-facing website in 2026?",
|
|
"answerCount": 1,
|
|
"acceptedAnswer": {
|
|
"@type": "Answer",
|
|
"text": "For public-facing websites, Astro is the 2026 default because it ships static HTML by default, preserves SEO/GEO signals, and allows React/Vue/Svelte islands only where interactivity is needed. React SPAs are only appropriate for authenticated, non-indexed surfaces.",
|
|
"dateCreated": "2026-04-21",
|
|
"upvoteCount": 0,
|
|
"author": {
|
|
"@type": "Person",
|
|
"name": "Author Name",
|
|
"url": "https://example.com/about"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### FAQPage — multiple Q&A
|
|
|
|
Only valid when the page visibly contains all listed questions and
|
|
answers. Google will penalise pages with FAQ schema that doesn't match
|
|
visible content.
|
|
|
|
```json
|
|
{
|
|
"@context": "https://schema.org",
|
|
"@type": "FAQPage",
|
|
"mainEntity": [
|
|
{
|
|
"@type": "Question",
|
|
"name": "How long does shipping take?",
|
|
"acceptedAnswer": {
|
|
"@type": "Answer",
|
|
"text": "Standard shipping takes 2 to 5 business days in France."
|
|
}
|
|
},
|
|
{
|
|
"@type": "Question",
|
|
"name": "Do you offer refunds?",
|
|
"acceptedAnswer": {
|
|
"@type": "Answer",
|
|
"text": "Yes — refunds are available within 30 days of purchase."
|
|
}
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
### Speakable — voice + AI extraction marker
|
|
|
|
62% of searches in 2026 involve voice. Speakable flags the passage
|
|
best suited for voice readout and AI summary.
|
|
|
|
```json
|
|
{
|
|
"@context": "https://schema.org",
|
|
"@type": "Article",
|
|
"headline": "Article headline",
|
|
"speakable": {
|
|
"@type": "SpeakableSpecification",
|
|
"cssSelector": [".article-summary", ".tldr"]
|
|
}
|
|
}
|
|
```
|
|
|
|
Or via xpath for non-CSS-targetable content:
|
|
```json
|
|
"speakable": {
|
|
"@type": "SpeakableSpecification",
|
|
"xpath": ["/html/head/title", "//div[@class='tldr']"]
|
|
}
|
|
```
|
|
|
|
### Article + Person — E-E-A-T backbone
|
|
|
|
The single most important pattern for non-local content. Couples
|
|
content to a real author with verifiable credentials.
|
|
|
|
```json
|
|
{
|
|
"@context": "https://schema.org",
|
|
"@type": "Article",
|
|
"headline": "Exact title of the article",
|
|
"description": "One-sentence summary matching meta description.",
|
|
"image": ["https://example.com/images/hero-1x1.jpg", "https://example.com/images/hero-4x3.jpg", "https://example.com/images/hero-16x9.jpg"],
|
|
"datePublished": "2026-04-15T09:00:00+02:00",
|
|
"dateModified": "2026-04-21T14:30:00+02:00",
|
|
"author": {
|
|
"@type": "Person",
|
|
"@id": "https://example.com/about#author-jane",
|
|
"name": "Jane Doe",
|
|
"url": "https://example.com/authors/jane-doe",
|
|
"image": "https://example.com/images/jane-doe.jpg",
|
|
"jobTitle": "Senior Plumber",
|
|
"description": "Master plumber with 15 years of experience in Paris region.",
|
|
"knowsAbout": ["plumbing", "boiler repair", "leak detection"],
|
|
"alumniOf": "Lycée Professionnel Diderot",
|
|
"award": ["Qualibat RGE certification", "Artisan de l'année 2024 Essonne"],
|
|
"worksFor": {
|
|
"@type": "Organization",
|
|
"@id": "https://example.com/#org"
|
|
},
|
|
"sameAs": [
|
|
"https://www.linkedin.com/in/jane-doe-plomberie",
|
|
"https://twitter.com/janedoeplumbing",
|
|
"https://www.wikidata.org/wiki/Q123456789"
|
|
]
|
|
},
|
|
"publisher": {
|
|
"@type": "Organization",
|
|
"@id": "https://example.com/#org",
|
|
"name": "Business Name",
|
|
"logo": {
|
|
"@type": "ImageObject",
|
|
"url": "https://example.com/logo.png"
|
|
}
|
|
},
|
|
"mainEntityOfPage": {
|
|
"@type": "WebPage",
|
|
"@id": "https://example.com/article-slug"
|
|
}
|
|
}
|
|
```
|
|
|
|
## TIER 2 — solid GEO contribution
|
|
|
|
### HowTo — procedural content
|
|
|
|
```json
|
|
{
|
|
"@context": "https://schema.org",
|
|
"@type": "HowTo",
|
|
"name": "How to reset a Chaffoteaux Talia Green boiler",
|
|
"description": "Step-by-step reset procedure for the Talia Green combi boiler.",
|
|
"totalTime": "PT5M",
|
|
"estimatedCost": {"@type": "MonetaryAmount", "currency": "EUR", "value": "0"},
|
|
"tool": [{"@type": "HowToTool", "name": "None"}],
|
|
"step": [
|
|
{
|
|
"@type": "HowToStep",
|
|
"name": "Locate the reset button",
|
|
"text": "The reset button is on the front panel, marked with a flame icon.",
|
|
"url": "https://example.com/guides/reset#step1",
|
|
"image": "https://example.com/img/step1.jpg"
|
|
},
|
|
{
|
|
"@type": "HowToStep",
|
|
"name": "Press and hold for 3 seconds",
|
|
"text": "Press the reset button until the red light turns off.",
|
|
"url": "https://example.com/guides/reset#step2"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
### BreadcrumbList — navigation context for AI
|
|
|
|
Gives AI the hierarchical position of the page. Nearly universal to
|
|
add, low cost.
|
|
|
|
```json
|
|
{
|
|
"@context": "https://schema.org",
|
|
"@type": "BreadcrumbList",
|
|
"itemListElement": [
|
|
{"@type": "ListItem", "position": 1, "name": "Accueil", "item": "https://example.com/"},
|
|
{"@type": "ListItem", "position": 2, "name": "Services", "item": "https://example.com/services"},
|
|
{"@type": "ListItem", "position": 3, "name": "Dépannage chaudière", "item": "https://example.com/services/depannage-chaudiere"}
|
|
]
|
|
}
|
|
```
|
|
|
|
### LocalBusiness — local services (required for local SEO)
|
|
|
|
Must be consistent with GMB. Any divergence is a NAP inconsistency.
|
|
|
|
```json
|
|
{
|
|
"@context": "https://schema.org",
|
|
"@type": "Plumber",
|
|
"@id": "https://example.com/#business",
|
|
"name": "Plomberie Dupont",
|
|
"image": "https://example.com/img/shopfront.jpg",
|
|
"url": "https://example.com",
|
|
"telephone": "+33123456789",
|
|
"priceRange": "€€",
|
|
"address": {
|
|
"@type": "PostalAddress",
|
|
"streetAddress": "12 rue des Lilas",
|
|
"addressLocality": "Évry-Courcouronnes",
|
|
"postalCode": "91000",
|
|
"addressRegion": "Île-de-France",
|
|
"addressCountry": "FR"
|
|
},
|
|
"geo": {
|
|
"@type": "GeoCoordinates",
|
|
"latitude": 48.62939,
|
|
"longitude": 2.44199
|
|
},
|
|
"openingHoursSpecification": [
|
|
{
|
|
"@type": "OpeningHoursSpecification",
|
|
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
|
|
"opens": "08:00",
|
|
"closes": "18:00"
|
|
}
|
|
],
|
|
"areaServed": [
|
|
{"@type": "City", "name": "Évry-Courcouronnes"},
|
|
{"@type": "City", "name": "Corbeil-Essonnes"},
|
|
{"@type": "AdministrativeArea", "name": "Essonne"}
|
|
],
|
|
"sameAs": [
|
|
"https://www.facebook.com/plomberiedupont",
|
|
"https://www.instagram.com/plomberiedupont",
|
|
"https://www.pagesjaunes.fr/pros/12345",
|
|
"https://www.wikidata.org/wiki/Q999999999"
|
|
]
|
|
}
|
|
```
|
|
|
|
Use the most specific subclass of `LocalBusiness` available (`Plumber`,
|
|
`Dentist`, `Restaurant`, `AutoRepair`, etc.) — list at
|
|
https://schema.org/LocalBusiness under "More specific Types".
|
|
|
|
### Organization — company-level entity
|
|
|
|
Separate from `LocalBusiness` when brand > single location.
|
|
|
|
```json
|
|
{
|
|
"@context": "https://schema.org",
|
|
"@type": "Organization",
|
|
"@id": "https://example.com/#org",
|
|
"name": "Company Name",
|
|
"legalName": "Company Name SAS",
|
|
"url": "https://example.com",
|
|
"logo": "https://example.com/logo.png",
|
|
"foundingDate": "2015-03-01",
|
|
"founders": [{"@type": "Person", "name": "Founder Name"}],
|
|
"numberOfEmployees": {"@type": "QuantitativeValue", "value": "12"},
|
|
"vatID": "FR12345678901",
|
|
"iso6523Code": "0199:123456789",
|
|
"sameAs": [
|
|
"https://www.wikidata.org/wiki/Q123456",
|
|
"https://www.linkedin.com/company/companyname",
|
|
"https://www.crunchbase.com/organization/companyname"
|
|
],
|
|
"contactPoint": {
|
|
"@type": "ContactPoint",
|
|
"telephone": "+33123456789",
|
|
"contactType": "customer service",
|
|
"availableLanguage": ["fr", "en"]
|
|
}
|
|
}
|
|
```
|
|
|
|
### Dataset — factual reference content
|
|
|
|
Use for data-heavy pages (statistics, research, public-data reports).
|
|
|
|
```json
|
|
{
|
|
"@context": "https://schema.org",
|
|
"@type": "Dataset",
|
|
"name": "French boiler energy consumption by model, 2020-2025",
|
|
"description": "Average annual kWh consumption for 47 boiler models installed in France.",
|
|
"license": "https://creativecommons.org/licenses/by/4.0/",
|
|
"creator": {"@type": "Organization", "@id": "https://example.com/#org"},
|
|
"distribution": {
|
|
"@type": "DataDownload",
|
|
"encodingFormat": "text/csv",
|
|
"contentUrl": "https://example.com/data/boilers-2020-2025.csv"
|
|
}
|
|
}
|
|
```
|
|
|
|
## TIER 3 — niche but high-leverage when applicable
|
|
|
|
- **`Product`** — e-commerce (required for Merchant Center)
|
|
- **`Recipe`** — food sites
|
|
- **`Event`** — event listings
|
|
- **`JobPosting`** — job boards
|
|
- **`Review` / `AggregateRating`** — only when backed by verifiable public reviews (fraud risk otherwise)
|
|
- **`VideoObject`** — any embedded video (transcripts are critical for AI)
|
|
- **`DefinedTerm` / `DefinedTermSet`** — glossary pages, taxonomy (great for entity disambiguation)
|
|
- **`Course` / `EducationalOccupationalCredential`** — training/cert providers
|
|
- **`MedicalBusiness`, `PhysiologicalFeature`, `Drug`** — health (YMYL, demand extra rigour)
|
|
|
|
## Graph linking — @id patterns
|
|
|
|
Use `@id` to build a single graph across multiple JSON-LD blocks:
|
|
|
|
```json
|
|
{"@context":"https://schema.org","@graph":[
|
|
{"@type":"Organization","@id":"https://example.com/#org","name":"..."},
|
|
{"@type":"WebSite","@id":"https://example.com/#website","publisher":{"@id":"https://example.com/#org"}},
|
|
{"@type":"WebPage","@id":"https://example.com/page#webpage","isPartOf":{"@id":"https://example.com/#website"}},
|
|
{"@type":"Article","mainEntityOfPage":{"@id":"https://example.com/page#webpage"},"author":{"@id":"https://example.com/about#author-jane"}}
|
|
]}
|
|
```
|
|
|
|
This is the pattern Yoast, RankMath, and modern headless-CMS plugins
|
|
output. It lets AI engines traverse entities without duplicating them.
|
|
|
|
## Validation
|
|
|
|
- https://validator.schema.org — strict Schema.org validator
|
|
- https://search.google.com/test/rich-results — Google Rich Results Test
|
|
- https://developers.google.com/search/docs/appearance/structured-data — type-by-type Google docs
|