No FAQPage schema on an FAQ section
What is this issue?
This issue reports an FAQPage schema block your page already declares that is
malformed — a missing mainEntity, an empty question list, duplicate questions, or a
Question missing its name or answer text — not a page that has FAQ content with no
schema at all.
What this issue is not:
- It does not guess. A support or help page with a fully rendered accordion of
questions and answers, but no
FAQPageJSON-LD, is never reported. - It does not compare the schema's questions against the page's visible text — only the schema's own internal consistency is checked.
Why it matters
FAQPage schema is important for AI search and voice assistants:
- AI Overviews: Provides structured Q&A data that AI engines can use to answer user queries
- Voice search: Voice assistants can read FAQ answers directly from structured data
- Featured snippets: Q&A content may appear in featured snippets
- User experience: Helps search engines understand and surface your FAQ content
- Voice assistants: Enables voice assistants to provide accurate answers from your FAQ
Resolving this issue improves your SEO health score by ensuring Q&A content is properly structured for AI search and voice assistants.
How to fix it
If this issue was raised, your page already declares an FAQPage — open the finding
for the exact entries at fault (PixyScan does not compare the schema against your
visible Q&A; step 3 below is Google's own requirement for rich-result eligibility).
The steps below are for a page that declares no FAQPage schema yet: worthwhile to
add, and never reported as a defect while absent.
Identify FAQ pages: Look for pages with FAQ URL patterns (
/faq,/help,/support) or accordion Q&A sectionsAdd FAQPage JSON-LD structured data to the page's
<head>or before</body>:{ "@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [ { "@type": "Question", "name": "What is your return policy?", "acceptedAnswer": { "@type": "Answer", "text": "We offer 30-day returns for all products in original condition." } }, { "@type": "Question", "name": "Do you ship internationally?", "acceptedAnswer": { "@type": "Answer", "text": "Yes, we ship to over 150 countries worldwide." } } ] }Ensure schema matches visible content:
- The Q&A in schema must exactly match what is visible on the page
- Do not include hidden or collapsed Q&A unless expanded by default
- All
acceptedAnswertext should be visible by default
Sync dynamically: Update schema dynamically from your CMS FAQ content
Validate with Google's Rich Results Test
Notes
- Google reduced FAQ rich result display in 2023, but the schema still provides strong signals for AI Overviews and voice search
- Only use FAQPage schema for pages that actually have FAQ content
- Ensure each Question has both
name(question text) andacceptedAnswerwithtext(answer text)
Examples
Example 1: No Schema Declared — Not This Issue
<!-- FAQ page with a fully rendered Q&A, but no FAQPage schema -->
<html>
<head>
<title>Frequently Asked Questions - Example Store</title>
</head>
<body>
<h1>Frequently Asked Questions</h1>
<h2>What is your return policy?</h2>
<p>We offer 30-day returns for all products in original condition.</p>
<h2>Do you ship internationally?</h2>
<p>Yes, we ship to over 150 countries worldwide.</p>
</body>
</html>Nothing is reported, however clearly the page reads as an FAQ. See How to fix it for why adding the schema is worth doing anyway.
Example 1b: The Same Page, With a Well-Formed FAQPage (passes)
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "What is your return policy?",
"acceptedAnswer": {
"@type": "Answer",
"text": "We offer 30-day returns for all products in original condition."
}
},
{
"@type": "Question",
"name": "Do you ship internationally?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes, we ship to over 150 countries worldwide."
}
}
]
}
</script>Example 2: FAQPage Schema with Multiple Questions
Corrected state:
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "How long does shipping take?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Standard shipping takes 3-5 business days. Express shipping takes 1-2 business days."
}
},
{
"@type": "Question",
"name": "What payment methods do you accept?",
"acceptedAnswer": {
"@type": "Answer",
"text": "We accept Visa, Mastercard, American Express, PayPal, and Apple Pay."
}
},
{
"@type": "Question",
"name": "Can I track my order?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes, you will receive a tracking number via email once your order ships."
}
}
]
}Example 3: Incomplete FAQPage Schema
Problematic state:
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "What is your return policy?"
}
]
}Missing acceptedAnswer property
Corrected state:
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "What is your return policy?",
"acceptedAnswer": {
"@type": "Answer",
"text": "We offer 30-day returns for all products in original condition."
}
}
]
}How PixyScan detects this
Read the declared structured data: every JSON-LD block is parsed, and
@graphwrappers are flattened.Select declared
FAQPageentities: any schema block whose@typeisFAQPage. A page that declares none is not examined — a visible accordion of questions and answers, or a heading that says "FAQ", does not on its own trigger this check.Check the required property: a declared
FAQPagemust have amainEntityproperty.Validate
mainEntity, when present:- it must be a non-empty array
- each entry must carry
@type: "Question"— an entry with no@typeat all, or with the wrong one, is flagged the same way - each
Questionneeds a non-emptyname; two questions with the same name (case-insensitively) are flagged as duplicates - each
Questionneeds anacceptedAnswercarrying non-emptytext
This is reported when: the page declares an
FAQPagemissingmainEntity, or with an empty list, an entry with no or the wrong@type, duplicate questions, or entries missing a name or answer text. A page with visible FAQ content but noFAQPageschema at all is never reported. This check also does not compare the schema's questions against what is visibly rendered on the page.
What we store
Storage Level
Page Level — This issue is evaluated for each individual URL that contains structured data.
Database Table / Prisma Model
PageStructuredData
Stored Fields
| Field | Type | Description |
|---|---|---|
| schemaType | SchemaType | The type of schema (e.g., Organization, Person) |
| schemaFormat | SchemaFormat | The format of the schema (JSON-LD, Microdata, RDFa) |
| schemaIdentifier | String? | Unique identifier for the schema |
| rawJson | Json? | The raw JSON-LD or structured data content |
| schemaErrors | Json? | Array of validation errors found in the schema |
| isValidSchema | Boolean? | Whether the schema is valid according to validation |
| missingFields | Json? | Reserved for future use — the crawler always writes null here today; no check currently populates it |
Detection Dependencies
- The following data sources are required to evaluate this issue:
- HTML Document — The crawler parses the HTML to find structured data (JSON-LD, Microdata, RDFa)
- Structured Data Validation — The extracted schema is validated against Schema.org definitions
- Schema Parser — JSON-LD scripts, Microdata attributes, and RDFa markup are parsed