Free SEO Tools

Q&A Schema Generator

Build QAPage JSON-LD for community-style pages with one main question and submitted answers.

Suggested answers

QAPage JSON-LD
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "QAPage",
  "mainEntity": {
    "@type": "Question",
    "name": "How do I add structured data to a Q&A page?",
    "answerCount": 1,
    "acceptedAnswer": {
      "@type": "Answer",
      "text": "Add QAPage JSON-LD that describes the main question, the accepted answer, and any suggested answers visible on the page.",
      "author": {
        "@type": "Person",
        "name": "Jane Doe"
      }
    }
  }
}
</script>

Does your page qualify as a Q&A page?

QAPage markup is for one kind of page: a single question, followed by answers that visitors can post. Google’s Q&A guidelines put it plainly. Users must be able to submit answers to the question. If only your team can answer, the page is an FAQ or an article, not a Q&A page.

That rules out more pages than people expect. A blog post that answers a question is an article. A how-to guide is an article. A support article your staff wrote is an article or an FAQ. A product page where shoppers ask many questions isn’t a Q&A page either, because it holds more than one question. What qualifies is a forum thread, a community support question, or a page on a Q&A site where one question collects replies.

Google also says not to apply QAPage to every page of a forum just because some threads qualify. Tag pages, member profiles, search results and threads that aren’t questions don’t get it.

PageQAPage?Reason
Community thread with one question and a reply marked as the solutionYesOne question, answers from users, one accepted.
Forum question with replies but nothing accepted yetYesMark the replies up as suggested answers.
Staff-written help page with 12 questionsNoSite-written answers and many questions. Use FAQPage.
Blog post titled "How do I reset my router?"NoOne author, one long answer. Use Article or BlogPosting.
Product page with a customer questions widgetNoMany questions on one page.
Forum thread that is a discussion, not a questionNoUse DiscussionForumPosting.

What this generator outputs

The generator builds one QAPage whose mainEntity is a single Question. The main question goes in the Question’s name. If you fill in Question URL, it becomes the Question’s url. answerCount is the number of answers you enter: the accepted answer plus each suggested answer with text. The accepted answer becomes acceptedAnswer: an Answer with your text, an author (a Person with the name you enter) and an upvoteCount.

Each suggested answer you add becomes an Answer in a suggestedAnswer list. The Answer text field becomes its text, and the Answer label field becomes its name. Google doesn’t read name on an Answer, so the label is harmless but does nothing; leave it blank if you like. Suggested answers with empty text are skipped.

Watch two defaults. The author field starts with a placeholder name, and it is printed exactly as typed, so replace it with the username shown on the page. The upvote count starts at 0, and a count of 0 or a blank count is left out of the output. Only the accepted answer gets an author and an upvote count; suggested answers get neither.

FieldBecomesNotes
Main questionmainEntity.nameRequired by Google. Use the thread title as shown.
Question URLmainEntity.urlOptional. Use the thread’s canonical URL.
Accepted answeracceptedAnswer.textEvery Answer needs its full text.
Answer authoracceptedAnswer.authorA Person with a name.
UpvotesacceptedAnswer.upvoteCountLeft out when 0 or blank.
Suggested answer textsuggestedAnswer[].textRows without text are skipped.
Answer labelsuggestedAnswer[].nameNot used by Google.

Accepted answers and suggested answers

acceptedAnswer is for an answer the page itself shows as accepted: marked as the solution by the person who asked, or by a moderator, with a visible label. suggestedAnswer is for every other answer. A question needs at least one of the two to be eligible for the Q&A rich result.

Don’t promote an answer to accepted because it is the best one or because your staff wrote it. If the thread shows no accepted answer, there is none to mark up: put the replies in suggestedAnswer and leave acceptedAnswer out. The generator always builds acceptedAnswer from its Accepted answer field, so in that case add the reply as a suggested answer and delete the acceptedAnswer object from the output.

Mark up the answers that appear on that URL, not answers on page two of a long thread. answerCount still gives the total, so a question with 40 replies that shows 20 per page can say 40 while listing 20 Answer items.

