You added a ## FAQ section to 600 articles. Your ArticleLayout extracts it and emits FAQPage JSON-LD. You wait six weeks. Search Console shows the FAQ pages as “Eligible” but the FAQ rich result almost never appears in SERP. You test one URL in Google’s Rich Results Test and it says “No items detected” — even though the JSON-LD is right there in the source. Something between your JSON-LD and Google’s extractor is misaligned.
FAQ schema is fragile in three ways: the JSON-LD structure must be exact (Question / acceptedAnswer / Answer nesting), the visible body must match the schema content closely enough that Google trusts it, and the page must be indexable and not duplicated. The fix is to run Rich Results Test on a known-good and known-bad URL, diff the schema, and tighten the FAQ extractor.
Common causes
1. JSON-LD structure is slightly wrong
Common mistakes: acceptedAnswer written as answer, Answer (the type) written as Text, mainEntity missing or singular. The schema validates as JSON but does not validate as FAQPage schema.
How to spot it: paste your URL into Google’s Rich Results Test (https://search.google.com/test/rich-results). “No items detected” or “FAQPage detected with errors” — schema structure issue.
A correct shape:
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "Why does my image alt text matter?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Alt text is read by screen readers and used by image search engines..."
}
}
]
}
2. Question/answer text doesn’t match the visible body
Google requires the FAQ schema’s question/answer text to match the visible content closely. If your extractor pulls ### Question? headings and concatenates the following paragraphs but the JSON-LD only contains the first sentence, Google flags it as “schema content doesn’t match page” and silently drops the rich result.
How to spot it: compare the text field in JSON-LD to the actual body paragraph in the rendered HTML. If JSON-LD is much shorter or transformed, that’s the cause.
3. Page is noindex (or in a noindex collection)
Rich results require the page to be indexable. If the page has <meta name="robots" content="noindex"> or is canonicalized to another page, no rich result will appear.
How to spot it: view-source for name="robots" and rel="canonical". Page must be indexable AND self-canonical.
4. Site/page hasn’t passed Google’s quality threshold for rich results
Even with valid schema, Google may suppress the rich result on low-authority sites or thin-content pages. There’s no error; the page just doesn’t get the treatment.
How to spot it: check Search Console -> Enhancements -> FAQ. Pages listed as “Eligible” — Google CAN show them but chose not to. Pages listed as “Valid” — eligible AND impressions are happening. If you have lots of Eligible but very few impressions, it’s a quality/authority issue, not a schema issue.
5. Duplicate FAQ schema on the same page
Some plugins emit FAQ schema separately from your custom extractor. Two FAQPage blocks on one page confuses Google and may suppress both.
How to spot it: view-source and count "@type": "FAQPage". If more than 1, dedupe.
curl -s https://site.com/en/articles/foo/ | grep -c '"@type": "FAQPage"'
6. FAQ section structure not matched by extractor
Your extractor expects ### Question? followed by paragraph but the article uses **Question?** followed by bullet points. Extractor finds no questions; JSON-LD is empty.
How to spot it: view-source and look at the emitted JSON-LD. Empty mainEntity array — extractor failed.
Shortest path to fix
Step 1: Run Rich Results Test on a representative sample
For each of 5-10 articles you expect to have FAQ rich results:
- Open https://search.google.com/test/rich-results
- Paste the URL
- Read the verdict: "No items detected" / "FAQPage detected" / "FAQPage detected with errors"
- For errors, read the specific error message
This separates “schema not detected” from “schema detected but Google chose not to display.”
Step 2: Fix schema structure
Standardize on the canonical shape. In your ArticleLayout’s FAQ extractor:
function extractFaq(bodyMdx: string) {
const items = [];
const re = /^### (.+\?)\s*\n+((?:(?!^### |^## ).+\n?)+)/gm;
let m;
while ((m = re.exec(bodyMdx))) {
items.push({
"@type": "Question",
name: m[1].trim(),
acceptedAnswer: {
"@type": "Answer",
text: m[2].trim().replace(/\n+/g, " "),
},
});
}
if (items.length === 0) return null;
return {
"@context": "https://schema.org",
"@type": "FAQPage",
mainEntity: items,
};
}
Emit via:
{faq && (
<script type="application/ld+json" set:html={JSON.stringify(faq)} />
)}
Step 3: Ensure visible body matches schema text
The text field in JSON-LD must be a faithful representation of what’s in the body. Don’t truncate to one sentence; don’t strip code. If your body uses markdown formatting, strip the markdown for the JSON-LD text field but keep the substance.
function stripMarkdown(s: string) {
return s
.replace(/`([^`]+)`/g, "$1")
.replace(/\*\*([^*]+)\*\*/g, "$1")
.replace(/\[([^\]]+)\]\([^)]+\)/g, "$1");
}
Step 4: Verify the page is indexable
view-source on a problem URL and check:
curl -s https://site.com/en/articles/foo/ | grep -E 'robots|canonical'
Robots must not be noindex. Canonical must point at the page itself (not somewhere else).
Step 5: Dedupe schema emissions
Grep the layout and any plugins for FAQ schema emission:
grep -rn '"FAQPage"' src/
If more than one place emits, pick one and remove the other.
Step 6: Re-test and resubmit
After fixing, run Rich Results Test again, then request indexing in Search Console. Eligible -> Valid status transition takes days; impressions can take weeks.
Prevention
- Single source of truth for FAQ JSON-LD (the layout’s extractor, no plugins)
- FAQ extractor validated against Rich Results Test on every template change
- Prebuild script counts emitted FAQPage blocks per page; fails on >1
- Articles with
## FAQsection auto-validated to have at least one### Question?subheading - New articles spot-checked in Rich Results Test before promoting to primary navigation
- Quarterly review of Search Console FAQ Enhancements report
Related
- Content Site Image Alt Missing Bulk
- Content Site Canonical Points to Self Wrong
- Content Site Hreflang Tags Misconfigured
- Search Console Low Value URLs
- Many Pages Few Impressions
- Content Site Translation Pages Mismatched
Tags: #Content ops #Site quality #Site audit #Troubleshooting #FAQ schema