STRUCTURED DATA

FAQ Schema Markup: How to Implement FAQPage Structured Data Correctly

FAQPage schema markup tells Google that your page contains structured Q&A content, making it eligible for FAQ Rich Results in the SERP. Here's a complete implementation guide covering JSON-LD structure, eligibility requirements, common errors, and CMS-specific implementation paths.

FAQPage schema markup is JSON-LD structured data that identifies the question-and-answer pairs on a page to Google, making the page eligible for FAQ Rich Results — the expandable question-and-answer blocks that appear beneath some search results, displaying directly in the SERP without requiring the user to click through.

The business case for FAQ schema is CTR. FAQ Rich Results expand the vertical footprint of your search result in the SERP, making it visually larger than a standard result. Users see the questions (and can expand to see the answers) directly in the SERP — which increases click-through for users who want to read the full content and also serves users who get their answer from the snippet itself. Studies show FAQ Rich Results can improve organic CTR by 20–30% at the same ranking position.

The JSON-LD structure

FAQPage schema is implemented as a <script type="application/ld+json"> block in the <head> or <body> of the page. The required structure:

{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "What is FAQ schema markup?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "FAQ schema markup is JSON-LD structured data that marks up question-and-answer content on a page, making it eligible for FAQ Rich Results in Google's SERP."
      }
    },
    {
      "@type": "Question",
      "name": "How many questions should a FAQ schema have?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Google recommends at least 2 question-answer pairs. There is no documented maximum, but practical implementations typically include 3–10 questions."
      }
    }
  ]
}

Key properties:

  • @type: "FAQPage" — identifies the page type
  • mainEntity — array of Question objects; must contain at least 2 questions
  • "@type": "Question" — each question object
  • name — the question text; should match the visible question on the page
  • acceptedAnswer.text — the answer text; can include basic HTML (Google renders <a>, <b>, <em>, <strong>, <br>, <ul>, <ol>, <li>)

Google's eligibility requirements

Not every page with FAQ content will earn FAQ Rich Results. Google's eligibility requirements:

Content must be genuinely FAQ. The page must have real question-and-answer content that answers questions users actually ask about the topic. Pages that add a superficial FAQ section filled with keyword-stuffed questions and thin answers to earn Rich Results often don't earn them — and risk the manual action Google has issued for structured data spam.

Questions must match visible content. The name (question text) and acceptedAnswer.text in the JSON-LD must match content that is visibly rendered on the page. Google does not grant Rich Results for hidden structured data — if the FAQ is visible only in the JSON-LD and not rendered in the HTML, it will not earn the Rich Result and may trigger a structured data spam action.

Answers must be substantive. Answers under 20–30 characters are too short to earn FAQ Rich Results. Each accepted answer should be a complete, informative response to the question — not a single word or phrase.

The page must be indexable. Pages with noindex meta tags, pages blocked by robots.txt, or pages that return non-200 HTTP responses are not eligible for any Rich Results.

The site must not be policy-violating. Google restricts FAQ Rich Results from certain content categories: content promoting violence or cruelty; hate speech; explicit content; and sites with a history of deceptive or spam behaviour.

Common implementation errors

The most frequent FAQPage schema errors found in technical audits:

Missing @context. Every JSON-LD block must include "@context": "https://schema.org". Without it, the structured data is invalid.

name property on Answer instead of Question. The name property goes on the Question object (it contains the question text). The Answer object uses text (inside acceptedAnswer). A common mistake is putting the question in "name" on the Answer object instead.

acceptedAnswer missing the @type: "Answer" wrapper. The accepted answer must be an object with "@type": "Answer" and a "text" property. A common shortcut is writing the answer as a plain string directly under acceptedAnswer — this is invalid.

JSON syntax errors. Missing commas between array elements, unmatched brackets, and unescaped special characters (particularly quotation marks inside answer text) are the most common JSON syntax errors. Validate the JSON at schema.org/docs/validator or Google's Rich Results Test before deployment.

Invisible FAQ content. Implementing FAQPage JSON-LD on a page where the FAQ section is hidden with display: none or visibility: hidden CSS will not earn Rich Results. The content must be visible when the page loads.

Duplicate questions. Duplicate name values in the mainEntity array (two questions with the same text) are invalid. Each question must be unique.

Questions and answers mismatched. If the visible page content shows Q1 → A1 → Q2 → A2 but the JSON-LD shows different question text, this mismatch is a structured data quality signal. Keep the JSON-LD name property exactly matching the visible question heading.

CMS implementation patterns

Each CMS has a different path to implementing FAQPage JSON-LD correctly.

