XooCode(){

FAQPage

FAQPage is the schema type for a page where a single author answers a list of related questions. Product support pages, onboarding guides, pricing explanations, shop visitor info pages, anywhere you'd expect a "Frequently Asked Questions" heading. It's one of the cleanest schema types to implement and one of the most dramatically affected by Google's 2023 rich result policy changes.

Full example of schema.org/FAQPage json-ld markup

The markup is verified as valid with Rich Results Test from Google.

Highlight legend:Required by GoogleRecommendedOptional
schema.org/FAQPage
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@id": "https://xoocode.com/shop/dunmore-1290/faq",
  "@type": "FAQPage",
  "name": "Xoo Code Shop Dunmore: Visitor FAQ",
  "description": "Frequently asked questions about visiting, buying from, and receiving shipments from the Xoo Code Shop in Dunmore, Alberta. Covers hours, stock, returns, accessibility, and the Jane Xoo archive corner.",
  "url": "https://xoocode.com/shop/dunmore-1290/faq",
  "inLanguage": "en-CA",
  "datePublished": "2024-06-12",
  "dateModified": "2026-03-28",
  "publisher": {
    "@id": "https://xoocode.com/shop/dunmore-1290"
  },
  "mainEntity": [
    {
      "@type": "Question",
      "name": "What hours is the Dunmore shop open?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Monday to Friday 09:00 to 18:00, Saturday 10:00 to 16:00, closed Sundays and Canadian statutory holidays. The XooStructured product demo room closes thirty minutes before the retail floor. Call +1-555-072-1210 if you're driving from outside Medicine Hat and want to confirm we're open on a specific holiday weekend."
      }
    },
    {
      "@type": "Question",
      "name": "Can I try a XooTee Classic on before buying?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Yes. The XooTee rack is at the front of the shop next to the Jane Xoo archive corner. Fitting room is a single cabin at the back, no appointment needed. Current Classic stock: sizes XS to 2XL in the 2026 annual production run (SKU XOO-TEE-CL-001). Limited to one per customer per visit while the annual run lasts."
      }
    },
    {
      "@type": "Question",
      "name": "Do you ship orders placed in person, or only from the web shop?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "We ship in-store purchases to any Canadian address for CAD 12 flat rate, one to two business days handling, two to five business days transit. International orders (United States, Europe) have to go through xoocode.com directly so the checkout can collect destination customs data. Ask at the counter for a web-order voucher if you want to start the purchase in the shop."
      }
    },
    {
      "@type": "Question",
      "name": "Is the shop wheelchair accessible?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "The main retail floor, the Jane Xoo archive corner, and the XooStructured demo room are on a single level with a ramped entrance from the Eagle Butte Ave parking lot. The fitting cabin at the back is a 900mm door, which does not meet CSA B651 for powered wheelchair turn radius. We can bring items to the counter area for fitting instead. Accessible restroom is shared with the adjacent Dunmore Coffee House."
      }
    },
    {
      "@type": "Question",
      "name": "What is the Jane Xoo archive corner?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "A small glass-front display in the retail floor featuring reproductions of Dr. Jane Xoo's 1945 handwritten pediatric medical notes, the source material for the XooTee Classic graphic. Free to view during shop hours. The originals are held by the Royal Institute of Medicine in Copenhagen; we license the reproduction rights annually. A print-on-request handout summarising Dr. Xoo's life is available at the counter."
      }
    },
    {
      "@type": "Question",
      "name": "Can I see a XooStructured IDE demo in the shop?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Yes. The demo room at the back of the shop has four workstations running the current XooStructured release. Walk-ins welcome Monday to Friday 10:00 to 17:00, weekends by appointment only because we run guided demo sessions on Saturdays. Book a Saturday slot by emailing info@xoocode.com or calling the shop directly."
      }
    },
    {
      "@type": "Question",
      "name": "What is your return policy on XooTee purchases?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Unworn XooTee Classic shirts can be returned within 30 days of purchase for a full refund, with receipt. Worn shirts cannot be returned because the XooTee graphic is water-based screen print and any wash affects the colour saturation. Returns are free by mail within Canada; bring the shirt and receipt to the counter or mail to the shop address on your receipt. See the Product page for the schema.org-marked-up version of the full policy."
      }
    },
    {
      "@type": "Question",
      "name": "Do you carry other Xoo Code Inc. products beyond the XooTee?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "The retail floor carries the XooTee Classic, a small selection of printed XooCode reference books (including the hardcover schema.org gallery), and a set of limited-edition Dunmore-branded enamel pins tied to Xoo Code release events. The XooStructured IDE itself is a digital product sold through xoocode.com only; we can point you at the purchase flow from the demo room."
      }
    },
    {
      "@type": "Question",
      "name": "Is parking available at the shop?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Free on-site parking in the Eagle Butte Ave lot, shared with the adjacent Dunmore Coffee House. Six standard spaces and one accessible space closest to the ramped entrance. Large vehicles and delivery trucks should use the rear loading bay on the service road behind the building."
      }
    },
    {
      "@type": "Question",
      "name": "Can I join the Dunmore shop newsletter?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Yes. Paper signup at the counter or email info@xoocode.com with the subject line 'Dunmore newsletter'. We send two or three emails a year covering the annual XooTee production run, any Jane Xoo archive changes, and major XooStructured release events held at the shop. No commercial email list; we don't share subscriber data with Xoo Code Inc. marketing."
      }
    },
    {
      "@type": "Question",
      "name": "Do you host community events at the shop?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "The shop hosts a monthly Schema Saturday meetup on the second Saturday of each month, a small informal gathering for web authors who want to discuss structured data markup over coffee. Free to attend, capacity eighteen people, booking through the XooCode Events page. We also occasionally host book launches and library events organised by the Medicine Hat Public Library. Watch the shop's front window for current event posters."
      }
    }
  ]
}
</script>

