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.

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-us — AboutPage 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
- WebPage: 50+ duplicates → exactly 1 per page
- CollectionPage: 2 → 1 on
/en/projects - AboutPage: 2 → 1 on
/en/about-us - FAQPage: 2 → 1 on each service page
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.