WordPress with Yoast SEO or Rank Math. Both plugins provide a native FAQ block for Gutenberg that generates FAQPage JSON-LD automatically when you add questions and answers using the FAQ block. The FAQ block renders the content visibly on the page and injects the matching JSON-LD. This is the recommended approach — it guarantees the visible content and structured data match. For themes using Classic Editor or page builders (Elementor, Divi): add the JSON-LD via a custom HTML block or field, or use a dedicated FAQ schema plugin.

Next.js App Router. Output FAQPage JSON-LD in a server component using dangerouslySetInnerHTML:

const faqSchema = {
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": faqs.map(faq => ({
    "@type": "Question",
    "name": faq.question,
    "acceptedAnswer": { "@type": "Answer", "text": faq.answer }
  }))
};
// In JSX:
<script type="application/ld+json"
  dangerouslySetInnerHTML={{ __html: JSON.stringify(faqSchema) }} />

The faqs array must come from the server (props, CMS API response, or static data) — not from useState or useEffect, which would make the JSON-LD appear only after client-side hydration and might not be present in the initial HTML that Googlebot processes.

Shopify. Add FAQPage JSON-LD via a Liquid snippet in the page template or via a custom Metafield approach. Create a JSON Metafield on the page/product/blog post with the FAQ data structure, then render the JSON-LD via a Liquid snippet reading from the Metafield. Alternatively, use a Shopify FAQ app that generates the structured data and renders it server-side in the theme.

Webflow. Add FAQPage JSON-LD via Webflow's Page Settings → Custom Code → <head> code section (per-page) or the Site Settings → Custom Code → Footer Code section. Webflow doesn't have native FAQ structured data support, so the JSON-LD must be manually added or injected via a CMS collection field mapped to a custom code embed.

Validating FAQPage structured data

After implementation, validate the structured data before Google processes it:

  1. Google Rich Results Test (search.google.com/test/rich-results) — paste the page URL to see which rich results Google finds eligible, with property-level error detail for invalid properties.
  2. Schema.org Validator (validator.schema.org) — validates JSON-LD syntax and schema.org property correctness without Google's specific Rich Results requirements.
  3. DeepSEOAnalysis — crawls the rendered HTML and validates all JSON-LD blocks against Google's Rich Results specifications, flagging specific property errors (missing @type: "Answer" wrapper, questions under 30 characters, JSON syntax errors, visible/JSON-LD content mismatch) with the corrected JSON-LD snippet for each finding.

The audit specifically checks the rendering gap: it compares the raw HTML response (what Googlebot sees on first pass) against the fully rendered DOM (what appears after JavaScript executes). If the FAQ content and its JSON-LD only appear after client-side JavaScript runs, the audit flags this as a rendering gap — Googlebot may or may not process the FAQ schema depending on its crawl budget for JavaScript rendering.


Frequently asked questions

Does every page need FAQ schema?

No. FAQPage schema is appropriate for pages that genuinely have FAQ content — typically product pages, service pages, help documentation, and blog posts that include a dedicated Q&A section. Don't add a superficial FAQ section to every page solely to earn Rich Results — Google's guidance specifically warns against this. The FAQ questions should be questions users actually ask, and the answers should provide genuine value. Pillar pages and how-to guides often naturally have FAQ sections that warrant FAQPage schema; category pages and most landing pages typically don't.

Will FAQ schema always show FAQ Rich Results?

No. Google determines whether to show FAQ Rich Results based on multiple signals: the page's overall quality and authority, whether the page content matches the structured data, whether the SERP already has FAQ Rich Results from another source for the same query, and the query's commercial intent. Google has progressively reduced the display of FAQ Rich Results since mid-2023 — they are less commonly shown for generic commercial queries and more commonly shown for specific informational queries where the FAQ content adds genuine SERP-level value. Implementing FAQPage schema makes a page eligible for FAQ Rich Results; it doesn't guarantee them.

Should FAQ answers in the schema be the full answer or a summary?

Full answer. The acceptedAnswer.text in the JSON-LD should be the complete answer to the question, matching the visible answer on the page. Google displays only the first few sentences in the FAQ Rich Result dropdown — but the complete answer in the structured data provides more signal for relevance and eligibility. Don't truncate answers in the JSON-LD to a shorter version than what appears on the page — the mismatch between visible and structured data content is a quality signal issue.

Can FAQ schema appear alongside other structured data on the same page?

Yes. A page can have multiple JSON-LD blocks: an Article schema, a FAQPage schema, and a BreadcrumbList schema can all coexist. Each block is independent, and Google processes each separately. The constraint is that each JSON-LD block should describe content that is actually on the page — a page with Article + FAQPage + BreadcrumbList schema should have article content, visible FAQ content, and breadcrumb navigation rendered in the HTML. Don't add schema types for content that isn't on the page.

Run DeepSEOAnalysis on your own site.

Free, no signup. Technical SEO, Core Web Vitals, structured data, and AI visibility in one report.

Run a free audit →