Structured data audit rules: JSON-LD and schema.org
Audit rules for structured data: JSON-LD syntax, required schema.org properties for each type, and entity identity across the whole site.
Structured Data rules work at two scales. Per-page rules read the JSON-LD a page carries and name the exact property each schema.org type is missing; markup that will not parse is reported before anything else, since nothing downstream can read it.
The rest read the entity map, the whole site’s JSON-LD collapsed into one graph. That is where the expensive failures live: sixty valid Organization blocks with nothing to say they are one organization pass every per-page check and still leave a search engine with sixty companies. The schema/entity-* rules cover identity, agreement and reachability across the crawl, and fixing structured data identity has the change to make in each generator.
Run only these rules
squirrel audit https://example.com --rule-include schemaWhere to start
These carry the highest severity and weight in the category.
- One organization, or sixty? Entities declared without an @id: Your site declares the same organization on every page with nothing to say they are one thing. A search engine reading 60 pages sees 60 organizations.
- 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.
- A publisher that points at nothing: A reference to an @id that nothing in the crawl declares. squirrel checks against the whole site, so a publisher the homepage declares still resolves.
- LocalBusiness schema: required name, address or areaServed: LocalBusiness markup with no name, an incomplete PostalAddress, or neither an address nor a service area. squirrel checks all three.
- Product schema: name, image, offers and review checks: Product markup with no name or image, an Offer missing price or availability, and no rating data. squirrel checks each product page.
Rules
| Rule | What it flags | Severity | Scope |
|---|---|---|---|
| A bare #organization is one entity per page, not one entity | A relative @id resolves against the page it sits on, so the same fragment on forty pages is forty identifiers. The markup validates and the entity still never accumulates. | warning | Site-wide |
| A business with nothing to attach its reputation to | This site has the pages a business has and no Organization entity for a search engine to hang any of it on. | info | Site-wide |
| A publisher that points at nothing | A reference to an @id that nothing in the crawl declares. squirrel checks against the whole site, so a publisher the homepage declares still resolves. | error | Site-wide |
| AggregateRating on the wrong page: visible and on-topic | A sitewide star rating stamped on privacy, terms and blog pages, or one no reader can see. squirrel flags both as policy risks. | warning | Per-page |
| AggregateRating: ratingValue, ratingCount and review checks | Rating markup missing ratingValue or a review count, and Review nodes with no author or reviewRating. squirrel checks both shapes. | warning | Per-page |
| An @id that nothing points at | Giving an entity an identifier is the expensive part. One that nothing references and that appears on a single page is doing no more than an inline block. | info | Site-wide |
| An author who is only a name string is not an entity | Articles with a byline and no Person entity, or a Person with nothing to identify them by. Most of what E-E-A-T is built on needs an identifier. | warning | Site-wide |
| An Organization on one page, a LocalBusiness on another | The same @id declared with different @type sets on different pages. A search engine merges them and then has to decide which types are authoritative. | warning | Site-wide |
| Article schema: headline, author and datePublished checks | Article JSON-LD missing headline, author or datePublished, or carrying a date that is not ISO 8601. squirrel checks both on every page. | warning | Per-page |
| BreadcrumbList schema: positions, names and what breaks | Breadcrumb markup with no itemListElement, items missing position or name, or positions out of order. squirrel checks every non-homepage URL. | info | Per-page |
| FAQPage schema: mainEntity, Question and acceptedAnswer | FAQ markup with no mainEntity, or Question entries missing name or acceptedAnswer. squirrel checks the structure on every page that carries it. | warning | Per-page |
| Invalid JSON-LD syntax: what breaks it and how to fix | A structured data block that will not parse, or parses but omits properties schema.org requires. squirrel names the exact type and property. | warning | Per-page |
| LocalBusiness schema: required name, address or areaServed | LocalBusiness markup with no name, an incomplete PostalAddress, or neither an address nor a service area. squirrel checks all three. | warning | Per-page |
| 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. | info | Site-wide |
| One organization, or sixty? Entities declared without an @id | Your site declares the same organization on every page with nothing to say they are one thing. A search engine reading 60 pages sees 60 organizations. | error | Site-wide |
| Organization schema: name, url, logo and sameAs checks | Organization JSON-LD missing name or url, with no logo, or a sameAs list that omits a social profile the site clearly runs. squirrel finds all three. | info | Per-page |
| Product schema: name, image, offers and review checks | Product markup with no name or image, an Offer missing price or availability, and no rating data. squirrel checks each product page. | warning | Per-page |
| Structured data coverage: pages that break your own norm | Forty of forty-five product pages carry Product markup and five do not. squirrel finds the gap against the site’s own pattern, not a generic rule. | warning | Site-wide |
| The same entity, two different logos | One organization declared on forty pages with two logos, two phone numbers or two names. A search engine picks one, and which one is not yours to choose. | warning | Site-wide |
| The whole LocalBusiness block, on every single page | Declaring the business in full on every page is the default of most page builders, and it is why so many local sites disagree with themselves about their own phone number. | warning | Site-wide |
| 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. | error | Site-wide |
| VideoObject schema: required props and duration format | A page with an embedded video and no VideoObject markup, or markup missing thumbnailUrl, uploadDate or an ISO 8601 duration. squirrel checks both. | warning | Per-page |
| WebSite SearchAction and the retired sitelinks searchbox | WebSite schema on a homepage with no SearchAction, or a SearchAction missing target or query-input. squirrel checks the homepage markup. | info | Per-page |
| Your organization is not connected to anything that corroborates it | sameAs is how a search engine learns the company on your site is the company on LinkedIn and Wikidata. Without it the entity stands alone. | info | Site-wide |
| Your pages disagree about who publishes this site | Two hundred articles name one publisher and three name another. The authority that should accumulate against one organization is divided. | warning | Site-wide |
Key terms
- Article schema: Article, NewsArticle or BlogPosting structured data with headline, dates, author and publisher.
- Author byline: The visible author name on an article, ideally linked to an author page and matched by an author entity in structured data.
- Entity: A thing a site describes in structured data, such as an organization, person or product, identified across pages so search engines and agents can tell it is one thing.
- FAQ schema: FAQPage structured data marking up question-and-answer pairs; Google now shows FAQ rich results only for a narrow set of sites.
- Generative engine optimization (GEO): Making content more likely to be retrieved, cited and quoted by AI answer engines; the term comes from a 2023 research paper.
- @id (JSON-LD node identifier): The JSON-LD @id that gives a node a stable IRI, so other nodes and pages can reference the same entity instead of redeclaring it.
- JSON-LD: JSON for Linking Data, the format Google recommends for structured data, embedded in a
<script type="application/ld+json">block. - LocalBusiness schema: LocalBusiness structured data with address, opening hours and geo coordinates for a physical business.
- NAP consistency: Name, address and phone number stated the same way across a site’s pages, schema and listings.
- Organization schema: Organization structured data naming the business behind a site, its logo, contact points and sameAs profiles.
- Product schema: Product structured data with offers, price, availability and reviews, used for product rich results and merchant listings.
- Rich results: Search result features (stars, breadcrumbs, product prices, video thumbnails) that Google can show when a page has eligible structured data.
- Structured data: Machine-readable statements about a page’s content, usually schema.org vocabulary in JSON-LD, that search engines and agents can parse.
- VideoObject schema: VideoObject structured data with name, thumbnail, upload date and duration so a video can appear in video results.
- WebSite schema: WebSite structured data naming the site, which Google reads for the site name in results, and optionally describing its internal search with a SearchAction.
Related categories
Crawlability flags rich result markup on a page that is noindexed. E-E-A-T looks for author and address markup among its trust signals, and Local SEO checks that the phone number and address agree across pages.
Learn more
- Entity map guide, for reading the site-wide graph these rules check
- Fix SEO issues with AI, the coding agent workflow for working through a report
- Website audit tool
- Sample report, with the Structured Data section on a real site
Disable all Structured Data rules
[rules]
disable = ["schema/*"]