All articles
·by · Manilla Services·SEOStructured DataJSON-LDSchema.orgRich Results

How to fix duplicate JSON-LD nodes: WebPage ×2, CollectionPage ×2, FAQPage ×2

A schema.org audit surfaced duplicate WebPage and CollectionPage nodes on dozens of pages — invisible in code, visible in Rich Results Test. How we centralized them into a single @graph.

How to fix duplicate JSON-LD nodes: WebPage ×2, CollectionPage ×2, FAQPage ×2

The problem

Rich Results Test flagged an extra WebPage on every inner page, on top of the one emitted explicitly. On /en/projects there was CollectionPage twice. On /en/about-usAboutPage twice. Service pages had FAQPage twice as well.

It was invisible in the code. Every page had a clean JsonLd with a proper @graph. The duplication came from somewhere else.

The cause (four common sources)

Source 1: a global siteGraph emitted in the layout

The RO and EN layouts emitted a shared @graph with Organization, WebSite and — the mistake — a generic WebPage with @id: pageUrl (where pageUrl was the home URL). The layout runs on every page, so the home WebPage was being emitted on /en/projects, /en/about-us, /en/blog, anywhere.

Fix: remove WebPage from siteGraph.ts entirely. Emit WebPage explicitly only where needed (home RO, home EN), with a local @id (/#webpage or /en#webpage).

Source 2: multi-type [WebPage, CollectionPage] + a second separate CollectionPage

On /en/projects, the JSON-LD had three nodes: a multi-typed [WebPage, CollectionPage], a BreadcrumbList, and a second CollectionPage with @id: #collection holding hasPart. Rich Results Test saw two CollectionPage nodes (even though the @ids differed).

Fix: collapse to two nodes — a single CollectionPage with hasPart inline, plus BreadcrumbList. Delete the duplicate #collection node.

Source 3: multi-type [WebPage, AboutPage] + a second AboutPage

Same mistake as (2), on /en/about-us. The main node was [WebPage, AboutPage], and an aboutLd at the end of the graph added a second AboutPage with a fragment-less @id.

Fix: reduce to a single AboutPage (it's a subtype of WebPage, so no multi-type needed). Delete aboutLd.

Source 4: components auto-emitting schema

Components like <FaqList> and <Breadcrumb> auto-emitted their own JSON-LD (FAQPage, BreadcrumbList) even when the page's centralized graph already defined them.

Fix: pass emitSchema={false} on these components whenever the page defines the schema in the centralized @graph.

Verification

Rich Results Test (search.google.com/test/rich-results) — load the URL, verify each @type appears exactly once. Search Console → Enhancement shows any remaining errors after re-indexing (5-14 days for the next crawl).

The result


This is exactly the kind of technical audit we do in the SEO / AI-SEO audit & fix service — real audit with Rich Results Test and code-level fixes, not a PDF of recommendations. See also the Continuous SEO retainer for ongoing monitoring.