FAQPage schema missing on informational pages
What this means
Section titled “What this means”Pages at paths matching /faq, /guide, /how-to, /learn, or /help have no FAQPage schema. FAQPage is the most directly useful schema type for AI search: Perplexity, ChatGPT search, and Google’s AI Overviews all pull structured question-and-answer content from FAQPage blocks when generating responses. Without it, your answers are available only as unstructured prose, which is harder to extract and less likely to be cited.
How to fix it
Section titled “How to fix it”Add a FAQPage block to each informational page. Each question must include the full answer text in the text field.
Next.js App Router
Section titled “Next.js App Router”export default function FAQPage() { const schema = { '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: [ { '@type': 'Question', name: 'What is your refund policy?', acceptedAnswer: { '@type': 'Answer', text: 'We offer a full refund within 30 days of purchase. Contact support@yoursite.com to request a refund and we will process it within 5 business days.', }, }, { '@type': 'Question', name: 'How do I cancel my subscription?', acceptedAnswer: { '@type': 'Answer', text: 'Go to Account Settings, click Billing, then click Cancel Subscription. Your access continues until the end of the current billing period.', }, }, ], }
return ( <> <script type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify(schema) }} /> <main> <h1>Frequently Asked Questions</h1> </main> </> )}Next.js Pages Router
Section titled “Next.js Pages Router”import Head from 'next/head'
export default function FAQPage() { const schema = { '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: [ { '@type': 'Question', name: 'What is your refund policy?', acceptedAnswer: { '@type': 'Answer', text: 'We offer a full refund within 30 days of purchase. Contact support@yoursite.com to request a refund and we will process it within 5 business days.', }, }, { '@type': 'Question', name: 'How do I cancel my subscription?', acceptedAnswer: { '@type': 'Answer', text: 'Go to Account Settings, click Billing, then click Cancel Subscription. Your access continues until the end of the current billing period.', }, }, ], }
return ( <> <Head> <script type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify(schema) }} /> </Head> <main> <h1>Frequently Asked Questions</h1> </main> </> )}---const schema = { '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: [ { '@type': 'Question', name: 'What is your refund policy?', acceptedAnswer: { '@type': 'Answer', text: 'We offer a full refund within 30 days of purchase. Contact support@yoursite.com to request a refund and we will process it within 5 business days.', }, }, { '@type': 'Question', name: 'How do I cancel my subscription?', acceptedAnswer: { '@type': 'Answer', text: 'Go to Account Settings, click Billing, then click Cancel Subscription. Your access continues until the end of the current billing period.', }, }, ],}---<html> <head> <script type="application/ld+json" set:html={JSON.stringify(schema)} /> </head> <body> <main> <h1>Frequently Asked Questions</h1> </main> </body></html>SvelteKit
Section titled “SvelteKit”<script> const schemaJson = JSON.stringify({ '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: [ { '@type': 'Question', name: 'What is your refund policy?', acceptedAnswer: { '@type': 'Answer', text: 'We offer a full refund within 30 days of purchase. Contact support@yoursite.com to request a refund and we will process it within 5 business days.', }, }, { '@type': 'Question', name: 'How do I cancel my subscription?', acceptedAnswer: { '@type': 'Answer', text: 'Go to Account Settings, click Billing, then click Cancel Subscription. Your access continues until the end of the current billing period.', }, }, ], })</script>
<svelte:head> {@html `<script type="application/ld+json">${schemaJson}</script>`}</svelte:head>
<main> <h1>Frequently Asked Questions</h1></main><script setup>useHead({ script: [{ type: 'application/ld+json', innerHTML: JSON.stringify({ '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: [ { '@type': 'Question', name: 'What is your refund policy?', acceptedAnswer: { '@type': 'Answer', text: 'We offer a full refund within 30 days of purchase. Contact support@yoursite.com to request a refund and we will process it within 5 business days.', }, }, { '@type': 'Question', name: 'How do I cancel my subscription?', acceptedAnswer: { '@type': 'Answer', text: 'Go to Account Settings, click Billing, then click Cancel Subscription. Your access continues until the end of the current billing period.', }, }, ], }), }],})</script>
<template> <main> <h1>Frequently Asked Questions</h1> </main></template>Verify the fix
Section titled “Verify the fix”Paste the FAQ or guide page URL into Google’s Rich Results Test and confirm FAQPage is listed as a detected type. Re-run orino audit to confirm schema-faqpage-missing passes.