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 or WooCommerce when there is specific evidence. Missing classes, generic IDs, offers and SKU alone do not identify the emitter. GraphClash labels uncertain sources as unknown. 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

First confirm that the declarations describe the same entity and contain conflicting or unnecessary duplicate information. Correct the source in staging and retain legitimate separate entities. 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 checks supported rich-result 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 a reason to review, not proof of a conflict. Read plugin-specific script classes and compare the entities. Generic IDs and Product fields alone cannot identify which plugin printed a 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?
The nodes may describe different organizations, repeat consistent information, or conflict about the same entity. Compare identity and values before disabling any markup.
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