View-source vs rendered JSON-LD
View-source is the HTML the server sent. Inspect / Elements is the DOM after scripts ran. SEO plugins usually print application/ld+json in the server HTML, so both views match. A theme or tag manager can inject a second graph after load. GraphClash fetches HTML and does not execute JavaScript, so it sees the server copy. If the extra block exists only in the rendered DOM, you will find it in Inspect, not in the scan.
Search for a repeated @type
Search the HTML for application/ld+json, then for Organization, WebSite, WebPage, Article, Product, FAQPage, or BreadcrumbList. Two scripts, or two nodes inside an @graph, can claim the same type. That is the start of a JSON-LD collision: same type, two stories.
Compare the @id values
Names can match. Identifiers often do not. https://example.com/#organization and https://example.com/#schema/Organization are different entities to a consumer, even when both say "Example Shop". A node with a type and no @id is still a second copy.
Check Yoast
Look for a script classed yoast-schema-graph. Yoast’s Organization node typically uses home_url() plus #organization, with related fragments such as #website, #logo, and #webpage. If that graph is present, Yoast is one emitter.
Check Rank Math
Look for rank-math-schema. Newer builds identify nodes with #schema/ patterns, for example /#schema/Organization. If Yoast and Rank Math are both active with schema on, a homepage often carries two Organization graphs. That fight is Yoast vs Rank Math.
Check the theme
Theme JSON-LD usually has no plugin script class and sometimes no @id. It can sit next to a complete Yoast or Rank Math graph and still be a third Organization or a second Product. We only read JSON-LD; theme microdata will not show up. The theme-specific fight is theme vs plugin.
Check WooCommerce
On a product or shop URL, WooCommerce often prints Product with offers or SKU. An SEO plugin or theme that also emits Product on that URL adds another node with a different @id. Keep Woo’s Product if the catalog is the source of truth. Details: WooCommerce duplicate Product schema.
Scan the public URL with GraphClash
Paste the same URL you can open logged out. We fetch that HTML, flatten every @graph, and list competing ids with a best-guess emitter. Free scans are not stored and are not given a shareable result URL. We do not execute JavaScript, read microdata, or change plugin settings.
Decide which emitter to keep
Pick one emitter per type. Disable Organization, WebSite, or Product in the plugin you are not using as the source of truth, and stop the theme from printing an extra copy. GraphClash only detects. It does not log into WordPress or write a replacement graph.
Example: two Organization nodes, different @id
Example — not a live site dump
Two scripts on one homepage, both claiming Organization, different identifiers. example.com is a placeholder, not a customer URL.
<!-- Example only. Two emitters, one page. -->
<script type="application/ld+json" class="yoast-schema-graph">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
"@id": "https://example.com/#organization",
"name": "Example Shop"
}
]
}
</script>
<script type="application/ld+json" class="rank-math-schema">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
"@id": "https://example.com/#schema/Organization",
"name": "Example Shop"
}
]
}
</script>Why Rich Results Test can still say valid
Google’s Rich Results Test asks whether a block is valid markup. It does not tell you which plugin emitted a second copy of the same @type. A page can pass that test and still carry two Organization nodes or two Product nodes. GraphClash is a diagnostic for competing sources, not a validator and not a penalty checker.
Specific fights
This page is the method. These pages are the individual clashes: