Skip to content

Schema Audit

Quick facts

Difficulty
Intermediate
Time
Half a day for an initial audit of one site; about 1 hour for a follow-up review
Prerequisites
Schema.org for AI, JSON-LD
What it verifies
Whether inherited markup is delivered, parseable, internally consistent, and accurate, based on evidence rather than a passing validator result
Method
Four dependent checks in order: coverage → validity → integrity → truth. A failed check can make later results meaningless
The counterintuitive behavior
A parser discards invalid markup, but a live-fetch model still reads the raw block as page text
What tools can miss
Two emitters can produce the same entity, or one @id can identify two entities, without triggering a validator or Search Console error
Deliverable
A coverage matrix and a finding list that records the assertion, evidence, rung, severity, and responsible layer, without a composite 0–100 score

1. What a schema audit evaluates

A schema audit examines markup you inherited from a predecessor, accumulated across three plugins, or deployed long enough ago that no one can account for it. Auditing existing markup is harder than checking a new deployment because the markup must satisfy two consumers with opposite failure modes.

ConsumerHow it reads the blockWhat invalid markup does to it
Parser (Google, both validators, Search Console)Parses application/ld+json as structured data and discards nonconforming markupThe block is silently dropped and has no effect
Live-fetch model (ChatGPT or Perplexity fetching the page)Reads the raw block as additional page textThe block is still read, allowing an incorrect claim to take effect

The second row runs counter to a common assumption. The belief that invalid markup is harmless because it gets ignored applies only to parsers. Mark Williams-Cook demonstrated the other case with a fictional company whose address appeared only in deliberately broken JSON-LD that used a fabricated @context and invented types. Both ChatGPT and Perplexity returned the address anyway. His explanation: “They were not parsing it as schema. They were doing what LLMs always do: Reading the visible-ish text of the page” (Search Engine Journal, June 2026). A controlled test a year earlier provided complementary evidence: live-fetch chatbots did not extract JSON-LD as structured data (searchVIU, 2025).

The audit therefore ranks findings by whether the markup makes assertions that do not appear on the page, rather than by the number of validator errors. A block with three vocabulary warnings but accurate content is a minor finding. A block that passes validation while stating a price the page never charged is the most serious kind of problem.

Keep the expected outcome in perspective when you define the scope. Ahrefs compared 1,885 pages that added JSON-LD with roughly 4,000 matched controls and found no meaningful change in citations on any AI platform (Ahrefs, 2026). Google’s own guidance states that structured data “isn’t required for generative AI search” (AI optimization guide). The GEO benchmark does not provide evidence to the contrary because it changed content and structure but never tested markup as a variable (Aggarwal et al., KDD ‘24 · paper summary). Williams-Cook notes an important limitation: the Ahrefs sample consisted of “already strong, well-understood entities”, where little disambiguation remained to be done. Taken together, the evidence supports using an audit to remove misleading assertions and resolve identity, not to increase citations directly.

2. Before you audit: scope, sample, and evidence

Four decisions determine how every later finding should be interpreted.

DecisionOptionsRule of thumb
ScopeWhole site / one template set / one page typeSample by template, not by URL count. One template defect can appear as hundreds of items in the report
Sample frameTwo URLs per templateChoose one typical URL and one edge case, such as a page with no author or image, a paginated page, or a discontinued product. Plugin defaults often appear only in edge cases
Baseline for judgmentA deployment standard exists / it does notWithout one, the minimum standard is whether the markup agrees with the visible page (§7)
EvidenceRendered DOM / no-JavaScript fetch / Search ConsoleEach source answers a different question. Reviewing only the rendered DOM in developer tools conceals the delivery problems in §4

Gather the inputs before you start. You need an inventory of the available templates and the data each one uses, plus a list of the CMS, theme, and plugins for the provenance check in §6. You also need an authoritative list of the organization’s official profiles and identifiers for the external comparison in §7. Search Console access is useful but optional because three of the four rungs can be completed without it.

