FAQPage Duplicate Field GSC Fix: JSON-LD vs Microdata

social card 892 faqpage duplicate field gsc fix json ld vs microdata
FAQPage Duplicate Field GSC Fix: JSON-LD vs Microdata

How two valid schema declarations on one page create a GSC error — and the single-line fix that resolves it

TL;DR — The Fix

If you have JSON-LD FAQPage schema and custom HTML FAQ sections with microdata attributes on the same page, you have two FAQPage declarations. Google will flag it. Fix: strip all itemscope / itemprop / itemtype attributes from the FAQ HTML. Keep the JSON-LD. Done.

Root cause: SCHEMA_FAQPAGE_DUPLICATE_001 — dual declaration, two valid methods, one page, one conflict.

The Story: JSON-LD and FAQPage Schema

Google Search Console flagged a FAQPage structured data error on thegeolab.net for a duplicate field conflict between JSON-LD schema and HTML microdata markup. The GEO Lab had already identified and resolved the root cause before the notification arrived.

Not in a “here’s a helpful heads-up” way. In a “Duplicate field: FAQPage detected across your site” way, arriving 3–5 days after we’d submitted the corrected pages for re-indexing. The fix was live. The re-crawl was queued. And Google’s notification system was somewhere in its own queue, composing a formal complaint about a corpse.

The reason we knew it was already fixed: AI Visibility console caught it first.

JSON-LD in <head> “@type”: “FAQPage” Microdata in HTML DUPLICATE FAQPage × 2 GSC ERROR 3–5 days later Fix: remove microdata. JSON-LD only.
Figure 1. Two valid FAQPage declarations collide into one GSC error. Fix: remove all microdata, JSON-LD only.

What Actually Happened (and Why It Was So Easy to Miss): Google Search Console vs WordPress

Here’s the thing about schema conflicts — they don’t break anything visible. The page looks fine. Rich results still show up in testing. You get no PHP error, no layout shift, no red text in the admin panel. The only symptom is a quiet duplication in the structured data layer that Google’s validators will eventually surface, and that your own audit tools will catch if you built them right.

We didn’t set out to create a duplicate FAQPage schema. Here’s how it happened anyway.

Step 1 — FAQPage JSON-LD added via functions.php schema filters (10 March)

This is the clean, Google-preferred way to declare structured data: a <script type="application/ld+json"> block with @type: FAQPage, completely separate from the HTML, no entanglement with the DOM. Added to the site’s theme functions as part of a structured data overhaul — completely separate from the HTML, living in a <script> block that renders only in the page source.

Step 2 — Custom HTML FAQs built via mu-plugin, microdata added intentionally

RankMath’s FAQ block had limitations we kept bumping into — styling constraints, ordering logic, rendering quirks in the v3 layout. So we built a custom FAQ component in geolab-toc.php and geolab-geo-defaults.php. The HTML worked. The accordion worked. The content was right.

The microdata attributes were added on purpose. Schema markup directly on the HTML elements seemed like a reasonable, belt-and-suspenders approach to structured data. Microdata is a valid Schema.org method. The problem wasn’t that the microdata was wrong — it was that the JSON-LD was also right, and Google doesn’t want two declarations of the same type on the same page.

What the FAQ HTML contained
<div>
  <div itemprop="mainEntity">
    <h3>Question text here</h3>
    <div>
      <p>Answer text here.</p>
    </div>
  </div>
</div>

Those itemscope / itemprop / itemtype attributes are microdata — an inline method of declaring structured data directly in HTML. Completely valid Schema.org. Also completely redundant when JSON-LD is already handling the same schema type on the same page.

Google’s Rich Results Test showed it clearly once we looked: two separate FAQPage declarations, both valid, both claiming to represent the same content. That’s the duplicate.

Step 3 — GSC flagged it (12 March). The AI Visibility Diagnostics Console confirmed it. Fixed same day.

The AI Visibility Diagnostics Console runs on a manual trigger — open it, run the schema check, and the report is ready in under five minutes. It flagged the duplicate FAQPage before Google’s crawler had re-visited the updated pages.

We stripped the microdata from the FAQ HTML, kept the JSON-LD, and re-submitted. 3–5 days later, the GSC error email arrived. The report described a problem that no longer existed on a site that had already moved on.

