squirrelscan
GitHub

Nothing says these pages are one site

A WebSite entity is what carries your site name in search results and what every page should point back to with isPartOf.

What a WebSite node does

A WebSite node is the thing your pages belong to. It carries the name a search engine can show above a result instead of the domain, and it is the node that names the publisher of the site as a whole rather than of one article. (It also used to declare the sitelinks search box, which Google retired in November 2024.)

Declaring it is half the job. If no page references it with isPartOf, the node exists and nothing is attached to it, which is most of the way to not having one.

This is an informational finding rather than an error. A site without it is behind, not broken.

What squirrel checks

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

  • 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.
  • Reports at info with the message This site declares no WebSite entity when there is none.
  • Reports at info with the message The WebSite entity has no @id, so nothing can reference it when one exists without an identifier.
  • Passes with the message A WebSite entity is declared with an @id when no page entities exist to link it.
  • Passes with the message A WebSite entity is declared and all N page entities link to it.
  • Reports at info with the message N of N page entities do not link to the WebSite with isPartOf, plus (+N more pages) when more matched than are listed.

Page entities are an explicit list of the WebPage and Article subtypes generators actually emit, not every subtype schema.org defines. A type outside that list means the rule says nothing about it rather than guessing.

A site whose markup describes only products or people, with no page-level nodes at all, still gets the first finding when it has no WebSite: the node is worth having regardless of what else is declared.

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 -f json and read the entities key for the full list.

How to fix it

Declare the WebSite once, with an @id, and reference it from every page node:

{
  "@context": "https://schema.org",
  "@graph": [
    { "@type": "WebSite", "@id": "https://example.com/#website",
      "url": "https://example.com/", "name": "Example",
      "publisher": { "@id": "https://example.com/#organization" } },
    { "@type": "WebPage", "@id": "https://example.com/about#webpage",
      "isPartOf": { "@id": "https://example.com/#website" } }
  ]
}

Every major SEO plugin emits this shape by default. If yours does not, the @graph above is the whole fix. See fixing structured data identity.

Rule IDschema/entity-website-missing
CategoryStructured Data
ScopeSite-wide
Severityinfo
Weight2/10

Enable / disable

Disable this rule

[rules]
disable = ["schema/entity-website-missing"]

Disable all Structured Data rules

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

Enable only this rule

[rules]
enable = ["schema/entity-website-missing"]

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.

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