返回文章列表
Engineering2026年4月24日·22 分鐘閱讀

How to Do FAQ Schema: Let AI Take Your Answer Verbatim

Organization schema tells AI "who you are". FAQPage tells AI "when a user asks X, your answer is Y". Here's how we restructured our B2B service pages into the kind of structure AI loves to quote — with full Next.js implementation.

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:

  1. Understanding what the page is about
  2. 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 customSoftwareFAQs source 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:

SchemaPriorityWhy
OrganizationMust-doThe baseline for "who are you"
FAQPageMain driverAI's favorite format, highest CTR
ServiceRecommendedBoost for service pages, smaller than FAQPage
BreadcrumbListRecommendedGood for SEO, limited for AEO
ProductDependsOnly if you have SKUs / pricing
ArticleDependsBlog 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

AEOJSON-LDFAQPageNext.jsSchema.org
更多文章

延伸閱讀