This is not a complaint about GSC. Crawl cycles take time. But it is a useful data point: if you’re only watching GSC for structured data errors, you’re watching a delayed feed. You will always be reacting to history.

Going deeper? The GEO Pocket Guide covers the full 30-check protocol, section-level audit checklist, and citation rate tracking template — free to download.

Going deeper? The GEO Experiments Collection documents every controlled test we have run — methodology, raw data, and what the results mean for practitioners.

The Fix

Before — HTML with microdata attributes (causes duplicate)
<div>
  <div itemprop="mainEntity">
    <h3>Your question?</h3>
    <div>
      <p>Your answer.</p>
    </div>
  </div>
</div>
After — Clean HTML, no microdata (let JSON-LD do the schema work)
<div class="faq-block">
  <div class="faq-item">
    <h3 class="faq-question">Your question?</h3>
    <div class="faq-answer">
      <p>Your answer.</p>
    </div>
  </div>
</div>
Keep this — JSON-LD block in <head> or end of <body>
<script type="application/ld+json">

</script>

That’s the entire fix. One schema method per page, one FAQPage declaration per page. The microdata attributes in the HTML were adding nothing except a conflict.

Why This Happens More Than You’d Think

The microdata pattern isn’t wrong — it’s just redundant when JSON-LD is already doing the job. Both methods are valid Schema.org. Both are readable by Google. The error is declaring the same schema type twice on the same page, not using microdata itself.

The specific trap: JSON-LD and microdata operate in completely separate parts of a page. JSON-LD lives in a <script> block, invisible in the DOM. Microdata lives as attributes on HTML elements, invisible in the rendered output. Neither one signals the presence of the other. It’s entirely possible to add both in good faith and not realise you’ve created a conflict until GSC tells you.

In our case the sequence was:

  1. FAQPage JSON-LD added via functions.php schema filters (10 March)
  2. FAQ HTML sections given microdata attributes in the mu-plugin component — seemed like good complementary practice
  3. GSC flagged “Duplicate field: FAQPage” (12 March)
  4. Fix: stripped microdata from HTML, kept JSON-LD only

The combination that produces this error:

Layer Declaration method Result
JSON-LD FAQPage active Via functions.php, RankMath, or any schema plugin Valid declaration ✓
HTML microdata also present itemscope / itemtype on the same page Valid declaration ✓
Both present simultaneously GSC error ✗

If you only use one method, you’re fine. The conflict lives at the intersection of two well-intentioned decisions made at different times.

Prevention Rule

One schema method per data type, per page. Always.

For FAQPage specifically: JSON-LD only. It’s what Google recommends, it’s easier to audit, and it’s completely separate from your HTML — which means changing your layout doesn’t accidentally change your schema.

When building any new structured data component, the check is:

  1. Is JSON-LD already handling this data type on this page?
  2. If yes — does the HTML contain any itemscope / itemprop / itemtype attributes for the same type?
  3. If yes to both → remove the microdata from the HTML.

This is now entry SCHEMA_FAQPAGE_DUPLICATE_001 in the failure registry. Root cause: dual declaration. Fix: single source of truth. Prevention: JSON-LD only for FAQPage, confirmed by the AI Visibility Diagnostics Console schema module at next audit.

Why the AI Visibility Diagnostics Console Caught It Before Google

GSC operates on crawl cycles. Google’s bots visit your pages on their own schedule — which for most sites means days to weeks between visits, depending on crawl budget and page authority. When GSC sends you an error notification, it’s reporting on what Google saw during its last crawl. By the time you receive it, the gap between the error’s origin and the notification can be substantial.

The AI Visibility Diagnostics Console works differently. The audit is manually triggered — open the console, run a schema check, and the report is ready in under five minutes. That speed matters: it runs against the live page before Google has re-crawled it. In this case, the console’s schema module flagged the duplicate FAQPage in that window, before Google’s next visit.

The practical difference: we fixed the problem before Google’s next crawl. From Google’s perspective, the error never existed in the version it eventually crawled. The GSC email described a ghost.

This isn’t a knock on GSC — it’s a genuinely useful tool for what it does. But “what it does” is report on past crawls, not present reality. If you’re making frequent changes to a site (which, during an active build, you always are), the gap between crawl-cycle feedback and a manual audit on demand matters.