Comments aren’t answers. A reply asking for more detail, or a comment under an answer, belongs in schema.org’s Comment type or nowhere, never in suggestedAnswer.

A thread where nobody accepted an answer

Before: "acceptedAnswer": {"@type": "Answer", "text": "Hold the power button for 10 seconds to reset it."}

After: "suggestedAnswer": [{"@type": "Answer", "text": "Hold the power button for 10 seconds to reset it.", "upvoteCount": 4}]

Illustrative values. Nobody marked that reply as the solution, so it is a suggestion, however good it is.

QAPage, FAQPage or DiscussionForumPosting

Three schema types cover pages made of questions and replies, and choosing the wrong one is the commonest Q&A markup mistake.

TypeUse it forWho writes the answers
QAPageOne question per page, with its answers.Visitors, and sometimes staff too.
FAQPageSeveral questions per page, one answer each.The site.
DiscussionForumPostingForum threads and posts that are conversations rather than a question.Visitors.

Google’s discussion forum documentation sends question-and-answer content to QAPage and the rest of a forum to DiscussionForumPosting. A support community often needs both, chosen per thread: questions get QAPage, while announcements, feature requests and general chat get DiscussionForumPosting.

Where Q&A pages come from in WordPress

On WordPress, Q&A pages usually come from a forum or question-and-answer plugin, such as bbPress, rather than from posts you write by hand. Before adding anything, view the source of one thread and search for QAPage and DiscussionForumPosting. Some of these plugins print markup already. If yours does, fix its settings or its template rather than adding a second QAPage block that describes the same question twice.

Then check what your SEO plugin prints for the same URL. If threads are stored as an ordinary post type, Yoast SEO, Rank Math or SEOPress may describe each thread as an Article in their own graph. In Rank Math, change that for the post type under Rank Math SEO, Titles & Meta, then the post type’s tab, Schema Type. In Yoast SEO, open Yoast SEO, Settings, Content types, pick the post type and change its schema defaults. A thread marked up as both an Article and a QAPage gives Google two answers to what the page is.

Pasting a generated block into each thread doesn’t scale, and it goes stale the moment someone replies or votes. For a live forum, use the generator to build one correct example, then have whoever maintains the theme or plugin print the same structure from each thread’s data, with answerCount, votes and dates filled in on every page load.

  1. 1.Pick a representative thread with an accepted answer and at least two other replies.
  2. 2.Fill in the generator from that thread and add the properties it leaves out.
  3. 3.Paste the result into the Rich Results Test’s code tab and fix any errors.
  4. 4.Give the tested example to your developer as the template for every question thread.
  5. 5.After it ships, test three live threads: one with an accepted answer, one without, and one with no replies.

Worked example: a support community thread

An illustrative case. A smart-home brand runs a support community on its WordPress site. The thread "Why does my thermostat show E4?" has three replies. The person who asked marked the second reply as the solution, and the page shows a Solved label on it with 12 upvotes. The other two replies have 4 votes and 1 vote.

Filled in from the page, the generator gives you the question, the accepted answer with its author and upvotes, and two suggested answers. answerCount comes out as 3. You then add the question’s author and date, an author, date and vote count for each suggested answer, and a url for every answer pointing at its anchor in the thread.

The accepted answer, as generated and as completed

Before: {"@type": "Answer", "text": "E4 means the sensor lost contact. Reseat the sensor cable, then restart the unit.", "author": {"@type": "Person", "name": "dmitri_support"}, "upvoteCount": 12}

After: {"@type": "Answer", "text": "E4 means the sensor lost contact. Reseat the sensor cable, then restart the unit.", "author": {"@type": "Person", "name": "dmitri_support", "url": "https://example.com/community/u/dmitri_support"}, "datePublished": "2026-09-14T10:02:00+01:00", "upvoteCount": 12, "url": "https://example.com/community/t/thermostat-e4#reply-2"}

Illustrative values. Every added property is something the page shows: the profile link, the post time and the link to the reply.

The Rich Results Test then shows one valid Q&A item. If a warning remains, read it. A missing optional property is a warning you can live with, as long as everything the page shows is marked up and nothing it doesn’t show is.

