← All guides

Duplicate FAQ Schema on One Page: What It Costs in 2026

Two FAQPage blocks on one page: Schema Markup Validator shows FAQPage 2 items with 0 errors, Google Rich Results Test lists only Articles.

Short answer: Google’s Rich Results Test no longer reports FAQ markup, so a duplicate FAQPage no longer shows up there. On our two-block test page, the Schema Markup Validator reported 2 FAQPage items with 0 errors, and the Rich Results Test showed no FAQ item. To fix it, find the plugin, page builder or template adding the second block and turn off or delete that block’s FAQ schema, keeping the one behind your visible FAQ.

Most of the advice on this problem was written when a duplicate FAQPage still cost you a visible search feature. That feature is gone. Below is what we measured instead, plus a checker you can copy.

What does duplicate FAQ schema actually cost in 2026?

Nothing we could measure in Google’s own tools. We published a page with two independent FAQPage blocks in the source: one from our plugin’s FAQ block, one hand-written script added through a Custom HTML block, the way a page builder or a second SEO plugin would add it. Then we ran the two validators most people are pointed at. Here is what came back.

ToolRunWhat it reported
Schema Markup Validator (schema.org)Sep 22, 20260 errors, 0 warnings, 3 items. Article: 1 item. FAQPage: 2 items
Rich Results Test (Google)Crawled Sep 22, 2026, 11:19:39 AM“1 valid item detected”. Detected structured data: Articles, 1 valid item. No FAQ row
Our own checker (below)Sep 22, 2026, 15:19 UTCscript 2: FAQPage, 3 questions. script 3: FAQPage, 2 questions
The test page is public at answerschema.com/duplicate-faqpage-test/, so you can paste it into the Schema Markup Validator. It is now set to noindex, so Google’s Rich Results Test reports it as “URL is not available to Google”; our run above was made before that change.

So the two tools disagree, and neither of them raises an error. The Schema Markup Validator counted both blocks and accepted both. The Rich Results Test did not mention FAQPage in either direction. It listed only Articles, the one detected type that still maps to a Google search feature.

Why did the “Duplicate field FAQPage” error exist at all?

Because it was tied to a search feature, not to whether the markup was valid. It appeared in Search Console for pages carrying more than one FAQPage block, back when Google built an FAQ rich result from that markup. Now that the rich result is gone, the check has nothing left to protect, and Rank Math’s own knowledge base says Search Console is phasing those reports out. The timeline is short and it is all in Google’s changelog.

  • August 8, 2023. Google’s Search Central blog said that “Going forward, FAQ (from FAQPage structured data) rich results will only be shown for well-known, authoritative government and health websites.” Most sites lost the feature here, nearly three years before Google retired the rich result itself. (Search Central blog)
  • May 8, 2026. Changelog entry “Deprecating the FAQ rich result feature”, saying it would no longer appear in Google Search starting May 7, 2026.
  • June 15, 2026. Changelog entry “Removing documentation for the FAQ rich result feature”. (Search Central changelog)

The documentation removal is easy to verify yourself. Request the old FAQPage reference URL and you get a 301 to the changelog, which we checked on September 22, 2026:

$ curl -s -o /dev/null -w "%{http_code} %{redirect_url}\n" \
  https://developers.google.com/search/docs/appearance/structured-data/faqpage

301 https://developers.google.com/search/updates#removing-faq-rich-result

Search Engine Journal, reporting on a Google notice in May 2026, wrote that Google said: “We will be dropping the FAQ search appearance, rich result report, and support in the Rich results test in June 2026.” That matches what we saw on our test page, but treat it as what was announced. We only verified the Rich Results Test behaviour, on one page, on one day.

Are two FAQPage blocks on one page invalid?

Not according to schema.org. FAQPage is still a current type, and the Schema Markup Validator accepted both of our blocks with zero errors and zero warnings. This split is not new. In the Bricks Builder forum thread on multiple FAQ schemas, opened on August 1, 2025, the reporter wrote: “According to Schema.org Validator, duplicate FAQPage entries are perfectly valid. However, Google complains this is invalid syntax as they share a duplicate @type value of FAQPage.” The thread records that the behaviour was changed in Bricks 2.3.6, announced in the thread on May 28, 2026.

