How to

How to find which plugin is outputting duplicate schema

Look at the rendered JSON-LD. Find the same @type appearing more than once with different @id values. Then attribute each block: Yoast (yoast-schema-graph, #organization), Rank Math (rank-math-schema, #schema/ ids), the theme (no plugin class, sometimes no id), or WooCommerce (Product with offers or SKU). GraphClash does that attribution on a public URL. It does not generate schema, log into WordPress, or store a free scan.

Check a page

Free, no account. Results stay in this browser session.

Free. No account. We do not store scans.

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:

FAQ

How do I find duplicate schema on a WordPress page?
Open the rendered HTML and search for application/ld+json. The same @type with two different @id values is the collision. Then read the script class and id pattern to see whether Yoast, Rank Math, the theme, or WooCommerce printed each block.
Yoast and Rank Math are both active. How do I tell which one printed Organization?
Yoast’s script is usually classed yoast-schema-graph and uses fragments such as #organization. Rank Math’s is usually rank-math-schema with #schema/ ids. Both plugins owning Organization is a common homepage. The specific fight is Yoast vs Rank Math.
Why do I have two Organization nodes?
Two emitters described the same entity with different identifiers. The names can match. The ids do not. Pick one emitter per type.
Schema looks different after a plugin update. What should I check?
Re-read the rendered JSON-LD. An update can add a node, rename @id, or turn a type back on. Compare the new ids to what you had disabled. The update-specific write-up is after a plugin update.

If you want the source identified automatically, run the page through GraphClash's free scan.

Back to the checker