SEO
FAQPage schema step by step, without the rich result
FAQPage goes in with JSON-LD and one Question per visible question. Since 2023 it brings no rich result for most sites, but it stays valid markup.
Key points
- FAQPage needs one Question per visible question and the same answer in text.
- The markup has not been a rich result for most sites since 2023.
- The useful check compares the JSON-LD with the served text, not with the CMS source.
FAQPage goes in as a JSON-LD block holding one Question per visible question on the page, with the same answer in plain text. Since August 2023 Google shows FAQ rich results only to authoritative government and health sites: for everyone else the markup stays valid but changes nothing in the SERP.
The minimum block
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "Does FAQPage still produce a rich result?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Not for most sites: since August 2023 only authoritative government and health sites get it."
}
}
]
}
@type FAQPage, mainEntity is an array of Question, each Question carries name and acceptedAnswer with @type Answer and text. The text is the visible one, not a summary: when the markup says one thing and the page another, the mismatch counts as structured spam and Google can apply a manual action.
The five rules
- One Question per visible question, in the same order as the page.
- The answer is plain text: a tag inside text is read as a character, not as markup.
- No FAQPage on pages without questions: the markup describes what exists.
- One FAQPage per page, with every question inside mainEntity.
- The markup uses the language of the page: a half-translated answer no longer matches the visible text.
Check that markup and page agree
cat > check-faq.mjs /gi, " ")
.replace(//gi, " ")
.replace(/]+>/g, " ")
.replace(/&/g, "&")
.replace(/'/g, "'")
.replace(/\s+/g, " ");
const blocks = [...html.matchAll(/]+application\/ld\+json[^>]*>([\s\S]*?)/gi)];
const nodes = blocks.flatMap((b) => {
const data = JSON.parse(b[1]);
return [data].concat(Array.isArray(data["@graph"]) ? data["@graph"] : []);
});
const faq = nodes.find((n) => n["@type"] === "FAQPage");
if (!faq) { console.log("no FAQPage block"); process.exit(1); }
let missing = 0;
for (const q of faq.mainEntity) {
const answers = [].concat(q.acceptedAnswer).map((a) => String(a.text).replace(/\s+/g, " ").trim());
const ok = answers.every((a) => text.includes(a));
if (!ok) missing++;
console.log((ok ? "ok " : "MISSING ") + q.name);
}
console.log(faq.mainEntity.length + " questions · " + missing + " not in the visible text");
EOF
curl -s https://ui.eneawork.it/blog/schema-faq-page-guida > page.html
node check-faq.mjs page.html
The script extracts the FAQPage block, strips scripts and tags from the document and looks for every answer in the visible text. A MISS means the JSON-LD was edited after the page, or the answer was shortened only in the markup. The check runs against the served HTML, not against the CMS source.
Why the questions are missing from the SERP
In August 2023 Google limited FAQ rich results to government and health sites recognised as authoritative, and in September 2023 it removed HowTo rich results. Adding FAQPage to a blog does not produce expandable questions: the markup stays useful to describe the entity and to engines that read JSON-LD, not to shape the result layout.
The EneUI catalogue
An accordion does not generate FAQPage on its own. The catalogue holds real records to start from: FAQ from Kokonut UI, MIT licence, the 24 blocks in the FAQ category and faq-01 from Shadcn UI Blocks. The markup is written by reading the questions in the block, not by inventing them. Checked on 1 November 2026.
The limitation
The markup does not control what Google shows. A validator confirms syntax and properties, not the semantic match with the page; a person checks that line by line, and it is the only check that counts.
Where to continue
The general format is in how to add schema markup; the sequence for getting into the index is in getting a site indexed by Google. If the site base is still undecided, the comparison is in WordPress, Wix or React components.
Frequently asked questions
Does FAQPage still produce a rich result?
No, not for most sites. Since August 2023 Google shows expandable questions only to authoritative government and health sites.
Where does the FAQPage block go?
In a script tag with type application/ld+json, in the head or the body. It must be in the initial document, not injected after load.
Can I use HTML inside the answers?
No. The text field takes plain text: a b tag or a link is read as characters, and the validator does not flag it.
Does every accordion item need a question?
Yes, when the accordion is visible and the answer is in the DOM. If the text appears only after a client-side click, Google may never see it.
FAQPage or HowTo?
Neither produces a rich result any more: HowTo was removed in September 2023. FAQPage remains the right type for questions and answers.