Fixing FAQPage Schema Errors
FAQPage markup tells search engines and AI assistants which questions a page answers and what the answers are. When it breaks, it breaks in a small number of predictable ways: a required field is missing, the JSON cannot be read, two plugins output the same block, or the markup says something the visible page does not.
This guide covers each one, with the exact fix, a correct example you can copy, and what FAQ markup can and cannot do for you in 2026.
What FAQPage markup is, and who gets the rich result
FAQPage is a schema.org type for a page that lists questions written by the site owner, each with
one answer, also written by the site owner. The markup is a list: one FAQPage whose mainEntity
holds a Question for each question, and each Question holds an acceptedAnswer
of type Answer.
Since August 2023 Google only shows the FAQ rich result, the expandable questions under a search listing, for well-known, authoritative government and health websites. For every other site the markup is still read and still valid, but the drop-down questions are not shown in Google Search. That change is why many site owners saw FAQ results disappear without touching their pages: nothing was broken, the display was withdrawn.
So why fix it at all? Because the markup is still used. Other search engines read it, AI answer engines use clear question-and-answer pairs when they quote a page, and a broken block is reported as an error in Search Console and in audits, which hides real problems among the noise. A clean, accurate FAQPage block costs nothing to keep and removes a warning from every report.
When FAQPage is the wrong type
- Visitors can post answers (a forum thread, a product question with customer replies):
use
QAPage, not FAQPage. - A single question with several possible answers: that is a QAPage too.
- Advertising: Google does not allow FAQ markup used for advertising.
- The same FAQ repeated on many pages (a site-wide delivery FAQ in the footer): mark it up once, on the page where it lives, not on every page it appears.
The fields FAQPage needs
FAQPage has very few fields, and every one of them is required. A missing field is the most common error in audits and in the Rich Results Test.
| Type | Field | What it holds |
|---|---|---|
FAQPage | mainEntity | An array of Question items, one for each question on the page. |
Question | name | The full text of the question, as shown on the page. |
Question | acceptedAnswer | One Answer item. Not an array of several answers. |
Answer | text | The full answer. It may contain limited HTML: headings, paragraphs, line breaks, lists, links, bold and italic. |
Everything else is optional. Adding extra properties such as author or dateCreated
to a Question does no harm, but it does not help the FAQ result either.
A correct block you can copy
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "How long does delivery take?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Orders placed before 2pm are sent the same day and usually arrive in 1 to 2 working days."
}
},
{
"@type": "Question",
"name": "Can I return an item?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes. You have 30 days to return an unused item. <a href=\"https://example.com/returns\">Start a return</a>."
}
}
]
}
</script>
Note the link inside the second answer: the double quotes around the address are escaped with a backslash
(\"). Without the backslashes the JSON ends early and the whole block is unreadable.
The errors you will see, and what each one means
These are the messages the Rich Results Test, the Schema Markup Validator, Search Console and the Schema Debugger give for FAQPage, with the cause behind each one.
| Message | Cause | Fix |
|---|---|---|
| Missing field "acceptedAnswer" | A Question has no answer, often an empty answer box in a plugin or a question added without one. | Add an acceptedAnswer with an Answer and
its text, or remove the Question. |
| Missing field "name" | The question text is in text or headline
instead of name. | Put the question in name. |
| Missing field "text" (in acceptedAnswer) | The answer is in name or description,
or the field is empty. | Put the answer in text and make sure it is not blank. |
| Invalid object type for field "mainEntity" | mainEntity holds a string, or objects without
"@type": "Question". | Make mainEntity an array of objects, each with "@type": "Question". |
| Unparsable structured data / Parsing error: Missing ',' or '}' | The JSON is broken: a trailing comma, a curly quote, an unescaped quote or a raw line break. | See the parsing section below. |
| Duplicate field "FAQPage" | Two FAQPage blocks on one page, usually a plugin and a theme both adding one. | Keep one source and switch the other off. |
| Page not eligible for rich results (FAQ detected) | The markup is valid, but the site is not a government or health site. | Nothing to fix. The markup is correct. |
Fixing JSON that cannot be read
An unparsable block is worse than a missing field: the whole script is ignored, including any other types in the same block, such as your Organization or BreadcrumbList. Four mistakes cause almost all of them.
1. A comma after the last item
{ "@type": "Question", "name": "...", "acceptedAnswer": { ... } },
] <-- the comma before ] breaks the JSON
JSON does not allow a comma after the last item in a list or the last field in an object. This happens most often when a question is deleted by hand and the comma before it is left behind.
2. Curly quotes
Word processors and some CMS editors turn " into โ and โ. JSON
only accepts straight double quotes around names and values. Curly quotes are fine inside the text of
an answer, but never as the quotes that open or close a value.
3. A double quote inside the answer
"text": "Use the "Returns" button on your account page." <-- broken
"text": "Use the \"Returns\" button on your account page." <-- fixed
4. A line break inside the text
A raw line break inside a value ends the string. Keep each answer on one line, or use <br>
or <p> tags inside the text for breaks that should show.
json_encode(); in JavaScript, build
an object and use JSON.stringify(). Both escape quotes and line breaks for you.Making the markup match the page
Google's rule is simple: every question and answer in the markup must be visible to the reader on the same page. Markup for content that is hidden, on another page, or different from what the reader sees is treated as misleading and can lead to a manual action that removes all rich results from the site.
- Collapsed answers are fine. An accordion that the reader opens with a click counts as visible content.
- Answers loaded later are a risk. If the answers only appear after a script calls an API, check the rendered page in the URL Inspection tool to confirm Google sees them.
- Shortened answers are a mismatch. If the page answer is three paragraphs and the markup has one sentence, bring them into line. The markup can use the whole answer.
- Old questions left in the markup after the page was edited are the most common mismatch. When you remove a question from the page, remove it from the markup too.
The fix, step by step
Step 1
Find every FAQPage block on the page
Open
the page source (Ctrl+U, or Cmd+Option+U on a Mac) and search for FAQPage. Note each match
and where it comes from: an SEO plugin (Yoast, Rank Math, All in One SEO), a block from the page builder,
the theme, or code added by hand. The Schema Debugger lists every block on the page with its source position,
which is quicker on long pages.
Step 2
Fix JSON that cannot be read
Paste the block into the Schema Markup Validator. If it reports a parsing error, it gives the line and column; the fault is almost always one of the four in the parsing section. Fix it at the source, the template or the plugin field, not in a saved copy of the HTML. Then paste the corrected block in again and repeat until the validator reads it without a parsing error.
Step 3
Add the required fields
Check that the
FAQPage has a mainEntity array, that each Question has name and acceptedAnswer,
and that each Answer has text. In a plugin, a missing field usually means an empty question
or answer box: fill it in or delete the row. When the markup is written by hand, compare it with the
correct block in the required fields section above.
Step 4
Make the markup match the page
Read the visible FAQ and the markup side by side. Remove questions that are no longer on the page, add any visible question that is missing from the markup, and bring shortened answers into line with the full answer the reader sees. The wording should be the same, or very close, in both places, and the questions should appear in the same order on the page and in the markup.
Step 5
Keep one FAQPage block
If two sources output FAQPage, keep the one that is easiest to keep in line with the page and switch the other off. In Yoast and Rank Math the FAQ block adds its own markup, so do not also add FAQPage by hand or through a second schema plugin. After switching one source off, view the page source again and search for FAQPage to confirm only one block is left.
Step 6
Test and request a recrawl
Test the live URL in the Rich Results Test and the Schema Markup Validator. When both are clean, use URL Inspection in Search Console and choose Request indexing. Search Console reports usually update within a few days to two weeks as Google recrawls. On the FAQ report, choose Validate fix so Google rechecks every affected page and tells you when they pass.
FAQPage inside a larger @graph
Many sites output one JSON-LD block with an @graph that holds the WebPage, Organization,
BreadcrumbList and FAQPage together. That is fine, and it keeps everything in one place. Two points matter:
- Give the FAQPage its own
@id, such ashttps://example.com/delivery#faq, so it is not confused with the WebPage node. - Do not make the WebPage itself
"@type": "FAQPage"and also add a separate FAQPage node; that is a duplicate.
{
"@context": "https://schema.org",
"@graph": [
{ "@type": "WebPage", "@id": "https://example.com/delivery#webpage", "url": "https://example.com/delivery", "name": "Delivery" },
{ "@type": "FAQPage", "@id": "https://example.com/delivery#faq", "isPartOf": { "@id": "https://example.com/delivery#webpage" },
"mainEntity": [ { "@type": "Question", "name": "...", "acceptedAnswer": { "@type": "Answer", "text": "..." } } ] }
]
}
Stopping it from coming back
- One source. Decide which tool outputs FAQPage across the site and switch the FAQ output off in every other plugin and theme.
- Escape at output. Generate the JSON with
json_encode()orJSON.stringify(), never by joining strings, so a quote in an answer can never break the block. - Test after updates. Theme and plugin updates are the most common cause of a new duplicate block. Re-run the Schema Debugger after each update on one page that has an FAQ.
- Edit the FAQ in one place. If the visible FAQ and the markup come from the same data, they cannot drift apart.
1. Why did my FAQ rich results disappear from Google?
Since August 2023 Google only shows FAQ rich results for well-known, authoritative government and health websites. If your site is neither, the drop-down questions under your listing stopped showing even though your markup is still valid and nothing on your page is broken. Fixing or rewriting the markup will not bring them back. Judge your FAQ markup by a clean result in the Rich Results Test and the Schema Markup Validator instead of by what appears in Google Search.
2. Is FAQPage markup still worth adding?
Yes, if the page really is a list of questions you answer. The markup is still read by Google, by other search engines and by AI answer engines, and it states plainly which answer belongs to which question, so an assistant can quote your answer accurately. Valid markup also keeps your Search Console and audit reports free of errors that hide real problems. Do not add FAQPage to pages that are not FAQs just to get markup on them.
3. What does "Missing field acceptedAnswer" mean?
It means one of your Question items has no answer attached to it. It usually comes from an empty answer box in an SEO plugin or page builder block, or from a question added by hand without its answer. Open the FAQ block, find the question with the blank answer and either write the answer or delete the question. Every Question needs an acceptedAnswer holding one Answer, and every Answer needs its text filled in.
4. Can the answer text contain links and lists?
Yes. The text of an Answer may contain a limited set of HTML: headings, paragraphs, line breaks, ordered and unordered lists, links, and bold and italic text. Anything else is ignored. Because the answer sits inside a JSON string, every double quote in the HTML, such as the quotes around a link address, must be escaped with a backslash, or the whole block breaks. Letting a JSON encoder build the block handles this for you.
5. Should I use FAQPage or QAPage?
Use FAQPage when the site owner wrote both the questions and the answers, and each question has one answer, such as a delivery or returns FAQ. Use QAPage when visitors can post answers, or when one question can have several competing answers, such as a forum thread, a support community or a product question with customer replies. Choosing the wrong type is a common reason for markup that validates but is never shown.
6. Can I have two FAQPage blocks on one page?
No. Two FAQPage blocks on the same page are reported as a duplicate, and search engines may ignore both. It usually happens when an SEO plugin and a page builder, or a theme and a plugin, each output their own block. Keep one FAQPage that lists every question in its mainEntity array, and switch off the FAQ output in the other source rather than deleting the visible questions from the page.
7. How long before Search Console shows the fix?
After you request indexing with the URL Inspection tool, Google usually recrawls the page within a few days. The FAQ enhancement report in Search Console updates as Google recrawls each affected page, which can take up to two weeks across a whole site. You can speed up the report by choosing Validate fix once the pages are corrected. Check each page straight away in the Rich Results Test rather than waiting for the report.
The Schema Debugger lists every structured data block on a page, shows each missing or invalid field, and compares your FAQ markup with the visible questions.
Open Schema Debugger Fixes โ