Run the audit when the markup may no longer match the site. Common triggers include taking over a site you did not deploy; upgrading the CMS, theme, or a plugin; completing a migration or redesign; changing an entity through a rename, merger, or rebrand; receiving a structure-and-machine-readability finding in a full GEO audit; or reaching a vendor deprecation date, including the one discussed in §5. If the first crawl finds no markup, stop the audit and follow the deployment process in Schema Implementation.

3. The four-rung ladder

Each rung depends on the one below it. The cost and significance of a finding increase from coverage through truth.

RungThe questionInstrumentIf it failsWho notices
1 · CoverageDoes this template emit a block, and does a non-rendering fetch receive it?Crawl extraction + curlLater checks are not meaningfulOnly non-rendering crawlers
2 · ValidityDoes every block parse and conform to the vocabulary?Schema Markup Validator · Rich Results Test · unparsable reportThe parser discards it, but the model still reads itThe parser
3 · IntegrityDoes the graph connect correctly, with unique @ids, resolvable references, and one emitter per node?Manual graph read + duplicate detectionUnrelated entities merge, or one entity splits in twoNobody
4 · TruthDo the page and external sources agree with what the markup asserts?Side-by-side comparison + sameAs resolutionThis is the only class with a documented penaltyHumans, manual actions, live-fetch models

The Who notices column explains why order matters. Rung 3 findings are invisible to every tool in the workflow, so they can persist for years on inherited sites and must be checked manually. Rung 4 findings are the only ones that carry a documented penalty.

Start with Rung 1 and proceed in order. Running validators on page after page is wasted effort when client-side injection prevents every non-rendering AI crawler from receiving the markup. The command in §4 can establish that condition immediately.

For a single page, the free Schema Markup Checker automates all four rungs with one no-JavaScript fetch. It checks delivery, parsing and @context, the graph within the page, and the machine-checkable portion of §7, while quoting the evidence for every finding. It does not perform template-scale sampling, so use it as the per-page instrument within the sample defined in §2.

4. Rung 1: Coverage and delivery

This rung requires two forms of evidence, and neither can replace the other.

Crawl-scale extraction shows which templates emit which types of markup. Any crawler that can extract JSON-LD across an entire site will work. Screaming Frog provides public documentation for this capability, stating that it has “built our own structured data validator into the Screaming Frog SEO Spider to help make the auditing process more efficient and at scale”. Its separate options include JSON-LD, Microdata, RDFa, Schema.org Validation and Google Rich Result Feature Validation (Screaming Frog). Record one row per URL, including the detected types and errors, and group the rows by template.

A no-JavaScript fetch shows whether a non-rendering crawler receives the markup. Googlebot renders JavaScript; GPTBot, ClaudeBot, and PerplexityBot are not observed to (JavaScript SEO basics). One command per template provides the answer:

# Blocks a non-rendering crawler actually receives, per template sample
curl -sL https://example.com/your-page | grep -c 'application/ld+json'

Record the result in a coverage matrix:

TemplateSample URLsTypes foundPresent without JavaScript?Verdict
Base layout/, /aboutOrganization, WebSiteYesOK
Article / post/blog/a, /blog/bArticleYesOK
Author page/authors/leenoneNot applicableGap
Product/p/123, /p/discontinuedProductNoUnavailable to non-rendering crawlers

Keep two verdicts separate because they require different fixes. Absent means the template emits no markup. Whether that is a finding depends on your standard; without one, only a missing core entity graph qualifies as a blocker. Unavailable to non-rendering crawlers means the block appears in the rendered DOM but not in the response body. This pattern indicates tag-manager or client-side injection and explains why a team may believe schema is deployed even though no AI crawler has ever received it. See SSR vs CSR for AI crawlers for the rendering trade-off and AI crawlers for information about which engines execute JavaScript.

