FAQPage schema can expand your SERP listing with accordion Q&A and signal answer authority to AI assistants — but half of all implementations violate Google's guidelines.

<script type="application/ld+json"> tag in the page component — generateMetadata cannot inject structured data.FAQPage schema is one of the most misunderstood structured data types in SEO. When Google first expanded FAQ rich results in 2019, every SEO blog instructed site owners to add it everywhere. Now, after Google's September 2023 rollback, half the sites still running this markup are either doing it wrong, applying it in the wrong places, or missing the more valuable use case entirely: AI citation.
This guide gives you the exact JSON-LD, explains every rule Google enforces, shows you how to implement it in Next.js and WordPress, and explains why FAQPage schema is worth getting right even when Google never shows the visual accordion.
FAQPage is a schema.org type that marks up a page as a list of questions with their accepted answers. When Google validates and decides to display the markup, it renders an expandable accordion below your organic listing — each question visible as a clickable row that expands to show the answer inline in the SERP, without the user needing to click through to your page.
That accordion has two distinct values:
In traditional Google Search: the visual FAQ accordion expands your SERP footprint significantly. A single listing with five FAQ questions can occupy four to five times the vertical space of a standard blue link, pushing competitors below the fold.
In AI-powered search: even when Google does not render the visual accordion, the structured Q&A markup makes your content dramatically easier for AI assistants to parse, extract, and cite. AI systems like ChatGPT (with web search), Perplexity, and Google's AI Overviews can read your Question and Answer nodes directly, without needing to infer structure from prose. This is a first-class GEO (Generative Engine Optimization) signal.
Google's guidelines are unambiguous: FAQPage schema should only appear on pages whose primary purpose is presenting a list of questions with their answers. That means a standalone FAQ page, a help centre page built around Q&A, or a product page that is primarily structured as questions and answers.
What it does not mean:
Google's quality raters are trained to flag FAQPage markup on pages where the Q&A content is not the dominant purpose of the page. The consequence is not just that the rich result doesn't display — Google can suppress all structured data rich results across a domain if misuse is systemic enough.
The rule of thumb: if someone landing on this page from Google would describe it as a FAQ page, the markup is appropriate. If they would describe it as a product page, a blog post, or a landing page that happens to have some questions, it is not.
Below is a valid, complete FAQPage JSON-LD implementation. The example uses a question relevant to AI search readiness — a good test case because the answer is substantive enough to pass Google's length requirements and authoritative enough to be cited by AI assistants.
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "What is AI search readiness?",
"acceptedAnswer": {
"@type": "Answer",
"text": "AI search readiness refers to how well your website is configured to be found, crawled, and cited by AI assistants such as ChatGPT, Perplexity, and Claude. It includes robots.txt configuration for AI crawlers, presence of llms.txt, structured data markup, named author credentials, and answer-first content structure."
}
},
{
"@type": "Question",
"name": "How do I check if my site is visible to AI search engines?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Run an AI search readiness audit using a tool like seo.yatna.ai. The audit checks your robots.txt for AI crawler rules, verifies the presence of llms.txt, analyses your structured data markup, evaluates named author signals for E-E-A-T, and scores your content structure for answer-first formatting. A score above 70 indicates strong AI visibility."
}
},
{
"@type": "Question",
"name": "Does FAQPage schema improve Google rankings?",
"acceptedAnswer": {
"@type": "Answer",
"text": "FAQPage schema is not a direct ranking factor. It improves how your result appears in the SERP — the FAQ accordion expands your listing's visual footprint and can increase click-through rate. Higher CTR indirectly signals relevance to Google. The more significant benefit in 2026 is AI citation: FAQPage schema helps AI assistants extract and attribute your Q&A pairs directly, increasing your presence in AI-generated answers."
}
}
]
}
Key decisions in this example:
"name" on each Question matches exactly the visible heading text on the page — this is required, not optional"text" value in acceptedAnswer is the complete answer, not a truncated teaser"text" values — plain text only; HTML inside JSON-LD is invalid and will cause the markup to fail validationThe "name" property of each Question node must match the visible question text on the page, character for character (case differences are tolerated, but wording differences are not). If your visible heading says "How does the free trial work?" but your schema says "What does the free trial include?", Google treats the markup as inconsistent with page content — a misrepresentation that triggers suppression.
Fix: Copy the exact visible heading text into the "name" field. If you need to change the question wording, change it in both the HTML and the schema.
Google expects answers that are genuinely useful — not two-sentence fillers. While there is no published hard minimum, audits consistently show that answers under 50 words rarely generate rich results, and answers under 30 words are almost always suppressed. More importantly, for AI citation purposes, a short answer provides insufficient context for an AI assistant to attribute and cite meaningfully.
Fix: Write each answer as a complete, standalone response. Aim for 60 to 150 words per answer. The answer should be comprehensible without reading the rest of the page.
A "frequently asked questions" page with a single question is not a FAQ page — it is a page with a question. Google's guidelines and the schema.org specification both describe FAQPage as a collection of questions. Single-question pages with FAQPage markup are flagged by the Rich Results Test and suppressed in practice.
Fix: Have at least three questions on any page using FAQPage schema. If you only have one question, consider HowTo schema if the answer is procedural, or simply use Article schema instead.
acceptedAnswer text is different from visible page contentThis is a form of cloaking — presenting different content to Google's structured data parser than to the user. If a user reads your page and the answer visible on screen says one thing, but the "text" value in your JSON-LD says something else, Google will detect the discrepancy. This applies to both expanded and collapsed accordion content.
Fix: The "text" value should be either identical to the visible answer text or a plain-text version of it (with HTML removed). It must not be a summary, a rewrite, or an expanded version that isn't visible to users.
If the same questions and answers appear in FAQPage schema on five different pages of your site, Google's crawlers detect the duplication. This is treated similarly to duplicate content: the markup loses authority, and rich results may be suppressed across all the duplicating pages. This pattern is common on sites that add a global FAQ section to every product page using a shared component.
Fix: Each FAQ page should have unique questions specific to that page's topic. Shared global FAQs should live on a single canonical FAQ page and not be repeated in schema across the site.
The most important implementation note for Next.js 13+ and App Router: JSON-LD structured data cannot be injected via generateMetadata. That function manages <meta> tags and <title> — it does not produce <script> tags. FAQPage JSON-LD must be a <script> element returned directly from your page component.
// app/faq/page.tsx
export default function FAQPage() {
const faqSchema = {
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "What does an SEO audit check?",
"acceptedAnswer": {
"@type": "Answer",
"text": "An SEO audit checks technical SEO factors (crawlability, sitemap, robots.txt), on-page SEO (title tags, meta descriptions, heading structure), schema markup validity, Core Web Vitals performance, E-E-A-T signals (named authors, credentials, contact information), and AI search readiness including robots.txt rules for AI crawlers and llms.txt presence."
}
},
{
"@type": "Question",
"name": "How long does an SEO audit take?",
"acceptedAnswer": {
"@type": "Answer",
"text": "An automated SEO audit using seo.yatna.ai takes between two and five minutes for most sites. The audit crawls up to 500 pages depending on your plan tier, runs five AI analysis agents in parallel, and generates a full report with scores, findings, and prioritised recommendations."
}
}
]
};
return (
<>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(faqSchema) }}
/>
{/* rest of FAQ page content */}
</>
);
}
Note: the dangerouslySetInnerHTML call here is safe because faqSchema is a server-side constant defined in the same file — it is never populated from user input or external data. This is the same pattern used for all structured data in Next.js App Router.
For a reusable pattern across multiple pages, extract the schema injection into a SchemaScript component and pass the typed schema object as a prop — the same pattern described in the SoftwareApplication schema guide.
If you need the FAQ schema on a dynamic page where questions are loaded from a CMS or database, build the mainEntity array server-side in the page component (which is a server component by default in App Router), then pass the completed array to the <script> tag. Never build or modify schema in a client component — structured data should always be rendered on the server so it is present in the HTML that Googlebot receives.
Using Yoast SEO
Yoast SEO (free version) includes a FAQ block for the block editor. Add the Yoast FAQ block to any post or page, fill in your questions and answers using the block's fields, and Yoast automatically generates FAQPage JSON-LD and injects it into the page's <head>. The generated markup correctly matches the visible block content, eliminating the mismatch error.
One caveat: Yoast's FAQ block is for content-level FAQ sections. If you want FAQPage schema on a page without a visible Yoast FAQ block, you will need a code snippet or a dedicated schema plugin.
Manual injection via functions.php
For precise control, add the schema via a WordPress hook scoped to your FAQ page:
function add_faqpage_schema() {
// Only run on the specific FAQ page — adjust the condition to match your setup
if ( ! is_page( 'faq' ) ) {
return;
}
$schema = array(
'@context' => 'https://schema.org',
'@type' => 'FAQPage',
'mainEntity' => array(
array(
'@type' => 'Question',
'name' => 'What does an SEO audit check?',
'acceptedAnswer' => array(
'@type' => 'Answer',
'text' => 'An SEO audit checks technical SEO factors, on-page elements, schema markup, Core Web Vitals, E-E-A-T signals, and AI search readiness including robots.txt configuration for AI crawlers.',
),
),
),
);
echo '<script type="application/ld+json">'
. wp_json_encode( $schema )
. '</script>' . "\n";
}
add_action( 'wp_head', 'add_faqpage_schema' );
Replace the hardcoded questions array with dynamic content pulled from an ACF field or custom post type if your FAQ content is managed through the CMS rather than the theme.
In September 2023, Google announced a significant reduction in FAQ rich result display. The change was explicit: FAQ rich results would be limited to "authoritative government and health websites." The accordion in the SERP is now rarely visible for commercial or editorial sites, regardless of whether the markup is technically correct.
This does not mean FAQPage schema is no longer worth implementing. It means the value calculation has shifted:
| Signal | Pre-2023 | Post-2023 |
|---|---|---|
| Visual SERP accordion for commercial sites | Common | Rare |
| Visual SERP accordion for health/government | Common | Still common |
| AI assistant citation boost | Indirect | Direct and growing |
| Structured data quality signal | Minor | More significant |
The practical implication: implement FAQPage schema correctly on pages that genuinely are FAQ pages, not to chase the accordion in Google's SERP, but to make your Q&A content machine-readable for AI systems. The AI citation use case is growing faster than any other structured data benefit in 2026.
GEO — Generative Engine Optimization — is the practice of making your content more easily found, parsed, and cited by AI assistants. FAQPage schema is one of the clearest GEO signals available to a content publisher.
When an AI assistant like Perplexity, ChatGPT with web search, or Google's AI Overview processes a page, it has two modes of understanding:
Question.name and Answer.text nodes directly, with high confidence that these represent the site's canonical Q&A pairsFAQPage schema gives AI systems mode 2 for your content. The "name" field is your exact question. The "text" field is your exact answer. An AI assistant that finds this markup can extract and cite your Q&A pairs with attribution accuracy that prose alone cannot match.
The practical implication: even though Google's visual accordion is suppressed for most commercial sites, implementing technically correct FAQPage schema on genuine FAQ pages gives your content a GEO advantage over competitors who rely on unstructured prose for their Q&A content.
Can I have multiple FAQPage schemas on a single page?
No. A page should have one FAQPage schema with all its questions in the mainEntity array. Multiple separate FAQPage objects on one page is invalid — the correct structure is a single FAQPage with an array of Question objects.
Does the FAQ content need to be visible on the page?
Yes. Every question and answer in your schema must be visible to the user on the page. Hidden content (display:none or content loaded exclusively via JavaScript that Googlebot cannot execute) does not qualify. The schema must reflect what a user actually sees.
Can I use FAQPage schema on a blog post?
Only if the blog post's primary purpose is presenting questions and answers — which would make it functionally a FAQ page regardless of what URL path it lives at. A blog post that covers a topic and includes a brief FAQ section at the bottom should not use FAQPage schema; it should use Article or BlogPosting schema on the article, and rely on heading structure for any Q&A section.
How many questions should I include?
There is no documented maximum. Google's Rich Results Test will process FAQPage schemas with any number of questions. In practice, three to ten questions is the standard range — enough to make the FAQ substantive, not so many that the page becomes unwieldy. For AI citation purposes, more thorough coverage of a topic with more questions can be beneficial.
What happens if I implement FAQPage schema incorrectly?
The most common outcome is that the rich result simply does not appear — the markup is ignored. More serious misuse (schema on pages where the content doesn't match, or systematic misapplication across a site) can result in Google suppressing all rich results from the domain until the issues are corrected and a reconsideration is processed via Search Console.
After implementing your FAQPage markup, test it before Googlebot visits:
Question and Answer nodes appear in the detected properties panelFor a more thorough check that catches the mismatches and content issues Google's test tool sometimes misses, use our schema validator:
Validate your FAQPage schema — free schema checker at seo.yatna.ai/tools/schema-validator
The validator checks for answer length, question–heading text matching, duplicate questions across pages, and HTML inside answer text — the full set of errors that cause Google and AI assistants to reject or downgrade FAQPage markup.
About the Author

Ishan Sharma
Head of SEO & AI Search Strategy
Ishan Sharma is Head of SEO & AI Search Strategy at seo.yatna.ai. With over 10 years of technical SEO experience across SaaS, e-commerce, and media brands, he specialises in schema markup, Core Web Vitals, and the emerging discipline of Generative Engine Optimisation (GEO). Ishan has audited over 2,000 websites and writes extensively about how structured data and AI readiness signals determine which sites get cited by ChatGPT, Perplexity, and Claude. He is a contributor to Search Engine Journal and speaks regularly at BrightonSEO.