You added FAQ JSON-LD to your articles. Rich Results Test passes. Search Console → Enhancements → FAQ rich results shows green. Then it doesn’t — suddenly red warnings appear, or the FAQ rich result that was showing in SERP disappears. Google’s FAQPage policy is strict and has tightened since 2023: the FAQ must be visible to users, the questions in JSON-LD must match the visible questions exactly, every Q must have at least one acceptedAnswer, and the page must actually have an FAQ section (not just product info marked up as FAQ).
This guide covers the most common reasons FAQ schemas get invalidated.
Common causes
Ordered by hit rate, highest first.
1. FAQ block is hidden by default
Your accordion / tab UI hides answers until clicked. The HTML still contains them (so Rich Results Test passes), but Google’s “user-visible content” check flags them as not actually visible.
How to spot it: Disable JavaScript in DevTools → reload page. If FAQ answers aren’t visible, they’re hidden behind interactive UI.
2. JSON-LD has more or fewer Q’s than visible
Your page shows 5 FAQ items. JSON-LD has 8 (you left some in from a previous version). Or vice versa. Mismatch triggers warning.
How to spot it:
# Count visible FAQ items
curl -s "https://site.com/article" | grep -c 'class="faq-item"'
# Count JSON-LD FAQ items
curl -s "https://site.com/article" | grep -oP '"@type":"Question"' | wc -l
Should match.
3. Question text differs between visible and JSON-LD
Visible question: “How long does AdSense approval take?”
JSON-LD: "name": "What's the AdSense approval timeline?"
Semantically same, character-different. Google reads JSON-LD as the canonical version and flags mismatch.
How to spot it: Extract both and diff:
# Visible questions
curl -s URL | grep -oP '<h3 class="faq-q">\K[^<]+'
# JSON-LD questions
curl -s URL | grep -oP '"@type":"Question","name":"\K[^"]+'
4. Answer is too short or not in acceptedAnswer.text
Each Question needs:
{
"@type": "Question",
"name": "...",
"acceptedAnswer": {
"@type": "Answer",
"text": "Full answer here, at least 50 characters."
}
}
If you put the answer in text but as plain text (no HTML), it works. If you put HTML markup, it must be valid and rendered to plain text > 50 chars.
How to spot it: Each acceptedAnswer.text should be >= 50 characters. < 50 = often flagged.
5. FAQPage used on pages without real FAQ
Marking up a product info section as FAQPage to game rich results. Google detects (content doesn’t read like Q&A) and demotes.
How to spot it: Read the page. Does it have a section that genuinely answers user questions? If “no” or “kind of,” remove FAQPage schema.
6. Duplicate FAQ across many pages
Same set of FAQ questions appears on 100 pages on your site. Google detects duplication and stops showing FAQ rich results for any of them.
How to spot it: If your “global FAQ” sidebar uses the same Q&A on every page with FAQPage schema, that’s the bug. Mark up only the article-specific FAQ section.
7. Page has answers as links to other pages (not text)
{
"acceptedAnswer": { "text": "See our pricing page for details." }
}
The “answer” is just a referral. Google considers this not a real answer and may flag.
How to spot it: Read answers. If they’re 1-line “see X” referrals, Google may not accept.
Shortest path to fix
Step 1: Validate in Rich Results Test
Open the URL in Rich Results Test → scroll to FAQPage → fix every red field.
Step 2: Make FAQ visible by default
If your accordion hides answers behind clicks, change CSS so answers render visibly (even if you keep the click toggle):
.faq-answer { display: block; } /* not display: none */
Or render the full answer in HTML for SSR / no-JS users; use progressive enhancement to add the accordion toggle on top.
Step 3: Generate Q’s from a single source
In your MDX article frontmatter:
faq:
- q: "How long does AdSense approval take?"
a: "Approval typically takes 1-4 weeks, but can take 6-8 weeks for new domains."
- q: "..."
a: "..."
Template renders both UI and JSON-LD from this array:
---
const { faq } = Astro.props.frontmatter;
const jsonLd = {
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": faq.map(item => ({
"@type": "Question",
"name": item.q,
"acceptedAnswer": { "@type": "Answer", "text": item.a },
})),
};
---
<section class="faq">
{faq.map(item => (
<article>
<h3 class="faq-q">{item.q}</h3>
<p class="faq-a">{item.a}</p>
</article>
))}
</section>
<script type="application/ld+json" set:html={JSON.stringify(jsonLd)}></script>
UI and JSON-LD are guaranteed identical.
Step 4: Only mark up real FAQs
If a page doesn’t have a section that reads like Q&A, don’t add FAQPage schema. Don’t game it. Google penalizes pages that try.
Step 5: Aim for 50+ char answers
If your answers are 1-line short, expand them. Google expects each acceptedAnswer.text to be substantive (50+ characters minimum).
Step 6: Submit and watch
After fix, Search Console → URL Inspection → Request indexing. Watch the Enhancements → FAQ report over 1-2 weeks.
When this is not on you
Google reduced the rate at which FAQ rich results appear since 2023; even valid FAQ schemas may not show as rich results. That’s policy, not a fix. Focus on having valid schema so when Google does show them, you qualify.
Easy to misdiagnose as
People add FAQ schema to every page hoping for a traffic boost. Google penalizes when the page doesn’t have a real FAQ. Don’t spam.
Prevention
- Generate FAQ JSON-LD from the same data structure that renders the visible UI.
- Only mark up pages that have a real FAQ section, not all pages.
- Answers should be 50+ characters and substantive, not referrals.
- Render FAQ visibly by default; accordion toggle is a progressive enhancement.
- CI check: visible FAQ question count matches JSON-LD question count.
FAQ
- Can I include images in FAQ answers? Limited — text is required; rich content support varies by Google.
- Are FAQ rich results still common in SERP? Less common since 2023, more reserved for authoritative pages. Don’t expect every valid FAQ to show.
Related
- Structured data warnings
- Breadcrumb JSON-LD mismatch
- WebSite JSON-LD inconsistency
- Article date vs JSON-LD date mismatch
Tags: #SEO #Troubleshooting #Debug #Structured data #FAQ schema #JSON-LD