5. Rung 2: Validate syntax and interpret reports

The four instruments answer different questions. Pay particular attention to the third column, which states what each instrument cannot establish.

InstrumentUse in an auditDoes not prove
Schema Markup ValidatorVocabulary conformance, block by blockThat Google will render anything
Rich Results TestEligibility for one specific Google featureThat the markup is technically correct
Unparsable structured data reportThe most useful single source for inherited markup because it identifies site-wide syntax failuresThat the content is semantically correct; successful parsing does not establish accuracy
Rich result reportsSite-wide history over time, counted by itemAnything about a page published an hour ago

The unparsable report is especially useful in an audit because it isolates critical syntax errors from warnings and valid items. It lists structured data that “could not be parsed because of a serious syntax error”, and “All items in this report are critical structured data errors; there are no warnings or valid items.” It also identifies the pattern an audit needs to find: “The most common cause of a single error affecting multiple pages is an underlying template error”. For the validation states used in revalidation requests, see Fix structured data issues in Search Console.

Treat the report inventory as evidence about the property, not as a list of supported features. Google documents that a rich result report appears “only if: Google finds valid markup in your property, and The markup is a supported rich result type”. The reports visible in a given console therefore depend on that site’s markup. For the list of supported types, use the search gallery, which is much longer than the report list for any single property. Even the console documentation may lag behind changes: it still describes rich result reporting for practice problems, although a changelog entry says that reporting is scheduled for removal. A listed report does not prove that the feature remains active.

The FAQ timeline is still changing. FAQ rich results stopped appearing in Google Search on May 7, 2026, and Google removed the FAQ rich result documentation in June 2026 (Search Central changelog · Search Engine Land). Removal of FAQ support from the Search Console API is scheduled but not confirmed complete. As of August 11, 2026, Google’s API documentation still labels it an “Upcoming deprecation” and states, “We’ll be deprecating support for the FAQ search appearance in the Search Console API in August 2026”, without naming a day (Search Analytics: query). If your reporting pipeline queries that appearance type, test the call instead of relying on the calendar.

Do not assign severity from a validator result alone. A validation failure means that the parser dropped the block. It does not mean that the block was inert, because the live-fetch model described in §1 still reads it. A Rung 2 finding should record what failed. Assign severity only after §7 establishes what the block claimed.

6. Rung 3: Check graph integrity and identify each emitter

This check differs from a deployment review, where one emitter is known by design. On an inherited site, begin with the assumption that several emitters may exist and that no one knows the exact number.

Identify the source of each block first. A theme and an SEO plugin may each emit an Article, or two plugins may each create an Organization. This is the most common structural finding on an unaudited site. Field style, indentation, and @id naming conventions usually reveal the emitter, and the CMS plugin inventory from §2 can confirm it. To make a finding actionable, identify its emitter and assign the fix.

Then read the graph. None of these produce an error anywhere in the toolchain:

CheckWhat failure looks likeConsequence
@id uniquenessOne @id value is assigned to two different @typesDownstream consumers merge unrelated entities
References resolveauthor or publisher points to an @id that no node definesThe reference is unresolved, so the node never joins the graph
No duplicate nodesTwo Organization blocks, different @ids, same companyOne identity split into two under-corroborated nodes
Site-wide consistencyOrganization.name or logo differing across templatesThe entity contradicts itself within one domain
No orphansA Person node that nothing references as authorThe assertion is not connected to anything

Once you have the crawl output from §4, you can detect these patterns systematically. Extract every @id across the site, group the records by value, and flag values associated with more than one @type. Then reverse the grouping and flag entities associated with more than one @id. See JSON-LD for the reference semantics and Entity Recognition for the consequences of a graph that does not connect correctly. To prevent recurrence, Schema Implementation describes using one @graph per page with nodes connected by reference.

7. Rung 4: Verify claims against the page and external sources

Perform two separate comparisons.

