squirrelscan
GitHub

Two plugins, two @ids, one organization split in half

Yoast declares your organization under one @id and WordLift under another. A search engine reads two companies, and neither gets the full picture.

How a site ends up with two of itself

This is almost always two plugins that do not know about each other. Yoast SEO emits an Organization under https://yoursite.com/#organization. WordLift emits the same organization under a data.wordlift.io identifier. Both are correct in isolation. Together they describe one company as two.

The cost is division. Your sameAs profiles attach to one, your article authorship to the other, your reviews to whichever the plugin that wrote them preferred. Neither entity ends up with enough corroboration to be worth a knowledge panel, and a search engine has no basis for merging them.

The same thing happens between a plugin and a hand-written block a developer added years earlier, or between a theme and a page builder.

What squirrel checks

The rule runs once per crawl, reads the entity map rather than the pages, and emits a single check named entity-split-identity.

  • Skipped with the message No entity map was built for this audit and the reason entity-map-unavailable when the run produced no map. This is not the same as a site with no structured data, and the rule refuses to conflate them: passing here would assert it had checked something it never looked at.
  • Reports at info with the message This site declares no JSON-LD entities on any crawled page when the map exists and is empty.
  • Passes with the message No entity is declared under more than one @id.
  • Fails with the message N entities are declared under more than one @id, plus (+N more declarations) when more matched than are listed. The value reads NAME under N: ID, ID and the expectation is one @id per entity.

Two entities count as one identity when their deduplicated, sorted @type sets are equal, their names match after trimming, collapsing whitespace and lowercasing, and they are declared together on at least one page.

That last condition is what keeps the rule honest. A large publisher can have two different authors called John Smith, each correctly given their own @id, and calling that an error would be worse than saying nothing. Two plugins describing one organization always emit on the same pages: on a real kinsta.com crawl the WordLift and Yoast declarations shared all 36 pages either appeared on. Two different people written about in different places never do.

A split needs at least two distinct @ids. Two same-named entities where one has no @id at all are usually schema/entity-identity’s finding, since that rule reports an unidentified entity spanning several pages. Neither fires when the unidentified one appears on a single page: one declaration has nothing to be split from.

Both sides of every split are listed as items, with their page counts, so you can tell which one the site actually uses.

Findings are capped at 10 items, and the count in the message is always the true total rather than the capped length. Run squirrel entities --problem split-identity for the full list.

How to fix it

Decide which @id is canonical. The one already referenced by your articles and your WebSite node is usually the right answer, and the page counts in the finding tell you which that is.

Then either remove the second declaration, or reduce it to a sameAs on the first:

{
  "@type": "Organization",
  "@id": "https://example.com/#organization",
  "name": "Example Ltd",
  "sameAs": ["http://data.wordlift.io/wl1/entity/example-ltd"]
}

If two plugins are fighting, turn the schema output off in one of them rather than trying to reconcile both. Most SEO plugins have a switch for this. See fixing structured data identity for where it lives in each.

Rule IDschema/entity-split-identity
CategoryStructured Data
ScopeSite-wide
Severityerror
Weight6/10

Enable / disable

Disable this rule

[rules]
disable = ["schema/entity-split-identity"]

Disable all Structured Data rules

[rules]
disable = ["schema/*"]

Enable only this rule

[rules]
enable = ["schema/entity-split-identity"]

enable replaces the default ["*"], so this is the only rule selected. Leave disable out: a rule that matches any disable pattern is skipped even when enable names it. Only an enabled setting under a rule’s own [rule_options] table overrides both lists.

For one run without editing the config: squirrel audit https://example.com --rule-include schema/entity-split-identity.

Entity findings are site-wide and ship in every audit, next to the per-page structured data rules. See Fix SEO issues with AI for how an agent works through a report.

References

Check your site

Run squirrel audit https://example.com, then squirrel entities to see the graph the finding came from. Signed-out local audits need no account and cost nothing. Signed-in audits spend credits.

Type to search…

↑↓ navigate↵ openesc close