If you are still running content through a tool that spits out a green checkmark when you hit exactly 2.8% keyword density, you have been operating under an outdated paradigm for at least two years.The nuance of modern on-page SEO has shifted from counting occurrences to measuring meaning.
Auditing JSON-LD Entity Graphs for Structured Data Quality
Structured data health checks often stop at validation. Rich Results Test passes. But quality is not syntax. The real question is whether markup creates an unambiguous entity graph. Google doesn’t reward schema; it interprets it. Sloppy implementations produce conflicting signals, duplicate entities, orphaned nodes, missing references. Result: rich results sporadic, knowledge panel inaccuracies, lower confidence.
Start by extracting JSON-LD exactly as bot sees. Rendered DOM, not source. JS frameworks can inject schema after hydration; server-side may emit one version, client another. Use headless browser or crawler with custom extraction. Capture all application/ld+json scripts, parse, flatten graph arrays, record identifiers, types, properties. Compare against canonical URL, title, visible content, internal links. If you only check raw HTML, you miss client-side mutations. If you only check rendered DOM, you may miss server-only bot differences. Audit both, then diff.
Entity identity matters. Every primary entity should have stable identifier. Prefer absolute URL with fragment, like root domain plus #organization or article path plus #primaryimage. Avoid blank nodes for recurring entities. If Organization appears on every page, same identifier everywhere. If WebSite and Organization are separate, link publisher to Organization by reference, not duplicate full object. When CMS templates generate different IDs per page for same entity, search engines see many organizations instead of one. That is schema decay.
Type selection. Don’t stack types just because validator accepts. Product, Offer, AggregateRating need accurate relationships. Article and BlogPosting are subtypes; use most specific. WebPage is not a catchall. BreadcrumbList should mirror visible breadcrumbs and URL hierarchy. If breadcrumb says Home > Category > Product but URL doesn’t, quality suffers. Check that mainEntity points to primary content. For product pages, Product should be mainEntity, not WebPage. For articles, Article or BlogPosting should be mainEntity and author/publisher properly referenced. Use about and mentions for topical entities, but only if they’re real. Don’t invent sameAs links.
Property precision. Dates in ISO 8601 with timezone. Prices as numbers with priceCurrency. Availability from controlled ItemAvailability values. Image URLs crawlable, not CSS backgrounds or data URIs. Author should be Person with sameAs to credible profiles, not a generic string when entity disambiguation matters. Publisher should be Organization with logo. For reviews, ensure reviewRating and author are nested or referenced correctly. If multiple reviews, use one AggregateRating and individual Review nodes only where visible. Marking up hidden reviews is risky. Same for FAQPage: questions and answers must be visible, not lorem ipsum or collapsed content that never renders.
Graph-level consistency. Run a crawl and aggregate all identifiers. Look for duplicates, conflicting types, missing references, orphan nodes. If a node is referenced but never defined, that’s a broken link in the graph. If defined multiple times with different names, that’s ambiguity. Check language and locale. If site uses hreflang, schema inLanguage, availableLanguage, and URL references should align. Mismatched locale can send entity into wrong market.
Monitoring. Rich Results reports only eligible features. Schema Markup Validator catches syntax and vocab. But quality needs regression tests. Store JSON-LD snapshots per template. Diff after deployments. Alert when identifiers, types, required properties, or entity references change. Check that referenced assets remain accessible. Use Search Console enhancements, but treat them as lagging indicators. If rich results drop, you’re already behind.
KPIs. Coverage: pages with valid primary entity. Accuracy: properties match visible content. Consistency: same entity uses same identifier across site. Completeness: required and recommended properties present. Freshness: dateModified and price or availability update. Uniqueness: no duplicate entities. Authority: sameAs and citations resolve to authoritative sources. Track these per template, not just sitewide. A single broken product template can poison thousands of URLs.
Fixing quality. Centralize schema generation in one layer. Use a graph builder that accepts page data and emits deterministic JSON-LD. Validate at build time. Test rendered output in CI. For dynamic pages, cache schema with content and invalidate together. Don’t let tag managers inject schema without version control. Tag manager schema is hard to audit and often duplicates server-side nodes.
Structured data quality is an entity reconciliation problem. Syntax gets you eligibility; graph integrity gets you clarity. If search engines can resolve your entities, link them, and trust their properties, you earn better rich results and knowledge graph alignment. Audit the graph, not just the snippet.