Key GEO Takeaway

One FAQPage declaration per page, one format only. JSON-LD in the head, no microdata/itemtype on any HTML element. The GSC error is silent until the email arrives — 3 to 5 days after the duplicate goes live. The only reliable prevention is checking the rendered output with curl after every deployment.

Frequently Asked Questions

What causes the GSC “Duplicate field: FAQPage” error?

The error occurs when two FAQPage schema declarations are present on the same page simultaneously — typically one in JSON-LD (via a schema plugin or functions.php) and one as HTML microdata (itemscope / itemtype attributes on the FAQ HTML elements). Google does not accept two declarations of the same schema type on one page.

Will removing microdata from FAQ HTML break rich results?

Removing microdata does not reduce rich result eligibility. Microdata and JSON-LD are parallel methods for declaring the same structured data. Removing the microdata when JSON-LD is already present does not change what Google reads — it only removes the conflict. Rich results eligibility is determined by the JSON-LD declaration, which remains intact.

My Rich Results Test shows a warning, not an error — is this the same problem?

It can be. The Rich Results Test sometimes flags a duplicate schema as a warning rather than an error, depending on how the declarations overlap. The fix is identical either way: remove the microdata attributes from the FAQ HTML, keep the JSON-LD.

RankMath is outputting JSON-LD FAQPage but I didn’t add FAQ blocks — where is it coming from?

Check your RankMath Schema settings under the Page/Post settings panel. RankMath sometimes inherits schema templates from global defaults or page templates. If FAQPage is in a global schema template and your pages also have custom FAQ HTML with microdata, the conflict applies site-wide.

How do I audit all pages for duplicate schema at once?

The GEO Lab console has a dedicated schema module that checks every deployed page for duplicate declarations. Output includes the page URL, the conflicting types, and the declaration method (JSON-LD vs microdata). A full site audit runs in approximately 1 minute 38 seconds.

Failure Registry Entry

SCHEMA_FAQPAGE_DUPLICATE_001
symptoms:
  GSC email "Duplicate field FAQPage"
  Rich Results Test shows 2 FAQPage items on the same page

root_cause:
  Both JSON-LD @type FAQPage (via functions.php schema filters) AND
  HTML microdata itemtype=FAQPage (via custom mu-plugin components
  geolab-toc.php / geolab-geo-defaults.php) present on same page.
  Microdata added intentionally as belt-and-suspenders practice;
  conflict with existing JSON-LD not initially recognised.

fix:
  Remove / itemprop / itemtype attributes from FAQ HTML.
  Keep JSON-LD only. Re-submit pages to GSC.

prevention:
  JSON-LD only for FAQPage declarations. Verify no microdata attributes
  in FAQ HTML components before deploy. GEO console schema module
  flags duplicate declarations on manual audit run.

date_added: 2026-03-12
date_fixed: 2026-03-12
detection_method: GEO console audit (pre-GSC crawl)

Keywords

duplicate faqpage schema · faqpage duplicate field google · json-ld vs microdata faqpage · gsc duplicate field faqpage error fix · rankmath faqpage json-ld conflict · remove microdata faqpage wordpress · structured data duplicate schema fix

Version History

  • Version 1.0 — 12 March 2026: Initial publication. Documents SCHEMA_FAQPAGE_DUPLICATE_001 — dual FAQPage declaration via JSON-LD + microdata, detection via GEO console, fix and prevention rule.

What Practitioners Are Saying

“The FAQPage duplicate issue is one of those silent failures that can sit undetected for weeks. Publishing the exact GSC error message and the specific attributes to strip makes this a genuinely useful reference — not just another schema tutorial.”

— Daniel Cardoso, Head of Content Strategy, SaaSMetrics.io

“I found this fix while debugging a client site with the same error. The diagnosis is exactly right: JSON-LD in functions.php plus microdata in the theme template equals duplicate. The curl verification step at the end is what most guides skip.”

— Marco Silva, Technical SEO Lead, VisibilityStack

About the author: Artur Ferreira is the founder of The GEO Lab with over 20 years (since 2004) of experience in SEO and organic growth strategy. He developed the GEO Stack framework and leads research into Generative Engine Optimisation methodologies. Connect on X/Twitter or LinkedIn.

Have questions? Contact The GEO Lab