Compare the markup with the page. Place the emitted block beside the rendered page and confirm that every asserted fact is visible, including the author, dates, price, rating, description, and address. No tool performs this comparison, and this is the only class of finding with a documented penalty. Google states the consequence and its limit precisely: “A structured data manual action means that a page loses eligibility for appearance as a rich result; it doesn’t affect how the page ranks in Google web search” (General Structured Data Guidelines). Live-fetch engines encounter the same mismatch more directly because they do not parse the markup as structured data. They read it as unusually punctuated prose, so a contradiction on the page gives the model two competing versions of the same fact.

Verify identity against external sources. Open every sameAs target and confirm three things: the target resolves, it identifies the same entity rather than a parent company, sibling brand, or namesake, and it remains active. Check that logo does not return a 404 and that each Wikidata item genuinely exists rather than serving as a placeholder. A sameAs property can connect entities, but it cannot create the external entity it points to. See Knowledge Graph Presence for details.

These recurring findings are organized by how you detect them:

FindingHow you catch itWhy it matters
dateModified bound to the build clockSite-wide dateModified values are identical and match the last deploymentAsserts an edit that never happened and contradicts the visible date
Plugin-default or site-name authorPerson.name equals the site name, “admin”, or the CMS defaultClaims an identity that external sources cannot corroborate
sameAs pointing at dead links or another entityResolve each target, then confirm identity by handThe open web refutes the identity claim
Price, rating or stock that disagrees with the pageParity read on a product templateA standard trigger for a manual action
Organization description differing from the About pageParity read on the base layoutGives a live-fetch model two versions of the same fact

Google’s guidance on dates is relevant to the first row because the mismatch often comes from a default rather than a deliberate error. Publication dates must describe the page, must not be in the future, and “Ensure that the date (and optional time and timezone) match between the equivalent user-visible and structured values” (Article publication dates).

If you cannot make a block agree with the page, remove the block. Do not remove an accurate fact from the page to preserve inaccurate markup.

8. Review common omissions by type

Missing information is generally less serious than incorrect information, so rank omissions instead of treating completeness as the goal. Be cautious with any checklist labeled “required fields.” Google states that both Organization and Article have recommended properties but no required ones (Organization · Article).

TypeCommon omissionCostRung
OrganizationNo @id; an empty sameAs or one limited to social profiles; a logo URL that returns a 404The entity lacks a persistent identifier, so each page may create a separate node3 / 4
PersonNo sameAs; plugin-default author; author as a bare string with no nodeThe identity cannot be independently corroborated3 / 4
Articleauthor as a string rather than a node reference; missing or build-bound dateModifiedThe authorship and recency claims are unsupported3 / 4
ProductMissing gtin / sku / brand; offers disagrees with the page priceLoss of feature eligibility and the risk created by a factual mismatch2 / 4
FAQPageQuestions no user asks; applied to pages with no Q&AFabricated structure with no Google benefit since May 20264
ImageObject / VideoObjectNo caption, description or transcript; markup on decorative imagesOnly fields containing descriptive text carry weight2
BreadcrumbListDisagrees with the visible breadcrumb, or the page has noneAsserts a hierarchy that does not exist4

The Product row contains valid findings, but they rank below the AI-related issues. A missing gtin affects rich-result eligibility, which concerns commerce and search results rather than retrieval. A mismatch between offers and the visible page, however, belongs with the blockers in §9.

9. Assign severity and decide what to fix

Use the same severity levels as the full GEO audit and crawler access audit. Base the rating on the rung and on whether the markup contradicts the page.

