All postsBuilds

FAQ Schema Got a Page Quoted in an AI Answer. The Exact Markup.

Somebody asked an AI about your business this week. Maybe your pricing. Maybe whether you give refunds. The AI answered in three seconds, and you have no...

Garvit Sharma

Garvit Sharma

17 June 2026 · 8 MIN READ

Builds

FAQ Schema Got a Page Quoted in an AI Answer. The Exact Markup.

webight.com
On this page

Somebody asked an AI about your business this week. Maybe your pricing. Maybe whether you give refunds. The AI answered in three seconds, and you have no idea what it said or where it pulled the answer from.

See, two years ago this was a rankings problem, and you could at least check your rankings. Now a slice of your customers never touches a results page at all. They type a question into ChatGPT or Perplexity in plain words and decide based on whatever comes back.

We run a WhatsApp and LINE booking bot for a boutique hotel, and that bot has produced 600+ direct bookings without a rupee spent on ads, so I watch that property's funnel closely. Over the past few months, guests started mentioning at check-in that they had asked an AI about the hotel's policies before booking. The answers they described matched the lines on the hotel's FAQ page almost word for word. That page has 9 questions sitting visibly on it, and FAQPage schema wrapping the exact same text.

That is the whole post in one line: an FAQ page is the most machine-quotable format on the web, and FAQPage schema is the label that tells every parser exactly where the quotes are. One condition. The questions have to exist on the page where a human can read them.

Why a question and answer pair is the easiest thing to quote

An answer engine does two jobs. It finds passages relevant to the question, then it compresses them into a reply. A 50-word paragraph sitting directly under the literal question it answers is the cheapest possible passage to lift. No inference needed. The heading matched the query, the answer is already the right length, done.

Now compare that with how most service businesses publish the same information. Pricing buried in a proposal PDF. Refund terms in paragraph six of a terms page written by a lawyer. A "process" section that takes 400 words to say "half upfront, half on delivery". An AI can still dig that out, but every extra step of digging is a chance for it to skip your site and quote a competitor who answered cleanly.

FAQ content is conversational by construction. "How much does a website cost?" is a heading on your page and, almost character for character, the query a customer types into a chat box. You are pre-writing the retrieval match. That's it. That is the entire mechanism, and it costs you one afternoon.

The one rule: nothing invisible

Every question in your schema must exist visibly on the page. Same wording. Same answer.

Schema that describes content users cannot see is a structured data violation in Google's guidelines, and it is also just lying to parsers. The moment your markup says one thing and your page says another, you have two versions of the truth, and you cannot control which one gets quoted. I have seen sites stuff 20 questions into JSON-LD with zero matching text on the page. Lazy, and pointless, because the systems doing the quoting cross-check the rendered page anyway.

Accordions are fine. A question inside a collapsed <details> element counts as visible because the reader can open it. Content that exists only inside a script tag does not count, ever.

One more thing before the code. Google pulled FAQ rich results for most sites in August 2023 and kept them only for government and health pages. A lot of developers deleted their FAQ schema that week. I kept mine everywhere, because the consumers of this markup now include AI crawlers, and a machine-readable map of question to answer is precisely the format they were built to eat.

The exact markup

Here are the 5 questions from our own pricing page at webight.com. Every figure in here is real and public. Swap the text for your business and paste it into your page's <head> or body.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "How much does a website cost?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Landing pages start at INR 7,999 (about $149) and full websites start at INR 24,999. The final number depends on page count, integrations, and whether you want AI or automation built in. You get a fixed quote before kickoff and the price does not move after that."
      }
    },
    {
      "@type": "Question",
      "name": "How do payments work?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "50% upfront to book the slot, 50% on delivery. No hourly billing and no surprise line items. For ongoing work we run monthly retainers with the scope agreed in writing before the month starts."
      }
    },
    {
      "@type": "Question",
      "name": "What if I am not happy with the work?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "There is a 7-day money-back window after kickoff. If the direction feels wrong in the first week, say so and the upfront payment comes back in full. After that, revisions happen inside the agreed scope until the deliverable matches what we wrote down together."
      }
    },
    {
      "@type": "Question",
      "name": "What do you build with?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Next.js and TypeScript deployed on Vercel, Supabase with Postgres for data, Tailwind for styling, and n8n for automations. The stack is boring on purpose: it ships fast and any developer can take over the code later."
      }
    },
    {
      "@type": "Question",
      "name": "Do you work with clients outside India?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Yes. Current and past clients are in India, the Gulf, the US, Southeast Asia, and the Netherlands. Everything runs over WhatsApp and email, and timezones have not been a problem yet."
      }
    }
  ]
}
</script>

