The previous post Three Things to Do First for AEO stopped at Organization for JSON-LD — telling AI who you are. This post goes one layer deeper: FAQPage — telling AI "when someone asks X, your answer is Y". Done right, ChatGPT will quote your FAQ word-for-word, not paraphrase.
Why FAQPage Matters for AEO
When AI summarizes a page, it's doing two things:
- Understanding what the page is about
- Extracting the snippet most relevant to the user's question
Plain text is an unlabeled soup — AI has to guess which sentences are questions, which are answers, which are conclusion, which are setup. Wrong guess = wrong citation, or no citation.
FAQPage schema hands AI the "question → answer" pairs directly:
{
"@type": "Question",
"name": "How long does a custom system typically take to launch?",
"acceptedAnswer": {
"@type": "Answer",
"text": "A typical B2B internal system launches as MVP in 3–6 months..."
}
}
When AI sees this structure, extraction cost is zero — it doesn't guess or infer, it just takes. Especially valuable for B2B, because B2B decision-makers literally ask things like "how long does this take", "how much to integrate", "does it talk to our existing ERP".
Three Decisions to Make Before You Code
After doing FAQPage on our own site, three decisions need to be made up front:
1. Which pages get FAQPage?
Not every page. Our rule:
- Yes: service pages, product pages, landing pages, pricing pages
- No: About, team, blog listing pages
- Depends: individual blog posts. If the structure is Q&A, yes; if it's a long essay, forcing it into Q&A distorts the content.
Why: FAQPage is for readers with specific questions. Service pages fit; blog posts usually don't.
2. Write the question the way users actually ask, not the way you describe it
Wrong:
Q: What is included in our custom software development service offering?
That's corporate-speak. Users don't talk like that.
Right:
Q: How long does a custom system typically take to launch?
Q: What's the budget range for an ERP integration project?
Q: Do you maintain the system after launch, or do we?
These are sentences users actually type into ChatGPT.
Can't think of them? Cheap trick: type "I'm looking for XX service" into ChatGPT and see what follow-up questions it auto-suggests. Those are the questions you need to answer.
3. First sentence of every answer = the conclusion. Then supporting detail.
AI typically extracts the first one or two sentences. So:
A: A typical B2B internal system launches as MVP in 3–6 months.
Complex integrations (cross-ERP / CRM / multi-region) usually run 6–9 months.
Actual timeline depends on requirements clarity, existing tech debt, data migration scope.
Sentence 1: concrete numbers inside 30 words. Sentence 2: conditions. Sentence 3: variables. AI will probably only grab sentence 1 — and that's fine, because sentence 1 alone answers the question.
Counterintuitive point: traditional business writing loves buildup and saves the punchline for last. For AEO, that's backwards — AI grabs the first two sentences and moves on. Your key conclusion, saved for the end, never gets extracted.
B2B Service Page Implementation: Full Example
Using our own "Custom Software Development" service page. Next.js App Router + TypeScript.
Step 1: Define the FAQ Data
src/lib/faqs/custom-software.ts:
export interface FAQ {
question: string;
answer: string;
}
export const customSoftwareFAQs: FAQ[] = [
{
question: 'How long does a custom system typically take to launch?',
answer: 'A typical B2B internal system launches as MVP in 3–6 months; complex integrations take 6–9 months. Actual timeline depends on requirements clarity, existing tech debt, and data migration scope.',
},
{
question: 'What\'s the budget range for an ERP integration project?',
answer: 'Mid-sized B2B ERP integration projects typically run US$25K–100K. Below $25K is usually a single-point connection; above $100K usually means building a custom ERP or deeply integrating multiple systems. We offer free scope assessment.',
},
{
question: 'Do you maintain the system after launch, or do we?',
answer: 'Either works. Most clients pick a three-month handover — we maintain for the first three months, then hand off to the internal team; some prefer a long-term retainer. Handover includes full technical documentation and a handover session.',
},
{
question: 'Can you integrate with our existing ERP / CRM?',
answer: 'We\'ve integrated the major ERPs (SAP, Oracle, Dingxin, Chenghang, Odoo) and CRMs (Salesforce, HubSpot, Zoho). For legacy systems with strict API limits, we use DATA-BEE as a data-layer bridge.',
},
];
Step 2: Schema Generator
src/lib/schema.ts (continued from the previous post):
import type { FAQ } from './faqs/custom-software';
export function getFAQPageSchema(faqs: FAQ[]) {
return {
'@context': 'https://schema.org',
'@type': 'FAQPage',
mainEntity: faqs.map((faq) => ({
'@type': 'Question',
name: faq.question,
acceptedAnswer: {
'@type': 'Answer',
text: faq.answer,
},
})),
};
}
Step 3: Use It on the Service Page
src/app/services/custom-software/page.tsx:
import { JsonLd } from '@/components/JsonLd';
import { getFAQPageSchema } from '@/lib/schema';
import { customSoftwareFAQs } from '@/lib/faqs/custom-software';
export default function CustomSoftwarePage() {
return (
<>
<JsonLd data={getFAQPageSchema(customSoftwareFAQs)} />
{/* main service page content */}
<section className="py-20">
<h2 className="text-3xl font-bold mb-10">Frequently Asked Questions</h2>
<div className="space-y-4">
{customSoftwareFAQs.map((faq) => (
<details key={faq.question} className="group border-b pb-4">
<summary className="text-lg font-medium cursor-pointer">
{faq.question}
</summary>
<p className="mt-3 text-neutral-600 leading-relaxed">
{faq.answer}
</p>
</details>
))}
</div>
</section>
</>
);
}
Two traps to watch:
- JSON-LD content and visible FAQ must match. Questions in the schema must appear visibly on the page. Schema with 10 Qs but page only shows 3 = cloaking, and Google can demote you. Sharing one
customSoftwareFAQssource avoids this. - Default-collapsed
<details>is fine. AI crawlers see the fully rendered DOM regardless of visual collapse state. Collapse only affects UX, not schema validity.
Step 4: Verify
After deploy, feed the service-page URL to Rich Results Test. You should see FAQPage detected with each Q&A listed. If some are missing, it's usually JSON/page text mismatch — check the data source.
One Result: Two Weeks Later
Two weeks after shipping:
- ChatGPT, asked "how long does Heiso's custom software development take", answered with the verbatim first line of FAQ #1 ("3–6 months to launch MVP") and cited Heiso as source
- Perplexity cited the FAQ answer when asked similar questions, with link
- Google Search Console FAQ rich-result impressions went from 0 to 1,400+/month
Item #3 is a bonus SEO dividend — FAQPage eats both Google rich-result placements and AI citations. One schema, two wins.
B2B Schema Priority
Not every schema is worth doing. Our validated B2B priority:
| Schema | Priority | Why |
|---|---|---|
Organization | Must-do | The baseline for "who are you" |
FAQPage | Main driver | AI's favorite format, highest CTR |
Service | Recommended | Boost for service pages, smaller than FAQPage |
BreadcrumbList | Recommended | Good for SEO, limited for AEO |
Product | Depends | Only if you have SKUs / pricing |
Article | Depends | Blog posts can use it, limited B2B lead-gen effect |
Get Organization and FAQPage right and you capture 70% of the AEO schema upside.
Closing
FAQPage isn't a "drop it in and you're done" schema — what questions to pick, how to structure the answer, how to keep the visual UI in sync, all require engineering judgment. But the compound is strong: one design, two sources of traffic (AEO citations + SEO rich results), no ad spend, no link-building.
Want us to rework your service page FAQs into the "AI quotes us directly" level? Happy to chat → Book a consultation