FindingSeverityWhy
Markup asserting facts the page contradictsBlockerThis is the only class with a documented penalty, and live-fetch models read it directly
Missing core entity graph, or site-wide unparsable markupBlockerEvery later rung becomes impossible to evaluate
Blocks that appear only after rendering and are absent from a no-JavaScript fetchBlockerInvisible to the crawlers the markup exists for
Duplicate emitters, or one @id covering two entitiesMajorEntities may merge or split without triggering an error
Dead sameAs targets, or targets that identify a different entityMajorThe web can refute the identity claim
Vocabulary warnings, missing recommended fieldsMinorThe effect is limited unless a feature you track depends on the field
Deprecated-but-accurate FAQPage or HowToNot a findingThe markup remains valid Schema.org, carries no penalty, and provides no benefit when removed

Fix markup when it contradicts the visible page, prevents evaluation of a later rung, or connects the entity graph incorrectly. A type that no longer produces a rich result does not meet any of those conditions. Removing accurate markup solely because the feature was deprecated creates a large engineering task with no benefit, which can consume much of an inherited site’s audit budget.

Do not reduce the results to a single score. A composite 0–100 grade with an unpublished formula is not an interpretable measurement. The citability audit applies the same provenance requirement to citability scores. Report severity for each finding. Then rank the findings by impact, confidence, and effort to establish priority, using the method in the full GEO audit.

10. Prepare the report and schedule follow-up audits

Every report should contain:

  • Header: Audit date, templates in scope, sampled URLs, the standard used for evaluation, and whether Search Console evidence was available.
  • Coverage matrix: The table from §4, organized by template and including the no-JavaScript column.
  • Finding list: Each finding stated as an assertion, evidence, rung, severity, and the responsible layer (template, plugin, content, or entity).
  • Prioritized plan: The findings from §9, reordered by priority.
  • Changes since the previous audit: What changed and whether it resulted from your action or a vendor change.

Run a new audit in response to a trigger, not on a fixed calendar. Triggers include template or theme changes, CMS and plugin upgrades, entity changes, rendering-mode migrations, and vendor deprecation dates. Use the calendar only for a quarterly review of the highest-value templates.

Add one inexpensive safeguard to the continuous-integration pipeline on any site with a build step. Check for collisions among the @id values from one representative URL per template, and verify that the number of blocks does not decrease between builds. This catches plugin upgrades that silently remove or duplicate the core entity graph, the §6 failure that no other tool in the workflow reports.

11. Validity threats and pitfalls

  • Auditing only the rendered DOM in developer tools. This prevents you from checking delivery in §4, which every later rung depends on.
  • Treating passing validator results as a completed audit. Rung 3 and Rung 4 problems pass every validator because validators do not perform those checks.
  • Using the Rich Results Test as a correctness check. It measures eligibility for one feature, not conformance.
  • Sampling only the primary templates. Plugin defaults often appear in edge cases, such as pages with no author or image, discontinued products, and page 7 of a listing.
  • Using your own console’s report list as the list of Google-supported types. Reports appear only when the property already contains valid markup for a supported type.
  • Reporting deprecated but accurate markup as a finding. This creates work without providing a benefit (§9).
  • Auditing markup that you recently deployed. That requires a predeployment validation check. Schema Implementation provides the four-check process.
  • Expecting a clean audit to increase citations. The evidence does not support that causal claim (§1). The value comes from removing contradictions and making the entity resolvable.
  • Auditing only once. A plugin upgrade can change the results without your involvement.

12. Further reading

Frequently asked questions