Worth being precise about the two questions here. “Is it valid schema.org markup?” and “will Google build a search feature from it?” are two different questions, and the old error answered the second one.

How do I find every FAQPage block on my page?

View source and search for FAQPage works, but it misses blocks nested inside an @graph, which is how several SEO plugins ship their markup. Rank Math does it on this site. This script walks the whole JSON-LD tree instead, so a FAQPage buried three levels down still gets counted. It also looks for microdata, because a theme can declare FAQPage with itemtype attributes and nothing in the JSON-LD will hint at it.

#!/usr/bin/env python3
"""faq-dupe-check.py - find every FAQPage block on a page.
Usage: python3 faq-dupe-check.py https://example.com/page/ [more urls...]
"""
import json, re, sys, urllib.request

UA = "Mozilla/5.0 (compatible; faq-dupe-check/1.0)"
SCRIPT = re.compile(
    r'<script[^>]*type\s*=\s*["\']application/ld\+json["\'][^>]*>(.*?)</script>',
    re.S | re.I)
MICRO = re.compile(r'itemtype\s*=\s*["\'][^"\']*FAQPage', re.I)

def walk(node, hit):
    """Visit every dict in a JSON-LD tree (handles @graph, arrays, nesting)."""
    if isinstance(node, list):
        for item in node:
            walk(item, hit)
    elif isinstance(node, dict):
        hit(node)
        for value in node.values():
            walk(value, hit)

def faqpages(doc):
    found = []
    def hit(obj):
        types = obj.get("@type", [])
        types = types if isinstance(types, list) else [types]
        if "FAQPage" in types:
            qs = obj.get("mainEntity", [])
            qs = qs if isinstance(qs, list) else [qs]
            first = qs[0].get("name", "") if qs and isinstance(qs[0], dict) else ""
            found.append((len(qs), first))
    walk(doc, hit)
    return found

def check(url):
    req = urllib.request.Request(url, headers={"User-Agent": UA})
    html = urllib.request.urlopen(req, timeout=30).read().decode("utf-8", "replace")
    total = 0
    for i, raw in enumerate(SCRIPT.findall(html), 1):
        try:
            doc = json.loads(raw.strip())
        except json.JSONDecodeError as err:
            print("  script %-2d  UNPARSEABLE JSON-LD (%s)" % (i, err))
            continue
        for count, first in faqpages(doc):
            total += 1
            print("  script %-2d  FAQPage  %2d questions  %s" % (i, count, first[:52]))
    micro = len(MICRO.findall(html))
    if micro:
        total += micro
        print("  microdata  FAQPage  x%d  (itemtype attribute)" % micro)
    print("%s -> %d FAQPage block(s)%s" % (url, total, "  <-- DUPLICATE" if total > 1 else ""))
    return total

if __name__ == "__main__":
    if len(sys.argv) < 2:
        sys.exit(__doc__)
    for u in sys.argv[1:]:
        try:
            check(u)
        except Exception as err:
            print("%s -> could not fetch (%s)" % (u, err))

Run against our deliberately broken test page, it prints this:

$ python3 faq-dupe-check.py https://answerschema.com/duplicate-faqpage-test/
  script 2   FAQPage   3 questions  What is this page for?
  script 3   FAQPage   2 questions  Does a second FAQPage block break the page?
https://answerschema.com/duplicate-faqpage-test/ -> 2 FAQPage block(s)  <-- DUPLICATE

One limitation, stated plainly: this fetches the served HTML and does not run JavaScript. If a plugin injects its JSON-LD from a script after the page loads, this will not see it. For those pages, use the browser version below, which reads the live DOM.

