The Search Brief · News analysis
Structured Data Testing: Trace Facts From Database to Search
A fact-ownership and representation contract with invariant tests, a source-to-output graph and a stale-client-identity example.
Development covered: Primary-source guidance checked November 2, 2026

Structured data testing should verify that the markup describes the same resource and facts that visitors receive. Valid JSON is only the first layer. A page can pass syntax checks while its JSON-LD contains a previous product's identifier, an expired price, an invented review, or a publication date that the visible article does not support.
The useful approach is to trace each consequential fact from its source through transformation, caching, page rendering, and structured data generation. This article proposes a consistency contract for technical teams. Its examples are hypothetical and do not claim measured rich-result improvements.
Separate vocabulary, feature support, and displayed outcomes
The structured-data guide establishes the vocabulary and implementation context for these consistency checks.
Schema.org provides a vocabulary. A search provider decides which features it supports and under what requirements. Correct use of a vocabulary term does not automatically establish eligibility for a particular search display.
Google's general structured data guidelines require accurate, relevant markup and explain that valid implementation does not guarantee a rich result. Keep syntax, policy, eligibility, processing, and actual display as separate states.
Check current feature documentation before implementation. Support changes over time, so a historical tutorial or plugin's list of schema types can be obsolete. A feature being deprecated does not necessarily make the vocabulary invalid for every other consumer.
Define the intended purpose for each markup block. Article identity, breadcrumbs, product offers, and organizational facts have different owners and evidence requirements. Adding more nodes without clear purpose can multiply contradictions rather than improve clarity.
Build a fact ownership table
For every consequential field, record its authoritative source, transformation rule, visible counterpart, freshness expectation, and owner. Use stable identifiers so the same resource can be traced across systems.
A product's price may come from a commerce service, its dimensions from a product-information system, and its description from the CMS. Those sources can publish on different schedules.
An article's title, author identity, publication time, modification time, and image also need explicit ownership. Do not infer a human author from the account that imported a file or invent review credentials because a template expects a name.
The table should identify missing evidence. If an organization cannot verify an award, rating, or credential, the correct outcome is to omit the unsupported claim rather than make the structured data look complete.
Represent the page that actually exists
Compare the main entity in markup with the visible page identity. A product detail page should not describe a category merely because the SEO component reads a parent record. An article page should not inherit the previous route's headline after client navigation.
Use stable resource identifiers for joins and checks. Titles can change and may be shared. Manufacturer or internal product identifiers can help distinguish otherwise similar items, provided their public use is accurate and appropriate.
Check image references as well. A valid image URL can point to the wrong product or an unrelated article cover. Dimensions and status are mechanical checks; subject relevance requires visual review.
Avoid adding hidden claims solely to markup. Important facts that matter to the visitor should have a clear visible representation. Google's feature-specific policies and general guidelines should govern the chosen type and properties.