Run it through validator.schema.org or Google's Rich Results Test before shipping. Both are free and take under a minute.

One source of truth in Next.js

The markup above has a failure mode: someone edits the visible FAQ next quarter and forgets the JSON. Now your schema lies. The fix is to render both from one array so they cannot drift. This is the component pattern I use on client sites:

// components/Faq.tsx
const faqs = [
  {
    q: "How much does a website cost?",
    a: "Landing pages start at INR 7,999 (about $149) and full websites start at INR 24,999. The final number depends on page count, integrations, and whether you want AI or automation built in. You get a fixed quote before kickoff and the price does not move after that.",
  },
  {
    q: "How do payments work?",
    a: "50% upfront to book the slot, 50% on delivery. No hourly billing and no surprise line items. For ongoing work we run monthly retainers with the scope agreed in writing before the month starts.",
  },
  {
    q: "What if I am not happy with the work?",
    a: "There is a 7-day money-back window after kickoff. If the direction feels wrong in the first week, say so and the upfront payment comes back in full. After that, revisions happen inside the agreed scope until the deliverable matches what we wrote down together.",
  },
  {
    q: "What do you build with?",
    a: "Next.js and TypeScript deployed on Vercel, Supabase with Postgres for data, Tailwind for styling, and n8n for automations. The stack is boring on purpose: it ships fast and any developer can take over the code later.",
  },
  {
    q: "Do you work with clients outside India?",
    a: "Yes. Current and past clients are in India, the Gulf, the US, Southeast Asia, and the Netherlands. Everything runs over WhatsApp and email, and timezones have not been a problem yet.",
  },
];

export default function Faq() {
  const schema = {
    "@context": "https://schema.org",
    "@type": "FAQPage",
    mainEntity: faqs.map((f) => ({
      "@type": "Question",
      name: f.q,
      acceptedAnswer: { "@type": "Answer", text: f.a },
    })),
  };

  return (
    <section>
      <h2>Frequently asked questions</h2>
      {faqs.map((f) => (
        <details key={f.q}>
          <summary>{f.q}</summary>
          <p>{f.a}</p>
        </details>
      ))}
      <script
        type="application/ld+json"
        dangerouslySetInnerHTML={{ __html: JSON.stringify(schema) }}
      />
    </section>
  );
}

One array, two outputs. Edit the question once and both the page and the schema update together. The invisible-content rule becomes impossible to break by accident.

How FAQ lines map to what people actually ask

This is the part most guides skip. Your page heading and the customer's chat query are rarely identical, but they share intent, and intent is what retrieval matches on.

On your page What people type into the AI
How much does a website cost? how much should a small business website cost in India
How do payments work? is 50 percent upfront normal for a web agency
What if I am not happy with the work? do web agencies give refunds if I hate the design
What do you build with? best tech stack for a small business site in 2026
Do you work with clients outside India? can I hire an Indian web agency from the US

Notice the pattern. The chat version is messier and loaded with doubt. Your answer has to resolve the doubt in the first sentence, because the first sentence is what gets quoted. "50% upfront to book the slot, 50% on delivery" survives compression. A paragraph that warms up for three sentences before stating the terms gets paraphrased into mush, or skipped.

The hotel taught me this. Its questions cover cancellation, check-in times, and whether the property takes direct bookings, because those are the exact doubts a guest carries into a chat box at 11pm. The bot answers them in conversation, the FAQ page answers them in public, and both use the same short sentences. The same answer, available in every channel a question can arrive through.

Here is your afternoon of work. Open your WhatsApp business chat or your inbox and read the last 30 customer conversations. The questions repeat, I promise. Take the 5 that repeat most, answer each one in 40 to 60 words where the first sentence stands alone, publish them visibly on one page, and wrap them in the markup above. Then next week, ask ChatGPT those same questions yourself and see what comes back.

So your customers are already interviewing an AI about you every single day. Hand it your answers, in your words, with a label on them, or keep letting it improvise from whoever wrote theirs down first.

If you ship it and the validator throws something weird, send me the page. I read every reply.

SEOStructured DataAI SearchJSON-LDWeb Development
Next move

We build custom platforms, websites, and automation.

The two people who build it are the two you talk to, and every price is on the page.

Garvit Sharma

Garvit Sharma

Full-stack developer and co-founder of Webight, a two-person web and AI studio in India. He writes these from real client work. More about us.