QAPage schema for community question threads

QAPage schema is for a page whose whole subject is one question and the replies people posted to it, like a forum thread that opens with a question or a support page where customers help each other. You nest a single Question under mainEntity, and every reply goes inside it as an Answer.

The eligibility rule is strict: visitors must be able to submit their own answers. An FAQ you wrote yourself, a blog post that answers a question, and a product page carrying dozens of questions all fail it. FAQ rich results left Google in May 2026, and some sites are tempted to relabel FAQ blocks as QAPage to get something back. That is a guideline violation, not a workaround.

JSON-LD example

Copy this into a <script type="application/ld+json"> tag and replace the values with your own.

json
{
  "@context": "https://schema.org",
  "@type": "QAPage",
  "mainEntity": {
    "@type": "Question",
    "name": "Why does my sourdough starter smell like nail polish remover?",
    "text": "My starter is three weeks old and rises well, but every morning it smells sharply of acetone. Is it ruined?",
    "answerCount": 2,
    "upvoteCount": 14,
    "datePublished": "2026-08-02T07:15-05:00",
    "author": {
      "@type": "Person",
      "name": "crumbshot",
      "url": "https://example.com/members/crumbshot/"
    },
    "acceptedAnswer": {
      "@type": "Answer",
      "text": "It's hungry, not ruined. The acetone smell shows up when the yeast runs out of food. Feed it twice a day at a higher ratio, such as 1:5:5, for a few days and the smell will fade.",
      "upvoteCount": 22,
      "datePublished": "2026-08-02T09:40-05:00",
      "url": "https://example.com/forum/starter-acetone-smell/#answer-4412",
      "author": {
        "@type": "Person",
        "name": "levain_lou",
        "url": "https://example.com/members/levain_lou/"
      }
    },
    "suggestedAnswer": [
      {
        "@type": "Answer",
        "text": "Check the temperature too. Mine did this in a warm kitchen and stopped once I moved the jar somewhere cooler.",
        "upvoteCount": 6,
        "datePublished": "2026-08-03T18:05-05:00",
        "url": "https://example.com/forum/starter-acetone-smell/#answer-4419",
        "author": {
          "@type": "Person",
          "name": "rye_and_shine",
          "url": "https://example.com/members/rye_and_shine/"
        }
      }
    ]
  }
}

Properties

PropertyStatusWhat it is
mainEntityRequiredThe one Question the page is about. Google expects exactly one QAPage and one Question per page.
Question.nameRequiredThe short form of the question, for example "Why does my starter smell like acetone?"
Question.answerCountRequiredEvery answer the question has, including ones on later pages that you haven't marked up. Use 0 for a question nobody has answered yet.
acceptedAnswer or suggestedAnswerRequiredAt least one is needed for the rich result. acceptedAnswer means the asker, a moderator or voting chose it; suggestedAnswer covers everything else.
Answer.textRequiredThe complete answer. If you mark up only part of it, Google may not show it at all.
Question.textRecommendedThe long form of the question, as the asker wrote it.
upvoteCountRecommendedNet votes. With 5 upvotes and 2 downvotes, the value is 3.
Answer.urlRecommendedA link straight to that answer, usually the thread URL plus an anchor.
author / author.urlRecommendedWho asked or answered, with a link to their profile page.
commentCountRecommendedReplies that are comments rather than answers. answerCount plus commentCount should equal all replies.
digitalSourceTypeRecommendedTrainedAlgorithmicMediaDigitalSource for text from a model such as an LLM, AlgorithmicMediaDigitalSource for simpler bots. Leave it out for human posts.

Pages that pass, and pages that don't

Google's examples draw the line clearly.

QualifiesDoesn't qualify
A forum thread where users answer one questionAn FAQ written by the site with no way to add answers
A product support page where customers answer one questionA product page with many questions and answers
A how-to guide, blog post or essay that answers a question

Mark up only the pages that fit. A forum may host thousands of eligible question threads alongside announcement threads and general chat; only the question threads get QAPage. Content that is obscene, violent, hateful or promotes dangerous activity won't be shown as a rich result even when the markup is valid.

One exception exists for education sites: homework help pages where in-house experts pick a single answer can be eligible for a Q&A carousel. That case pairs well with Quiz markup for flashcards.

Accepted, suggested and comment

The three reply types mean different things, and Google is specific about each.

  • acceptedAnswer needs a real acceptance signal on your site: the asker marked it, a moderator picked it, or votes put it on top. Sorting by newest is not acceptance.
  • suggestedAnswer holds every other answer. A question can have many of them.
  • comment is for replies that clarify or discuss rather than answer, such as "Which flour are you using?"

Pagination changes the counts, not the markup. If a thread has 40 answers split across four pages, the first page can mark up its 10 answers while answerCount still says 40. Keep answerCount plus commentCount equal to the total replies of every kind.

Forum and help desk threads in WordPress

Forum plugins store threads as custom post types, and some print their own structured data. View the source of a live thread first; two Question blocks for one page is worse than none.

If nothing is printed, build the markup from your plugin's reply data and add it with Hydrogen SEO's hydrogen_seo_schemas filter, which runs before the plugin prints its JSON-LD:

php
add_filter( 'hydrogen_seo_schemas', function ( $schemas ) {
    if ( ! is_singular( 'topic' ) ) {
        return $schemas;
    }
    $question = my_forum_build_question( get_queried_object_id() ); // Your code: name, text, answerCount, answers.
    if ( $question && $question['answerCount'] > 0 ) {
        $schemas[] = [
            '@context'   => 'https://schema.org',
            '@type'      => 'QAPage',
            'mainEntity' => $question,
        ];
    }
    return $schemas;
} );

The check on answerCount matters: an unanswered question is valid markup but can't earn the rich result, so there is little point printing it. Point each author.url at a member profile page and mark those up with ProfilePage.

Before you ship it

  • Compare answerCount with the visible count on the page. Stale caches are the usual reason they drift apart.
  • Label AI-written or bot answers with digitalSourceType; Google assumes human authorship when the property is missing.
  • Keep the question text identical to what readers see, and don't rewrite answers into shorter versions for the markup.
  • Validate a thread in the JSON-LD checker, then test the live URL in Google's Rich Results Test.

Common questions

Can I use QAPage for my FAQ page now that FAQ rich results are gone?

No. QAPage requires that users can submit answers to a single question. A publisher-written FAQ doesn't meet that rule, however it is labeled.

What if a question has no answers yet?

The markup is still valid with answerCount set to 0, but a question without answers isn't eligible for the rich result.

Should moderator notes be answers?

Only if they answer the question. Clarifying questions, thanks and side discussion belong in comment.

When should a forum use DiscussionForumPosting instead?

When threads are general conversation rather than a question followed by answers. Google treats Q&A pages as a special case of forum pages.