Skip to content
Published Authored byBilly Reiner

Schema · How-to

Shopify FAQPage schema in 2026

FAQPage is the Schema.org type for a page whose dominant content is one or more frequently asked questions1. Google stopped showing FAQ rich results in Search on 2026-05-07, for every site; the government and health exception from 2023 ended with it2 — the visible accordion is gone, but the FAQPage type is still part of the active Schema.org vocabulary (v30.0). On Shopify, ship FAQPage only on pages where Q&A is the primary content: the FAQ hub itself, a Knowledge Base index, a policy page authored as Q&A. Do not sprinkle FAQ blocks onto products, collections, or the homepage.

Why we still recommend FAQPage in 2026 despite the rich-result retirement: AI engines (ChatGPT, Perplexity, Gemini, Claude) continue to parse FAQPage blocks as a Q&A extraction shortcut. The cost to ship is one Liquid loop over an FAQ metaobject array. The Google SERP enhancement is gone; the AI-engine citation lift is not.

What FAQPage is

Per Schema.org v30.0, FAQPage is 'a WebPage presenting one or more frequently asked questions.' Inheritance: Thing > CreativeWork > WebPage > FAQPage. The standard pattern: a single FAQPage object whose mainEntity is an array of Question objects, each with a name (the question text) and an acceptedAnswer (an Answer with text). The type remains in the active Schema.org vocabulary as of 2026-03-19.

Mental model: FAQPage declares "this page is a question-and-answer reference." The Question objects inside mainEntity are the individual Q&A pairs. The Answer.text is the verbatim answer. This is the only schema type in the library where AI engines can extract one full answer to one full question without any prose inference at all — which is precisely what makes it useful even after the rich-result retirement.

The 2026-05-07 retirement, plainly

Since 2023 Google had shown FAQ rich results only for well-known, authoritative government and health websites. On 2026-05-07 it stopped showing them altogether: Google's changelog says the feature will no longer appear in Google Search starting May 7, 2026, and on 2026-06-15 Google removed the FAQ rich result documentation because the feature is no longer shown. Every domain lost the accordion, government and health sites included. The FAQPage type itself remains valid in the Schema.org vocabulary.

When to still ship FAQPage on Shopify

Three Shopify pages still earn FAQPage JSON-LD in 2026: (1) the main FAQ hub page (Shopify Pages route, typically /pages/faq), (2) a Knowledge Base index page when the merchant uses Shopify's Knowledge Base app to centralise FAQs, (3) policy pages formatted as Q&A (Shipping FAQ, Returns FAQ). All three share the property that Q&A IS the dominant content. Do not emit FAQPage on product pages, collection pages, blog posts, the homepage, or pages where the FAQ block is one small section among other content.

The Shopify Knowledge Base app saves FAQs you create manually, and auto-generated FAQs you override, as metaobjects under Content > Metaobjects9. The auto-generated FAQs you leave alone (built from your languages, customer account, shipping and return settings) are not saved as metaobjects, so a Liquid loop over the metaobjects will not include them. Knowledge Base FAQs are not displayed on the storefront3. The visible storefront FAQ page is the merchant's responsibility; the FAQPage JSON-LD on that page is, too.

FAQPage fields

The fields of the standard FAQPage pattern (Google's FAQ documentation, which used to set the requirements, was removed in June 2026): mainEntity (array of Question), each Question with name (Text — the question itself) and acceptedAnswer (Answer with text). Optional but useful: inLanguage (when the FAQ is in a non-default language), Question.author (when answers come from named experts), Answer.upvoteCount (when answers carry community signals).

  • mainEntity — required. Array of Question objects.
  • Question.name — required. The question text. Print it through | json, no quotes around the tag5.
  • Question.acceptedAnswer — required. One Answer object per question.
  • Answer.text — required. The full answer text. Pass through | strip_html if the source is rich text, then | json.
  • inLanguage — recommended for non-English FAQs.

JSON-LD example — FAQPage from Shopify metaobjects

The block below is FAQPage JSON-LD for a Shopify FAQ page whose Q&A pairs are stored as a metaobject collection (Content > Metaobjects > faq_entries with fields question and answer). The Liquid loop iterates the metaobject and emits one Question per entry.

JSON-LD FAQPage from Shopify metaobjects — fires on the FAQ hub page only
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "@id": "{{ shop.url }}{{ page.url }}#faqpage",
  "inLanguage": {{ request.locale.iso_code | json }},
  "mainEntity": [
{%- for entry in shop.metaobjects.faq_entries.values -%}
    {
      "@type": "Question",
      "name": {{ entry.question | json }},
      "acceptedAnswer": {
        "@type": "Answer",
        "text": {{ entry.answer | strip_html | json }}
      }
    }{%- unless forloop.last -%},{%- endunless -%}
{%- endfor -%}
  ]
}
</script>

Validation post-2026-05-07

Run validation against validator.schema.org rather than Google's Rich Results Test. FAQ is no longer among the Rich Results Test's supported types or Search Console's rich result reports, so Google's tools won't report on FAQPage at all. The Schema Markup Validator still parses FAQPage as a valid Schema.org type. Expected output: FAQPage detected, Question array parsed, zero structural errors.

One inLanguage detail in the example: it reads request.locale.iso_code, the language the shopper is viewing, because Shopify deprecated shop.locale and replaced it with request.locale8. The | json filter adds the quotes.

Shopify gotchas on FAQPage

Four gotchas. First: emitting FAQPage on pages where FAQ is not the dominant content, or where the questions and answers aren't visible on the page. Google's general structured data guidelines say not to mark up content that isn't visible to readers. Second: printing entry.question and entry.answer inside quote marks instead of through | json (a double quote or line break breaks the JSON; | escape is an HTML filter and doesn't prevent it). Third: emitting Answer.text with raw HTML from a rich-text metaobject field; pipe it through | strip_html before | json if you want plain text. Fourth: emitting FAQPage on every page of the FAQ section instead of consolidating to one FAQ hub page — duplicate FAQPage entities across the site dilute extraction confidence.

A fifth gotcha specific to Shopify Knowledge Base usage: only manually created and overridden FAQs are saved as metaobjects9, so untouched auto-generated FAQs never reach your loop, and the metaobject reference path may differ per store (e.g. shop.metaobjects.knowledge_base.values vs shop.metaobjects.faq.values vs a custom namespace). Verify the actual metaobject reference in the Shopify admin (Content > Metaobjects) before hard-coding the Liquid path.