(() => {
  const out = [];
  const walk = (n, f) => Array.isArray(n) ? n.forEach(x => walk(x, f))
    : (n && typeof n === 'object') && (f(n), Object.values(n).forEach(x => walk(x, f)));
  document.querySelectorAll('script[type="application/ld+json"]').forEach((s, i) => {
    let doc;
    try { doc = JSON.parse(s.textContent); }
    catch (e) { out.push({ where: 'script ' + (i + 1), kind: 'unparseable JSON-LD', questions: '-', first: e.message }); return; }
    walk(doc, o => {
      const t = [].concat(o['@type'] || []);
      if (!t.includes('FAQPage')) return;
      const qs = [].concat(o.mainEntity || []);
      out.push({ where: 'script ' + (i + 1), kind: 'JSON-LD FAQPage', questions: qs.length, first: (qs[0] || {}).name || '' });
    });
  });
  document.querySelectorAll('[itemtype*="FAQPage"]').forEach((el, i) => {
    out.push({ where: 'microdata ' + (i + 1), kind: 'Microdata FAQPage',
      questions: el.querySelectorAll('[itemtype*="Question"]').length, first: el.id || '(no id)' });
  });
  console.log('FAQPage blocks on this page: ' + out.length + (out.length > 1 ? '  <-- DUPLICATE' : ''));
  console.table(out);
  return out.length;
})();

Open DevTools, paste it into the Console and press Return. On our test page it returns 2 and prints both rows. If your console history is nearly empty, Chrome shows a self-XSS warning first: its own write-up says that to override the warning “you need to type ‘allow pasting’ into the input field”, and that once you have done so you will not see it again in that profile.

What did we find when we scanned the pages that rank for this?

We pointed the script at 12 pages we picked from searches for FAQ schema and duplicate FAQPage, between 15:14:56 and 15:15:37 UTC on September 22, 2026. Ten responded and three of those carried FAQPage markup. One timed out and one returned 404, so those two are unknown rather than clean.

PageFAQPage blocks in the served HTML
thegeolab.net (fixing duplicate FAQPage)2
schemavalidator.org/faq1 (21 questions)
neilpatel.com/blog/faq-schema/1 (4 questions)
rankmath.com, schemaapp.com, easyfaq.io, alphadc.net, wbpomniseo.com, muhammadhuzaifa.com, lawrencehitches.com0 in the served HTML
hashmeta.com, stackmatix.comnot fetched (timeout, 404)
A zero here means no FAQPage arrived in the HTML we were served. It does not prove the page has none, for the JavaScript reason above.

The interesting row is the first one. That page’s own prevention rule reads “One schema method per data type, per page. Always.” When we fetched it, it served two FAQPage nodes: one inside its @graph with five real questions, and a second standalone script holding a single question named “Your question?” with the answer “Your answer.” That looks like a template placeholder that was never filled in or removed. It may well be fixed by the time you read this, so run the script yourself rather than taking our word for it.

The second block is not always a competing copy of your FAQ. On the one page we caught, it was a stub nobody noticed, sitting in a template, publishing a fake question to whatever reads the markup.

Where does the second block usually come from?

Four sources cover nearly every report we read. The first three are documented by the vendor or by the person who hit them. The fourth we found ourselves.

SourceHow it shows upEvidence
SEO plugin plus page builderBoth the builder’s FAQ widget and the SEO plugin’s schema output run on the same contentA wordpress.org support thread titled “FAQ Schema appears twice – conflict between Rank Math and Elementor”, reported on Elementor Pro with Rank Math and Hello Elementor
Two features of the same pluginA schema generator entry and a separate FAQ block, both enabledRank Math’s own knowledge-base article tells you to delete one of the two
Several FAQ blocks in one pageEach block writes its own script instead of mergingThe Bricks forum thread, resolved in Bricks 2.3.6 per the thread
A template placeholderAn unfilled sample FAQ ships in a theme or partial and never gets removedThe “Your question?” block we found in our scan above

Should I still fix it?

Yes, but for smaller and more honest reasons than the old advice gave. We have no evidence that a duplicate FAQPage affects rankings, and no evidence that it affects whether an AI assistant cites you. We did not test either, and we have not seen anyone else’s test. What is left is still worth twenty minutes:

  • Placeholder stubs are published text. A block reading “Your question?” is a statement your site is making to anything that reads the markup.
  • Google’s general guideline has not changed. Its structured data policies, last updated July 10, 2026, still say: “Don’t mark up content that is not visible to readers of the page.” A second FAQ block whose questions appear nowhere on the page is marked-up content with no visible counterpart.
  • Two sources means two places to edit. Every future FAQ edit has to be made twice, or the markup drifts away from the page.
  • It tells you something is misconfigured. A plugin emitting schema you did not ask for is rarely doing it only for FAQs.

