FAQ Schema Generator
Create Google FAQPage JSON-LD from your Q&A pairs. Paste plain text or simple HTML in answers.
Policy Warnings — These may disqualify your FAQ rich results:
FAQ Schema: What It Actually Does and How to Stop Wasting It
If you have ever seen those expandable question-and-answer dropdowns directly in Google search results — the ones that sit right below a blue link and let users expand answers without clicking — that is FAQ rich results in action. The mechanism behind them is a small block of JSON-LD code called FAQPage schema markup, and it costs you nothing but five minutes of effort.
What most people get wrong is assuming it is a set-and-forget trick. It is not. Google has quietly tightened its policies, and sites that once enjoyed FAQ rich results have had them silently stripped away because of markup issues, policy violations, or content that technically validates but fails Google's quality signals. This guide cuts through the noise.
Why FAQ Schema Still Matters in 2024
Rich results are shrinking. Google has deprecated review snippets for many entity types, pulled back recipe cards on some surfaces, and restricted FAQ rich results to what it calls "authoritative government and health websites" in the main search results. Before you close this tab — that restriction applies to the blue-link context, not to all surfaces. FAQ schema still fires in voice search (Google Assistant reads structured answers directly), in some featured snippets, in Google Discover, and in certain regional result pages. Plus, having clean structured data signals technical quality to crawlers regardless of whether a rich result is visually rendered.
In short: implement it correctly on FAQ-style content, stop relying on it as your primary CTR driver, and treat the markup as a technical hygiene baseline.
The Structure Google Actually Requires
The FAQPage schema has a rigid hierarchy. The top-level type must be FAQPage, connected to https://schema.org as context. Each question lives in a Question entity nested inside the mainEntity array. Each Question must contain a name property (the question text) and an acceptedAnswer object of type Answer, which holds a text property. That is the minimum viable schema.
What trips people up is the text field in acceptedAnswer. Google explicitly permits a subset of HTML tags inside it: <a>, <br>, <em>, <p>, <strong>, <ul>, <ol>, <li>, and <h2> through <h6>. Using unsupported tags like <div> or <span> does not break parsing, but those elements get ignored. Injecting JavaScript event attributes or <script> tags inside the answer text will get your markup flagged or rejected outright.
Character Escaping: The Silent Killer
JSON-LD sits inside a <script> tag, which means your answer text must be valid JSON. The most common breakage: unescaped double quotes in the answer text. If your answer contains something like Google's "helpful content" update, the raw double quotes will corrupt the JSON structure and the entire schema block becomes unparseable.
Proper escaping rules for JSON strings: backslashes become \\, double quotes become \", newlines become \n, and tab characters become \t. Control characters below ASCII 32 must be escaped with their Unicode escape sequence. Our generator handles all of this automatically, but if you are hand-writing markup, run it through a JSON validator like jsonlint.com before deploying.
A second escaping layer matters when your answer contains HTML entities inside a JSON string. The sequence & in HTML, when placed inside a JSON string, must remain & — do not double-decode it. This causes confusion when copying answers from CMS editors that auto-encode ampersands.
Six Policy Violations That Kill Your Rich Results
1. Promotional or advertising content. Google's documentation is explicit: FAQ schema must not be used for content whose primary purpose is advertising. Phrases like "buy now," "limited time offer," or "subscribe today" in your FAQ answers are red flags. A question like "Why should I buy from us?" that answers with a sales pitch will not qualify.
2. Content that does not match the visible page. The most penalised violation. If your JSON-LD lists six FAQ pairs but the page only visibly shows two of them, Google considers this deceptive markup. Every answer in your schema must be findable by a user who is reading your page normally.
3. Adult, violent, or hateful content. Any page whose primary topic violates Google's content policies is ineligible for rich results regardless of how technically correct the markup is.
4. Empty or single-word answers. "Yes," "No," and "Contact us" are not answers. Google's quality threshold is not documented numerically, but answers under roughly 20 characters are routinely ignored in practice.
5. Duplicate questions across the same page. Two Question entities with identical or near-identical name values in a single FAQPage block will cause one or both to be dropped. Consolidate or differentiate them.
6. Paginated or dynamically loaded FAQs not visible on first render. If your FAQ section requires JavaScript to expand and is not present in the initial HTML response, Googlebot may not see it. The schema block will claim content that the crawler cannot verify, which triggers a mismatch flag. Either server-render the visible FAQ text or lazy-load schema markup only after confirming the DOM is ready.
Where to Place the Script Tag
The <script type="application/ld+json"> block can go in the <head> or anywhere in the <body> before </body>. Google parses both locations correctly. For performance, the <head> is slightly preferable because it gives Googlebot the schema context before it encounters the body content, but the difference is negligible. What matters more: one FAQPage block per page. Multiple FAQPage blocks on the same URL are merged by Google, sometimes unpredictably. Keep it to one.
Testing Before You Push Live
Use Google's Rich Results Test at search.google.com/test/rich-results and paste either your URL or the raw HTML containing the markup. The tool will show you detected items, warnings, and errors. Pay attention to warnings — they do not break rendering but are signals that Google may downrank or ignore the markup. After confirming the test passes, use Google Search Console's URL Inspection tool on the live URL a few days after deployment to verify Googlebot actually processed the schema.
One important nuance: the Rich Results Test uses a rendering engine, not a crawler. A page that passes the test can still fail in production if your CMS is stripping the script tag, your CDN is serving cached pre-schema versions, or a plugin is minifying JSON in a way that breaks string escaping. Always cross-reference with Search Console's actual coverage report.
Quick Implementation Checklist
Before you copy any schema to production, run through this list: every question appears verbatim on the visible page; every answer appears verbatim or is at minimum a faithful summary of visible content; no promotional language in questions or answers; character escaping is correct (validate the JSON); no duplicate questions; no adult or restricted content; script tag is in a location that Googlebot can read without JavaScript execution; only one FAQPage block on the URL; Rich Results Test returns zero errors. That is the complete bar for correct FAQ schema implementation.
The generator on this page handles the JSON-LD structure, character escaping, and policy warning checks automatically. Your job is to write honest, visible, useful Q&A content — the markup is just the wrapper.