FAQPage vs QAPage

schema.org has two distinct types for question-and-answer content and picking the wrong one silently disqualifies your markup. FAQPage is for pages where a single authoritative author answers many questions, such as your shop's info page, a product FAQ, or a service onboarding guide. QAPage is for community Q&A sites like Stack Overflow where a user asks one question and other users answer it; it expects acceptedAnswer plus optional suggestedAnswer entries from different authors. Google enforces this distinction: FAQ rich results never fire for QAPage markup, and QAPage rich results never fire for FAQPage markup. If you're an author writing your own FAQ, always FAQPage.

The 2023 rich result change

In August 2023 Google removed the FAQ rich result from most sites, limiting it to a narrow allowlist of government and well-established health authority domains. For everyone else, FAQ markup no longer produces the visible accordion card under search results. This does not mean FAQPage is obsolete. The markup still powers AI crawler consumption (ChatGPT, Perplexity, Gemini, Claude all read structured FAQPage data), feeds Google's Knowledge Panel and People Also Ask features, and matches voice assistant answers. Ship FAQPage for machine-readable Q&A, not for the SERP card.

Minimal valid version

The smallest markup that still produces a valid FAQPage entity. Use it as the floor. Reach for the advanced example above when you want search engines and AI agents to understand more about your content.

schema.org/FAQPage (minimal)
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "What hours is the shop open?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Monday to Friday 09:00 to 18:00, Saturday 10:00 to 16:00, closed Sundays."
      }
    },
    {
      "@type": "Question",
      "name": "Do you ship internationally?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Yes, via xoocode.com so the checkout can collect destination customs data. The in-store counter only ships within Canada."
      }
    }
  ]
}
</script>

Google rich results this unlocks

Markup matching this example makes your page eligible for the following Google Search rich results. The primary target drives the required / recommended property classification in the advanced code block above.

  • FAQ rich result (allowlist only since August 2023)primary
    Google docs

Common FAQPage mistakes

