<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "What is GEO? A 60-word definition for Indian B2B teams",
"description": "Generative Engine Optimization (GEO): the practice of structuring content...",
"datePublished": "2025-09-13",
"author": { "@type": "Person", "name": "Vivek Kumar" },
"publisher": { "@id": "https://softechinfra.com/#org" },
"speakable": {
"@type": "SpeakableSpecification",
"cssSelector": [".tldr-answer", "h1"]
}
}
</script>
Add class="tldr-answer" to the 60-word definition paragraph at the top of the page. The Speakable child of Article (rather than a separate WebPage) keeps the entity graph compact. AI Overviews that surface the answer typically pull from the labelled paragraph; we have measured this on three Indian B2B clients.
## Combo B — HowTo + Speakable (the runnable-guide pattern)
For the page that walks the reader through "how to do X in N steps." HowTo is the schema type AI Overviews extract verbatim — the Princeton GEO research notes that ~74% of AI citations come from structured ranking content like step lists.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "HowTo",
"name": "How to add the 5-layer schema stack to a Next.js site",
"description": "Step-by-step rollout of Organization, BlogPosting, FAQPage, Speakable, and SameAs.",
"totalTime": "PT45M",
"step": [
{
"@type": "HowToStep",
"name": "Add Organization to the root layout",
"text": "Drop the Organization JSON-LD block in your _app.tsx or root layout head with a stable @id."
},
{
"@type": "HowToStep",
"name": "Wire BlogPosting per page",
"text": "Map post fields into a BlogPosting block referencing the Organization by @id."
},
{
"@type": "HowToStep",
"name": "Mirror visible FAQs in JSON-LD",
"text": "Pick 5-7 visible FAQs and serialise them as a FAQPage block with identical strings."
}
],
"speakable": { "@type": "SpeakableSpecification", "cssSelector": [".tldr-answer"] }
}
</script>
Note the totalTime field — ISO-8601 duration. AI Overviews surface this when the user query implies a time budget ("how long does it take to..."). The step array is what gets extracted as a list. Each step text should be self-contained — the engine may extract it without surrounding context.
@id:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{ "@type": "WebPage", "@id": "https://softechinfra.com/blog/example#page", "url": "https://softechinfra.com/blog/example" },
{ "@type": "Article", "@id": "https://softechinfra.com/blog/example#article", "isPartOf": { "@id": "https://softechinfra.com/blog/example#page" }, "headline": "..." },
{ "@type": "HowTo", "@id": "https://softechinfra.com/blog/example#howto", "isPartOf": { "@id": "https://softechinfra.com/blog/example#page" }, "name": "...", "step": [...] },
{ "@type": "FAQPage", "@id": "https://softechinfra.com/blog/example#faq", "isPartOf": { "@id": "https://softechinfra.com/blog/example#page" }, "mainEntity": [...] }
]
}
</script>
The @graph wrapper is the pattern Yoast and RankMath use under the hood for the same reason. Engines parse it as one connected entity instead of three islands.
## What we measured (real attribution data)
The four client sites in our June-August 2025 test were a Bangalore SaaS company, a Pune logistics aggregator, an Ahmedabad textile B2B trader, and a Hyderabad SaaS provider. All four had FAQPage on at least one pillar page since 2024. None had Article or HowTo as named types — they relied on Google to infer the page type from headings.
We added the combo schemas in early July 2025. We tracked the same 80-query probe set in Perplexity, ChatGPT (web), and Google AI Overviews. The August re-run showed:
| Surface | Citations June (FAQ solo) | Citations August (combo) | Lift |
|---|---|---|---|
| Perplexity | 3 | 14 | +367% |
| ChatGPT (web) | 1 | 6 | +500% |
| Google AI Overviews | 1 | 7 | +600% |
| Total (80 queries) | 5 | 27 | +440% |
name (the step header) and text (the step body, ideally 30-60 words). Strings must match the visible page content.PT45M for 45 minutes, PT2H for 2 hours. AI Overviews surface this for time-bounded queries.class="tldr-answer" and add Speakable as a childtext field as a self-contained 30-60 word sentence. The engine extracts the step text without surrounding context — make each step quotable.
Symptom: FAQPage gets validation errors after refactor. Cause: editor updated the visible Q&A but not the JSON-LD. Fix: keep the visible HTML and the JSON-LD in the same template file. Use a single source object that renders both.
Symptom: AI Overview cites a competitor's page despite better content on yours. Cause: competitor has the combo schema; you have FAQPage solo. Fix: add Article + Speakable. We have flipped this on two client sites within 14 days.
Symptom: Speakable selector matches multiple paragraphs and AI extracts the wrong one. Cause: cssSelector too broad (e.g., .intro matching three intros). Fix: use a single-purpose class (.tldr-answer) attached to the literal answer paragraph only.
## A real example — a Pune logistics SaaS
Client: a Pune-based logistics aggregator with a pillar page on "WhatsApp Business API setup for transporters." 4,200 words. Pre-combo: FAQPage with 9 Q-nodes, no Article, no HowTo, no Speakable. The page ranked top-3 on Google for the target query but earned ~2 AI Overview citations a month across our probe set.
We rolled out Combo C — added Article wrapping the page entity, HowTo for the 11-step setup procedure, kept FAQPage, added Speakable on a new TL;DR. Time spent: 90 minutes including QA. New AI Overview citation count after 30 days: 14 across the same probe set. Inbound calendar bookings tagged "from blog" in their HubSpot rose from 6/month to 11/month over the same window. The engineering team now treats combo schema as the standard spec on every new pillar page they ship.
## Pre-publish checklist
- Article block on every explainer page; Speakable child pointing at TL;DR class
- HowTo block on every page with visible step content; totalTime in ISO-8601
- FAQPage with 5-7 visible Q&A nodes (do not invisibly pad)
- Single
@graphwrapper on pillar pages combining Article + HowTo + FAQPage - Speakable cssSelector matches exactly one element on the page (not a class shared with 3+ paragraphs)
- Schema.org validator: zero errors
- Google Rich Results Test: zero errors
- 5-query Perplexity probe set defined and baseline citation count recorded
@graph wrapper that lists all schemas. Engines parse it as one connected entity graph. Multiple separate blocks work but make the graph harder for engines to relate.
### How long until I see AI Overview citation lift?
7-14 days for fresh pages, 21-28 days for pages already indexed (the engine has to re-crawl and re-evaluate). If 30 days have passed with zero lift, the page content itself is probably the bottleneck — not the schema.
### Will combo schemas help on pages with thin content?
No. We have tested. AI engines pull the visible page text; a beautifully marked-up 200-word page still has 200 words of substance to extract. Schema multiplies the visibility of good content; it does not create signal where none exists.
### What about Product schema for SaaS pricing pages?
Product schema is fine for SaaS pricing — but pair it with Offer + AggregateRating, not FAQPage. Different combo for different page intent.
Want a GEO audit + schema upgrade on your top 10 pages?
We audit your top-10 traffic-driving pages for schema gaps, recommend the right combo (A, B, or C), and ship the JSON-LD across all 10. Includes a 30-day Perplexity citation tracker so you can see the lift in your dashboard. Typical engagement: 7 working days. Suitable for B2B sites publishing at least 2 posts a month.
Book a GEO Audit
