Mark Up an Existing FAQ Section as FAQPage Schema in One Page
A practical walkthrough for taking the FAQ section you already have and marking it up as FAQPage JSON-LD. Copy-paste code, common mistakes (duplicates, hidden content), Google's policy, and why FAQPage is the shape AI search cites most.
TL;DR
Take the FAQ section already on your site and build one block of FAQPage JSON-LD with the exact same questions and answers as the visible body, then drop it into the same page inside a <script type="application/ld+json"> tag. You don't write new content — you just restate what's already visible in a machine-readable form.
1. Why FAQPage is the shape AI search cites most
When ChatGPT, Perplexity, or Gemini search the web to answer, the easiest data to work with is a "question → official answer" pair. FAQPage states that structure explicitly, so AI can quote it as-is without cutting or reconstructing anything. That's why it has the highest citation rate per unit of effort of any schema.
Google's rich results (the expandable Q&A box) shrank for general sites after the 2023 policy change — but with AI search and voice search opening up wider citation surfaces, FAQPage's value has actually gone up.
2. First: what makes a good FAQ section
Before you mark it up, confirm your body FAQ meets these:
- Official answers — written by the operator. If it's user comments or a forum, use
QAPage, not FAQPage. - Actually visible on the page — the answer you mark up must exist as text on the page.
- Not promotional — self-promo Q&A like "Why is our product the best?" violates policy.
- At least 5 items — too few and it may not be worth a FAQPage rating.
3. Apply it in three steps
Step 1 — restate the body Q&A verbatim
Say you already have this HTML section:
<h2>Frequently Asked Questions</h2>
<h3>How soon does my order ship?</h3>
<p>Orders ship within 2–3 business days.</p>
<h3>How do exchanges and returns work?</h3>
<p>Request one in your account within 7 days of delivery.</p>
Step 2 — write FAQPage JSON-LD with the same content
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "How soon does my order ship?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Orders ship within 2–3 business days."
}
},
{
"@type": "Question",
"name": "How do exchanges and returns work?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Request one in your account within 7 days of delivery."
}
}
]
}
</script>
name is the body question (<h3>), text is the body answer (<p>), copied over directly. The key is that the text matches in both places.
Step 3 — insert on the same page and validate
Paste the script right before </body> on the page that has the FAQ. Then drop the URL into the Rich Results Test and confirm "FAQ" is detected.
4. Common mistakes
! The traps FAQPage trips over most
- Marking up an answer that isn't in the body — the most common penalty. Don't include answers nobody can see.
- Marking up text permanently hidden with
display:none— click-to-reveal accordions are OK, permanent hiding is not. - The same Q&A on multiple pages — keep it on one.
- Ad links inside answer.text — links meant to funnel traffic violate policy.
- Marking up user comments as FAQPage — that's
QAPage.
5. Read more
For the full FAQPage format plus WordPress and PHP application, see How to Add FAQ Schema (FAQPage). To design entire pages so AI search cites them, see our GEO service.
Build it yourself
Type your questions and answers and get schema.org-compliant FAQPage JSON-LD instantly. Copy and paste it onto the page. (Included in the Free plan.)
→ Generate FAQPage with a formPaste a URL and we show your current structured data — and if you have an FAQ with no markup, it shows up as a recommended addition.
→ Diagnose whether your page is missing FAQPage