Every validator is green. Why is the audit still producing findings?
Validators answer only two of the four questions in the audit. The Schema Markup Validator checks vocabulary conformance, and the Rich Results Test checks feature eligibility. Both evaluate one block at a time, and neither compares the markup with the page. Duplicate entities, a shared @id, a dangling author reference, a build-driven dateModified, or a sameAs link to a dead profile or sibling brand can all pass validation. The most consequential findings come from the two checks that no tool performs.
Should I strip FAQPage and HowTo markup now that the rich results are gone?
Not as routine cleanup. FAQ rich results stopped appearing in Google Search on May 7, 2026, Google removed the FAQ documentation in June 2026, and HowTo rich results disappeared in 2023. However, FAQPage remains valid Schema.org, causes no penalty, and generates no Search Console errors. Removal is warranted when the markup describes questions, answers, or a procedure that the page does not contain. That is a truth finding, not a deprecation finding. Removing accurate markup solely because a rich result was retired consumes engineering time without producing a benefit.
Two plugins are both emitting an Organization block. Does that actually cause harm?
Yes. The two blocks assert that two organizations exist when you intended to describe one. If the blocks have different @id values, as they normally do because each plugin creates its own, a consuming graph has no basis for merging them. The identity claim is then split across two nodes, each with only part of the corroborating evidence. If the blocks share an @id while describing different types, unrelated entities may be merged instead. Neither problem triggers a validator or Search Console error. Detecting it requires extracting every @id on the site and grouping the results by value.
Can I run this audit without Search Console access?
Yes, for three of the four rungs. A crawl shows coverage, a no-JavaScript fetch confirms delivery, and the integrity and truth checks are performed manually on the extracted blocks. Without Search Console, you lose the unparsable structured data report. It is the only instrument here that identifies site-wide syntax failures without requiring you to guess which URLs to sample. Its value is aggregation rather than diagnosis: Google notes that an underlying template error is the most common cause of one error affecting many pages.
Will fixing every finding here increase how often AI engines cite the site?
Probably not. Ahrefs compared 1,885 pages that added JSON-LD with roughly 4,000 matched controls and found citation changes indistinguishable from noise on every platform. A later caveat was that the study examined well-established entities, where disambiguation has little work left to do. Its null result is therefore less informative for sites with genuinely ambiguous identities. The reliable benefits of an audit are removing assertions that conflict with the page and ensuring that the entity graph resolves to one entity rather than three.

Related playbooks & wiki

Sources

Primary

  1. Unparsable structured data report · Google Search Console Help
  2. Rich result report overview · Google Search Console Help
  3. Fix structured data issues in Search Console · Google Search Console Help
  4. Search Analytics: query — Search Console API (FAQ deprecation notice) · Google Search Console API
  5. Search Central changelog — FAQ rich result deprecation and documentation removal · Google Search Central · 2026-06-15
  6. Structured data markup that Google Search supports (search gallery) · Google Search Central
  7. General Structured Data Guidelines · Google Search Central · 2026-07-10
  8. Optimizing your website for generative AI features on Google Search · Google Search Central · 2026-07-10
  9. Organization (structured data) · Google Search Central · 2026-04-15
  10. Article (structured data) · Google Search Central · 2025-12-10
  11. Article publication dates · Google Search Central · 2025-12-10
  12. Understand the JavaScript SEO basics · Google Search Central · 2026-03-04
  13. Rich Results Test · Google
  14. Schema Markup Validator · Schema.org
  15. Schema.org vocabulary (Organization, Person, Article, Product, ImageObject, BreadcrumbList, sameAs) · Schema.org
  16. JSON-LD 1.1 — A JSON-based Serialization for Linked Data (W3C Recommendation) · W3C · 2020-07-16

Secondary

  1. How To Test & Validate Structured Data · Screaming Frog
  2. We Tracked 1,885 Pages Adding Schema. AI Citations Barely Moved. · Ahrefs
  3. Schema, LLMs & The Low Bar For "Evidence" In GEO · Search Engine Journal
  4. Schema, LLMs and the Low Bar for "Evidence" in GEO · Mark Williams-Cook
  5. Schema Markup and AI in 2025: What ChatGPT, Claude, Perplexity & Gemini Really See · searchVIU
  6. Google to no longer support FAQ rich results · Search Engine Land
  7. GEO: Generative Engine Optimization (Aggarwal et al., KDD '24) · arXiv / KDD '24

Tertiary[observation]

  1. ChatGPT & Perplexity Treat Structured Data As Text On A Page
First published: 2026-08-11 Last updated: 2026-08-18 Authors: Ray Yang Topic: Practice