How do I fix it without losing the visible FAQ?

Keep the accordion your readers see and remove the extra markup behind it. Work in this order so you never delete the wrong one.

  1. Run one of the checkers above and note the script number and the first question of each block. That tells you which block belongs to which source.
  2. Decide which single source owns your FAQ markup. Usually the one that also renders the visible questions.
  3. Switch the schema off in the other one. Page builders normally have an FAQ schema toggle on the accordion widget; Rank Math’s article covers turning off its own block or its schema generator entry.
  4. If the extra block is a template placeholder, find the sample FAQ in the theme or partial and delete it there, not on the individual page.
  5. Clear any page cache, then run the checker again. You want one block, holding every question that is visible on the page.

Where does AI FAQ Schema fit?

AI FAQ Schema is our free plugin, and it builds its FAQPage JSON-LD from the same questions it renders on the page, so there is no second, invisible copy to drift out of sync. While building the test page we also put two of its FAQ blocks on one page: a block with two questions and a block with one. The result was a single FAQPage script holding all three questions, not two scripts. That was one page on one version, so check your own output rather than assuming it.

It does not stop another plugin from adding its own FAQPage, and we do not know of anything that would. That is what the checker is for. The plugin is free on wordpress.org. If you are still deciding whether to keep FAQ markup at all now that the rich result is gone, we tested that question separately in does FAQ schema still work in 2026.

FAQs

Is duplicate FAQ schema an error?

Not in schema.org terms. We ran a page carrying two FAQPage blocks through the Schema Markup Validator on September 22, 2026 and it reported 2 FAQPage items with 0 errors and 0 warnings. The old Search Console message was a rich-result eligibility check, not a validity check, and Google's Search Central changelog entry of May 8, 2026 said the FAQ rich result feature would no longer appear in Google Search starting May 7, 2026.

Does the Rich Results Test still show the Duplicate field FAQPage error?

It did not on our test. On September 22, 2026 at 11:19:39 AM we ran a page with two FAQPage blocks through Google's Rich Results Test. It crawled successfully, reported one valid item, and listed only Articles under detected structured data. There was no FAQ row and no duplicate error. Search Engine Journal reported in May 2026 that Google said it would drop FAQ support in the Rich Results Test in June 2026.

How do I find duplicate FAQ schema on my own page?

Use a checker that walks the whole JSON-LD tree rather than searching the source for the word FAQPage, because SEO plugins usually nest their markup inside an @graph. This post includes a Python script and a browser console snippet that both do this, count the questions in each block and report microdata FAQPage as well. Run one, and if it reports more than one block you have a duplicate.

Why does the Schema Markup Validator pass a page that Search Console flagged?

They answer different questions. The Schema Markup Validator checks whether your markup is valid schema.org. Search Console checked whether Google could build a specific search feature from it. A page can be valid schema.org and still be ineligible for a rich result. The Bricks Builder forum thread opened on August 1, 2025 describes exactly this split.

Should I remove FAQ schema entirely instead of fixing the duplicate?

That is a separate decision from the duplicate. Google's 2023 guidance on this markup said there is no need to proactively remove structured data that is not being used. If you keep it, keep one block, and make sure the questions in it are visible on the page, because Google's structured data policies still say not to mark up content that is not visible to readers.

Where does the second FAQPage block usually come from?

In the reports we read, four sources cover almost all of them: a page builder widget plus an SEO plugin marking up the same content, two features of one plugin both enabled, several FAQ blocks on one page each writing their own script, and an unfilled sample FAQ left in a theme template. The last one is easy to miss. During our scan on September 22, 2026 we found a live page serving a placeholder block whose only question was named Your question?

Try AI FAQ Schema free

Paste your FAQs, see your SEO and GEO scores, and publish with FAQPage schema. It also serves an llms.txt and lets you pick which AI crawlers can read your site.

  • No API key required
  • Works with any theme
  • Free on WordPress.org
Get it on WordPress.org

Want a feature? Ask for it.

The plugin is built around what users ask for. Tell us what’s missing, what broke, or what you’d like us to write about next.