<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"@id": "https://softechinfra.com/#org",
"name": "Softechinfra",
"url": "https://softechinfra.com",
"logo": "https://softechinfra.com/logo.png",
"founder": {
"@type": "Person",
"name": "Vivek Singh",
"url": "https://viveksinra.com"
},
"sameAs": [
"https://www.linkedin.com/company/softechinfra",
"https://x.com/softechinfra"
],
"makesOffer": [
{ "@type": "SoftwareApplication", "name": "PenLeap", "url": "https://penleap.com" },
{ "@type": "SoftwareApplication", "name": "TalkDrill", "url": "https://talkdrill.com" }
]
}
</script>
Three things to notice. The @id is a stable URL — every other schema on the site references this by ID. The founder block links to a real Person URL — not just a name. The makesOffer array tells AI engines which software applications belong to this org so when ChatGPT is asked "what does Softechinfra build?" it has a clean answer.
## Layer 2 — BlogPosting (per page, the page-level entity)
This is the one that defines the page itself. Every URL on the site gets one. For a service page, swap BlogPosting for Service; for a product page, SoftwareApplication. The shape is the same.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"@id": "https://softechinfra.com/blog/example-post#post",
"headline": "Example post title (≤110 chars)",
"description": "The excerpt verbatim — 150-160 chars.",
"image": "https://softechinfra.com/og/example-post.jpg",
"datePublished": "2025-09-05",
"dateModified": "2025-09-05",
"author": {
"@type": "Person",
"name": "Vivek Kumar",
"url": "https://softechinfra.com/team/vivek-kumar"
},
"publisher": { "@id": "https://softechinfra.com/#org" },
"mainEntityOfPage": "https://softechinfra.com/blog/example-post"
}
</script>
Note the publisher uses @id reference — not a fresh inline Organization. This is the entity-graph pattern: define once in Layer 1, reference everywhere. AI engines parse the cluster as one coherent entity instead of a soup of duplicates.
@id referencing — your future graph will thank you.<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "What is the 5-layer schema stack?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Organization, BlogPosting/Service, FAQPage, Speakable, and a SameAs entity bridge — five JSON-LD layers that anchor a page to known entities and surface its answers cleanly to AI engines."
}
},
{
"@type": "Question",
"name": "Does FAQ schema still work in 2025?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Google killed the FAQ rich result dropdown but kept reading FAQPage data for AI Overviews and entity understanding. Perplexity Sonar measurably prefers pages with 3+ FAQ Q-nodes."
}
}
]
}
</script>
Five to seven Q-nodes is the sweet spot in our tests. More than 10 starts looking padded. Each answer should sit in the 30–60 word band — the same band that Princeton's GEO research found maximally extractable.
## Layer 4 — Speakable (the patch nobody bothers with)
Speakable is a CSS selector that tells Google Assistant and voice surfaces: "if you are reading this page aloud, read these elements." Most of the SEO industry skipped it because it does not produce a visible search feature. We ship it because (a) voice surfaces increasingly route through AI engines, and (b) labeling your TL;DR explicitly is a free signal that it is the answer.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebPage",
"speakable": {
"@type": "SpeakableSpecification",
"cssSelector": [".tldr", "h1", ".blog-stat-number"]
}
}
</script>
Add a class="tldr" on the answer-in-60-words paragraph and Speakable picks it up. Two minutes of work. Free signal.
## Layer 5 — SameAs entity bridge (the patch that resolves "which Anthropic?")
This one is for posts that mention named entities — companies, products, people, technologies. AI engines have to disambiguate ("Apple the company, or Apple the fruit?") and the cheapest way to help them is a sameAs array pointing at canonical IDs.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebPage",
"@id": "https://softechinfra.com/blog/example-post#webpage",
"about": [
{
"@type": "Organization",
"name": "Anthropic",
"sameAs": [
"https://www.wikidata.org/wiki/Q103138563",
"https://www.anthropic.com"
]
},
{
"@type": "SoftwareApplication",
"name": "Claude",
"sameAs": [ "https://www.wikidata.org/wiki/Q116621012" ]
}
]
}
</script>
Wikidata QIDs are the gold standard. Look up an entity at wikidata.org, grab the Q-number from the URL, drop it in. AI engines that consult Wikidata as a knowledge layer (which most do) now have a confident anchor.
## How the 5 layers compare on cost vs lift
| Layer | Setup time | Per-page time | Citation lift (our test) |
|---|---|---|---|
| 1. Organization | 45 min (once) | 0 min | +1-2 queries (entity disambiguation) |
| 2. BlogPosting | 60-90 min (template) | 0 min (auto) | +1 query (page-level entity) |
| 3. FAQPage | 15 min (template) | 15-20 min | +3-5 queries (largest single lift) |
| 4. Speakable | 5 min (template) | 2 min | +0-1 query (cleaner snippets) |
| 5. SameAs bridge | 10 min (template) | 10-15 min | +1-2 queries (entity confidence) |
_app.tsx or root layout head. Validate with the Google Rich Results Test — should parse with zero errors. Cite-tracker queries: 0/14 cited.class="tldr" and add the Speakable JSON-LD. 72-hour window: cite-tracker jumped to 9/14. We attribute most of the lift to Layer 3, but Speakable correlates with cleaner extracted snippets.about WebPage block with sameAs Wikidata IDs for the 3-4 named entities the post discusses. Day 7 cite-tracker: 11/14. Some of this is freshness; some is entity disambiguation.- Organization block in site head with stable
@id, founder URL, sameAs profiles - BlogPosting on every blog URL referencing the Organization by
@id - FAQPage with 5–7 Q-nodes mirroring visible page content verbatim
- Speakable WebPage block with cssSelector pointing at TL;DR class
- About-WebPage block with sameAs Wikidata QIDs for 3–5 named entities
- All 5 blocks pass the Schema.org validator with zero errors
- Google Rich Results Test passes for FAQPage on government/health sites only (most sites no longer eligible)
- One end-to-end Perplexity probe asking a question the FAQ answers — citation tracked in your sheet
CollectionPage instead. If the page is gated (login required), AI engines never see it; skip the entire stack and put that energy into a public summary page that links to the gated content.
We also skip Layer 5 on pages that don't reference any named entity outside the company itself. A "contact us" page does not benefit from sameAs. A blog post about Anthropic, Claude, OpenAI, and Perplexity benefits enormously.
## Real client example — a Bangalore SaaS marketing page
In August 2025 we shipped this stack on a Bangalore-based SaaS client's homepage. Their target query was "[product category] for Indian SMBs". Pre-stack: 0 citations across our 22-query attribution-tracker probe set. Post-stack at day 14: 13 of 22 queries returned a Perplexity citation pointing at their homepage; 4 of 22 returned a citation pointing at a deeper service page that inherited the Organization root.
The math the founder cared about: those 13 queries averaged ~280 monthly searches each. A 2% click-through rate from a Perplexity citation surface delivers ~73 monthly visits. At their inbound conversion rate of 4.1%, that is 3 demo bookings a month from work that took an engineer 2 days. Their existing Google paid spend on the same queries was costing roughly ₹420 per booked demo. The schema stack made the math work in their favour for the first time.
Hrishikesh, our CTO, kept asking: "is this attribution real, or are we cherry-picking?" The honest answer: we ran the same probe set against four control client sites that did not get the stack in the same window. Two of them gained 1-2 citations from natural freshness; none gained more than that. The stack effect is real. It is not the only variable. It is the one we can ship today, on every page, in 30 minutes.
## A common question on cost
We get asked: how much does the 5-layer stack cost to add to an existing site? On a Next.js or WordPress site with template-level head injection, the Organization (Layer 1) is a one-time 45-minute job. BlogPosting (Layer 2) is a 60-90 minute template change to map post fields into the JSON-LD. FAQPage (Layer 3), Speakable (Layer 4), and the SameAs bridge (Layer 5) are per-page work — collectively about 25-30 minutes per page if you have the FAQ content already, longer if you have to write it.
For a 40-page site, the full rollout is roughly a person-week. For a 400-page site with templated content, the same person-week handles it via template changes plus a few CSV-driven scripts that batch the per-page schemas.
## FAQ
### What is the 5-layer schema stack?
Organization, BlogPosting or Service, FAQPage, Speakable, and a SameAs entity bridge — five JSON-LD layers that together describe a page to AI engines. The first two are foundational; the last three are inert patches you bolt on without touching the visible page template.
### Does FAQPage schema still work in 2025?
Google killed the FAQ rich result dropdown in May 2026 but explicitly kept reading FAQPage structured data for AI Overviews and entity understanding. Independent Perplexity Sonar testing shows pages with 3+ FAQPage Q-nodes get cited at 41% vs 24% for controls.
### Why use @id references between schema blocks?
Because AI engines build entity graphs. If your BlogPosting inlines a fresh Organization with slightly different field values, the engine sees two organisations. Reference Layer 1 by @id from every per-page block and the graph stays clean.
### Is Speakable schema worth shipping?
It is two minutes of work and a free signal that your TL;DR is the extractable answer. Voice surfaces increasingly route through AI engines that respect Speakable. We ship it on every page; the cost is too low to skip.
### How do I find a Wikidata QID for an entity?
Search for the entity at wikidata.org. The URL of the entity page contains the Q-number (e.g., Q103138563 for Anthropic). Drop that into the sameAs array along with the official site URL.
### What if my CMS doesn't allow head-injection per page?
You have two options. WordPress plugins like Yoast and RankMath let you inject per-post JSON-LD from the editor sidebar. For custom CMSes, expose a metadata field on each post that holds raw JSON-LD and render it in the template head. Either way, do not paste schema into the visible body — search engines parse it, but it confuses some renderers.
### Does adding too much schema hurt rankings?
Not in our testing, but there is a complexity cost. If you cannot keep the JSON-LD in sync with visible content (e.g., editors update the FAQ on the page but not the schema), the schema goes stale and engines flag drift. Ship the layers your team can maintain.
Want this 5-layer schema stack implemented site-wide?
We ship the full Organization + BlogPosting + FAQPage + Speakable + SameAs stack across your site, plus a Perplexity citation tracker that measures the lift in week 2. Typical engagement: 5 working days for a 40-page site. Suitable if you publish at least 1-2 posts a month and want AI citations to start showing up in your attribution dashboard.
Book a Schema Audit