Trace transformations, not just source values
A correct database value can become wrong during formatting. Currency conversion, decimal handling, timezone conversion, unit conversion, and localization all deserve tests.
For a fictional offer, a source price stored in minor units must be converted according to the actual currency and field contract. Blindly dividing every value by one hundred can be wrong when the source already uses decimal units or the currency follows different conventions.
Keep raw value, normalized value, and rendered value distinguishable in diagnostics. If the visible page displays a localized price while JSON-LD serializes another amount, the team needs to identify which transformation diverged.
Test boundary values: zero where meaningful, missing values, large values, expired ranges, unusual characters, and non-default locales. A formatter that works for the ordinary US example may fail for another market without producing invalid JSON.
Treat freshness as a field-level contract
A whole-page cache lifetime is often too coarse. An article body may remain valid while its offer widget changes. A product description can be stable while price or availability changes frequently.
Define acceptable age by fact and user consequence. Then measure source update, event delivery, page regeneration, cache invalidation, and public availability. A connected source does not establish current output.
The structured data and visible content should be generated from a coherent version or a documented consistency model. If they read separate caches, one can update before the other.
A useful diagnostic snapshot records source version, visible version, markup version, and observation time. That makes stale output distinguishable from a transformation bug or a source-data error.
Validate markup through layered checks
Use the schema-markup checklist alongside field-level source and visible-content comparisons.
First parse the output. Confirm valid syntax, expected types, identifiers, and required fields for the intended feature. Next run the provider's supported validation tool against the actual page or code.
Then compare consequential fields with the visible document and source contract. A validator can recognize a property without knowing that the price belongs to another product.
Inspect duplicate markup. A theme, SEO plugin, commerce plugin, and custom component may each emit overlapping entities. They can disagree while individually appearing valid. Assign one owner per entity or establish deliberate shared identifiers and compatible facts.
Finally, inspect public rendered output. Stored CMS data and local template tests do not prove what the edge delivers. Include headers, cached responses, and client hydration where those layers can alter the document.
Product offers need a consistency boundary
For commerce pages, compare the product identifier, selected variant, currency, price, availability, sale period, and relevant offer conditions. The correct set depends on the actual feature and offer.
Google's product structured data introduction and merchant listing documentation describe supported implementations. Use current requirements rather than copying a generic product block.
Variant selection is a common boundary. A visitor may select a different size or configuration while the URL and markup retain the default variant. Decide which resource the page represents and ensure the selected state is communicated coherently.
Test sale transitions and out-of-stock changes. A price that was valid yesterday can become misleading today even when no editor changed the product description. Event propagation and cache invalidation are therefore part of structured data testing.
Reviews require evidence, not convenient numbers
A rating field must come from genuine eligible review evidence under the relevant provider policy. Do not populate aggregate values from testimonials, internal scores, or invented defaults just to satisfy a template.
Google's review snippet documentation includes feature requirements and policies. Review eligibility differs by entity and context; a generic review widget is not proof that its output qualifies.
Keep review counts and aggregates tied to the same included population. If moderation removes a review, the visible count and markup should update consistently. Rounding should not conceal a different denominator.
Test missing evidence. A component should omit an unsupported rating rather than serialize zero, a placeholder, or a sitewide average as if it belonged to the current resource. That is a factual integrity requirement, not merely a validation preference.
Article dates and authors need provenance
Record actual publication and meaningful modification events. A nightly build should not automatically become the article's modification date, and an import timestamp should not rewrite the original publication history without justification.
Author fields should represent the real responsible person or organization according to the site's editorial facts. Do not invent a profile, biography, or reviewer to make markup appear more authoritative.
Google's article structured data documentation provides current implementation guidance. Match those fields to visible article identity and authentic publication records.
Check timezone serialization and scheduled publishing. A future scheduled time should not appear as an already completed event if publication failed. Preserve actual completion evidence separately from the scheduler's intention.
A worked scenario: valid JSON-LD with the wrong offer
Imagine a fictional store where a product page displays the correct item and price after client navigation. Its JSON-LD still describes the item visited immediately before it. The rich-result validator accepts the syntax.
Tracing reveals that the visual component subscribes to the new product identifier, while the markup component reads a shared cache entry initialized on the first route. Both components work on a clean page load, so the ordinary smoke test misses the transition defect.
The proposed repair keys markup generation to stable route identity and uses the same published offer snapshot as the visible component. The team tests direct entry, in-app navigation, back navigation, variant changes, and delayed offer responses.
Verification compares identifiers and consequential values in every state. It does not stop at a green syntax result. The scenario is illustrative; a real store should reproduce its own divergence before adopting this explanation.