Mistakes that pass validation but silently fail to earn rich results or mislead consumers walking the graph. Avoid these and your markup will be ahead of most sites in the wild.

  1. 01

    Using FAQPage for community Q&A

    Wrong
    {
      "@type": "FAQPage",
      "mainEntity": [{
        "@type": "Question",
        "name": "How do I deploy?",
        "acceptedAnswer": { "text": "...", "author": "user_12345" },
        "suggestedAnswer": [{ "text": "...", "author": "user_67890" }]
      }]
    }
    Right
    {
      "@type": "QAPage",
      "mainEntity": {
        "@type": "Question",
        "name": "How do I deploy?",
        "acceptedAnswer": { "text": "...", "author": "user_12345" },
        "suggestedAnswer": [{ "text": "...", "author": "user_67890" }]
      }
    }

    FAQPage implies a single authoritative author answering many questions: your shop's FAQ page, a product support page, a pricing explanation. QAPage implies a single question with community answers: Stack Overflow, Reddit threads, user forum posts. The two types map to two different Google rich results and the wrong choice silently disqualifies your markup. Tell: if the answers have different authors or are user-generated, you want QAPage and mainEntity is a single Question, not an array. If you're writing your own FAQ, you want FAQPage and mainEntity is an array of Questions.

  2. 02

    FAQ content not visible on the page

    Wrong
    (FAQPage markup lists ten questions, but the rendered HTML only shows the top three. The rest are injected via JavaScript on click, pulled from an AJAX endpoint, or present only in a hidden sitemap variant of the page.)
    Right
    (FAQPage markup matches exactly what is rendered in the initial HTML server response. If you use an accordion or expand-on-click UI, the content is still in the page HTML from first paint, just hidden via CSS.)

    Google's FAQPage policy explicitly requires the marked-up questions and answers to be present in the visible content of the page. Markup that describes content not in the initial HTML violates the structured data general guidelines and historically triggered manual actions even before the 2023 rich result change. Accordion-style reveal is fine as long as the content is in the server-rendered HTML; JavaScript-injected or modal-only content is not. Always match your schema to what the page actually serves on first request.

  3. 03

    Plain text instead of HTML in Answer.text

    Wrong
    "acceptedAnswer": {
      "@type": "Answer",
      "text": "Click here for our return policy"
    }
    Right
    "acceptedAnswer": {
      "@type": "Answer",
      "text": "See our full <a href='/returns'>return policy</a> page for details on the 30-day window and refund timing."
    }

    Answer.text accepts a limited set of HTML tags: p, br, ol, ul, li, a, b, strong, i, em. Where the FAQ rich result is still eligible (government and health authority allowlist), Google uses this markup to render links and light formatting. AI crawlers consuming FAQPage also extract anchors from Answer HTML, which is how your FAQ answers become reference sources cited by ChatGPT, Perplexity, and Gemini. Using 'click here' with no link throws away both the rendered link in the rich result and the machine-readable citation target.

  4. 04

    Duplicate questions across multiple pages

    Wrong
    (The same Q&A pair appears verbatim in FAQPage markup on three different pages of the site: a product page, a help center page, and a sitewide footer FAQ widget.)
    Right
    (The Q&A pair appears once, on one canonical FAQ page. Other pages link to it rather than duplicate the markup.)

    Google's structured data guidelines treat FAQPage content as canonical: each Q&A pair should appear once on one authoritative page, not repeated across many. Duplicated FAQ markup confuses the dedup heuristics, can trigger 'duplicate structured data' warnings in Search Console, and wastes crawl budget. Pick one FAQ page per question set and link to it from elsewhere. If you have product-specific FAQs, put them on the product page; if you have sitewide FAQs, put them on a dedicated /faq page; don't repeat.

About the example data

The example below is the visitor FAQ for Xoo Code Shop Dunmore, the fictional Xoo universe retail outlet in Alberta. It follows the schema.org/FAQPage vocabulary, nests a mainEntity array of Question objects (each with an acceptedAnswer), and cross-references the LocalBusiness entity via @id on the page's publisher.

Comments

Loading comments...

Leave a comment