Verifying with the Rich Results Test and the Q&A report

As of October 2026, Q&A is still a rich result type Google supports. It wasn’t part of the FAQ retirement in May 2026, and the Rich Results Test still reports QAPage items. Test the live thread URL, not only the code, so you see what Googlebot receives after WordPress, your cache and any forum plugin have done their work. A valid result lists one Q&A item. Errors mean the page isn’t eligible; warnings mean it is eligible but missing something recommended.

After Google recrawls your threads, Search Console shows a Q&A report. It splits question URLs into valid items and items with issues, names each issue, and lets you ask Google to validate a fix once you deploy it. A template bug shows up there as the same error on hundreds of threads at once, which is how you spot it.

The Schema Markup Validator at validator.schema.org is a useful second check for syntax. It validates against schema.org, including properties Google ignores such as the label on suggested answers, but it says nothing about eligibility for Google’s Q&A result.

Troubleshooting Q&A markup by symptom

These are the faults that come up most with QAPage markup on WordPress forums, and where each usually comes from.

SymptomLikely causeFix
Missing field "answerCount"The block was edited by hand, or built by another tool, and lost it.Add the total number of answers to the Question.
Missing field "author", or "name" (in "author")The question or a suggested answer has no author, or the author has no name.Add an author with the username shown on the page.
Error that the question has no answerThe answer text was empty, so the answer was dropped.Add the answer text, or remove the markup from unanswered threads.
An Article item and a Q&A item on the same threadThe SEO plugin also labels the thread as an article.Change that post type’s schema type in the SEO plugin.
The Q&A report counts more items than you have threadsTag, profile or search pages print QAPage too.Print QAPage only on single question threads.
Valid items but no Q&A result in SearchEligibility isn’t a guarantee. Google decides per query.Nothing to fix while the items stay valid.

When QAPage markup isn’t worth the effort

A thread with no replies can carry QAPage markup with answerCount 0, but it can’t get the Q&A rich result, because the question needs an accepted or suggested answer. If most of your threads go unanswered, the markup will do little until the community does.

Google also won’t show Q&A results for content that is obscene, sexually explicit, violent, dangerous or hateful, and its guidelines rule out QAPage for advertising. A poorly moderated forum can get every property right and still never see the result.

And markup does nothing on a page Google won’t index. A thread that is noindexed, canonicalized to another URL or blocked in robots.txt can carry perfect QAPage markup to no effect, so check the thread itself is indexable first.

FAQ about the Q&A Schema

What is the difference between FAQPage and QAPage?

FAQPage is for questions your site answers, usually several on one page. QAPage is for a page built around one question where visitors post the answers, such as a forum or community thread. If visitors can’t submit answers, the page isn’t a Q&A page.

Do I need an accepted answer?

No. A question needs at least one acceptedAnswer or suggestedAnswer. Use acceptedAnswer only when the page shows that an answer was accepted, by the asker or a moderator. If none was, put every reply in suggestedAnswer.

What is answerCount, and is the generator’s number right?

It is the total number of answers to the question, and Google’s Q&A documentation lists it as required. This generator prints the number of answers you entered. If the thread has more answers than you marked up, change it to the real total, for example "answerCount": 40.

Can I use QAPage on a blog post that answers one question?

No. Google’s guidelines exclude blog posts, how-to guides and essays that answer a question, because visitors can’t submit their own answers. Use Article or BlogPosting markup instead.

Is the Q&A rich result still available in October 2026?

Yes. QAPage is still a supported rich result type, the Rich Results Test still reports it and Search Console still has a Q&A report. It wasn’t part of the May 2026 FAQ retirement. Valid markup still doesn’t guarantee the result for any query.

Should every answer in a long thread be marked up?

Mark up the answers shown on that URL, and don’t add answers a visitor can’t see there. answerCount still gives the total number of answers to the question.

My forum plugin already prints markup. Should I add this as well?

No. Test a thread in the Rich Results Test to see what the plugin prints. If properties are missing, fix the plugin’s settings or template rather than adding a second QAPage block for the same question.