Test failure and recovery states
Inject a missing price, unavailable source, delayed review aggregate, retired author profile, and stale image reference where relevant. The page should not replace missing evidence with fabricated facts.
Choose truthful fallbacks. A stable product description may remain available while a live purchase offer is unavailable. The markup should reflect the actual page state rather than claiming an offer the user cannot obtain.
Check whether errors become cached. An incomplete markup block can survive after the source recovers if invalidation only responds to editorial saves. Test recovery without requiring an unrelated manual update.
Handle retries idempotently. Reprocessing the same source version should not create duplicate entities or continually advance dates. A content event identifier can help coordinate visible and machine-readable representations.
Reconcile feeds, pages, and markup where applicable
Some commerce and media workflows publish the same facts through several channels. Compare the relevant page, structured data, and feed records using stable identifiers and observation times.
Do not assume one channel is always authoritative for every field. A feed may contain distribution-specific attributes, while the public page contains the actual local offer. Document the relationship and required agreement.
When disagreement occurs, classify it. Source mismatch, transformation error, delayed propagation, cache staleness, and intentional channel difference require different responses.
Avoid “fixing” a visible fact merely to match an incorrect feed. Trace the authoritative source and preserve evidence of the discrepancy. The purpose is truthful consistency, not superficial equality between outputs.
Build a deployment gate that detects meaning errors
Create fixtures with known resource identities and values. Test direct routes, transitions, locale variants, selected variants, missing data, and the relevant source failures.
Run deterministic comparisons over consequential fields. A product identifier mismatch should fail even when the markup parses. An unsupported optional field should be omitted cleanly rather than block the whole page.
Maintain a current feature-support register with documentation links and review dates. When a provider changes support, update affected checks and reporting rather than deleting every related vocabulary term indiscriminately.
Keep independent review for claims and visuals that cannot be established by code. A comparison script can validate image URLs and dimensions, but a person or qualified visual reviewer must assess whether the image represents the actual resource.
Observe processing without promising display
Review whether schema helps AI search before turning a valid markup result into a broader visibility claim.
After deployment, verify actual public output and use the supported testing and reporting tools. Record the page version and observation date.
A valid test result establishes a layer of eligibility, not a guaranteed search appearance. A report can lag behind the live page, and a search display can vary by query and context.
Measure feature appearance separately from ranking, clicks, and conversions. If several changes launched together, do not attribute any improvement solely to structured data without a suitable design.
If the intended display does not appear, investigate eligibility, policy, access, identity, and processing before adding more properties. More markup cannot compensate for unsupported claims or contradictory content.
Write invariants that compare meaning
An invariant is a condition that must remain true across supported states. For a product page, one invariant can require the visible product identifier and the structured-data identifier to refer to the same resource. Another can require the displayed currency and serialized offer currency to agree.
Do not compare formatted strings when the formats intentionally differ. A visible amount may include grouping separators and a currency symbol, while the serialized value uses a normalized representation. Parse both according to their contracts and compare the underlying amount and currency.
For an article, compare publication events as instants with explicit timezone handling. Two different strings can describe the same instant; two identical local-time strings can describe different instants if their timezone context differs. Preserve the source event rather than repeatedly parsing a human-facing date.
Define absence rules too. If no eligible review population exists, the expected state is omission of the aggregate rather than a fabricated default. If an offer cannot be substantiated, the check should establish the page's truthful unavailable state.
Use fixtures that would fool a syntax validator: two products with similar names but different identifiers, a sale ending at a timezone boundary, and navigation that preserves a stale markup object. These tests establish behavior beyond the serialization code itself.
Keep the invariant set small and consequential. Testing every optional field with equal severity can bury a wrong-price failure among cosmetic warnings. Prioritize identity, offer facts, authentic attribution, and the claims that materially influence the visitor's decision.
A fact-comparison contract
Compare underlying meaning rather than only formatted strings. The following describes hypothetical fixtures for testing the pipeline.
| Fact | Source contract | Visible and markup invariant |
|---|---|---|
| Product identity | Stable identifier for the requested object | Page, selected media and structured entity refer to that same object |
| Offer amount | Normalized amount plus currency | Local formatting may differ while underlying amount and currency agree |
| Review aggregate | Eligible included review population | Count and rating use the same substantiated population |
| Publication time | Actual completed publication event | Display and serialized time represent the same event |
| Creator relationship | Authentic responsible person or organization | Visible attribution and structured identity agree |
Absence is also a valid fixture state. If the source cannot substantiate a fact, the renderer must not invent a plausible value merely to complete the object.
Practical answers
Is the Rich Results Test enough?
No. It is useful for supported syntax and feature checks, but it cannot establish every fact's truth or prove that markup and visible content refer to the same resource. Add source and representation comparisons.
Should every available schema type be added?
No. Use types that accurately describe real visible entities and serve a clear purpose. Check current feature support and maintainability. Unnecessary overlapping blocks can create contradictions.
What proves structured data testing is complete?
The deployed output parses, meets current applicable requirements, matches authentic visible facts, survives relevant transitions and failures, and has documented ownership and freshness. Search processing and actual feature display remain later observations. A green validator is valuable evidence, but it is not a substitute for a trustworthy fact pipeline.