When Your Schema Is Valid But Your Data Isn't

For anyone who has run the Rich Results Test, seen zero errors, and then watched rich results disappear — or had products repeatedly disapprove in Merchant Center without an explanation that makes sense. Schema suppression tends to work like that.

Your schema can be technically valid and still fail commercially.

The Rich Results Test validates structure. Google evaluates trust. That means your Product schema can pass every validator while still losing rich results, triggering Merchant Center disapprovals, suppressing Shopping visibility, and weakening AI retrieval confidence — because the underlying product data is stale, inconsistent, or contradictory across your page HTML, your schema, and your Merchant Center feed.

This article covers the hidden data-layer failures most ecommerce teams never audit: the ones that produce no errors, raise no flags, and quietly cost you. Specifically: price and availability staleness, GTIN and identifier mismatches, AggregateRating data problems, image compliance failures, and thin schema, along with the 3-Layer Product Data Alignment Model that explains why these failures are systematic rather than random, an operational audit checklist, and five concrete failure scenarios from real ecommerce environments.

What the Rich Results Test Actually Validates

The Rich Results Test validates syntax, not truth. It checks that your JSON-LD is parseable, that required properties are present, and that values are the correct type. price is a number. priceCurrency is a string. availability is an ItemAvailability enum — accepted as a short value like InStock or a full schema.org URL. Pass those checks and you get a green tick.

That green tick does not mean Google will use the data. It means the data can be read. Those are different things.

After the crawl, Google runs its own verification layer: comparing the price in your schema against the price on the page, checking availability against what a user would actually encounter, cross-referencing your identifiers against the Merchant Center feed. Those checks happen after the green tick, and they are the ones that determine whether the data gets used.

Common causes of schema suppression and Merchant Center disapproval
  • Stale or cached price in schema not matching the live page price
  • Availability set to InStock for out-of-stock products
  • GTIN field containing an internal SKU or incorrectly formatted identifier
  • Schema GTIN and Merchant Center feed GTIN disagreeing
  • Schema image URL returning a 404, redirect chain, or undersized image
  • AggregateRating values not matching the review count visible on the page
  • Price or availability updated on the page but not yet in schema or feed
  • Missing recommended properties: shippingDetails, returnPolicy, AggregateRating, brand

5 Product Data Failures: Suppression, Disapproval, and Silent Underperformance

1. Price and Availability Staleness

Price

Three sources have to agree: page HTML, schema, and Merchant Center feed

When any of them diverge, Google acts. A feed vs. page mismatch triggers a Merchant Center disapproval. A schema vs. page mismatch triggers suppression — the rich result stops appearing. No error in Search Console, and nothing flagged in Merchant Center.

The flash sale failure pattern is the most common version at scale. The sale goes live. The page price updates dynamically. The static JSON-LD was generated at the last build. The Merchant Center feed is on a 24-hour upload cycle. During the sale launch window, the three sources fall out of alignment. Products disapprove. Rich results drop. Reapproval typically happens on the next crawl once alignment is restored, but the damage window during a high-traffic promotion is real.

JavaScript-rendered prices create a quieter version of the same problem. Googlebot reads your pre-render HTML first, then renders the JavaScript. If your schema is generated from the same cached layer as the pre-render HTML, you can have a schema-to-page mismatch even though the displayed price is correct. The fix is ensuring the live price is available in the static HTML response, not only in the JavaScript output.

Availability staleness at template level. A template that hardcodes InStock regardless of actual stock status — because nobody updated it when the product range changed — reduces Google's data confidence across every page using that template. There is no disapproval, no warning, and no per-URL flag in Search Console. You find it in a crawl, or you don't find it.

2. GTIN and Identifier Mismatches

Identifier

A value that passes format validation but belongs to a different product, or to no product at all

The most common version: an internal SKU in the GTIN field, 12 numeric characters, passing the format check, doing nothing useful for product matching.

Where your internal SKU does belong: in the sku property of your Product schema, and in the id [id] attribute of your Merchant Center feed. That is exactly what those fields are for. The failure is SKU ending up in the gtin field in either place, which is where Google looks for a globally unique product identifier, not an internal reference.

GTIN is how Google matches your product to a known entity in its knowledge graph. Get it right and your listing gets price comparison features, Shopping knowledge panels, and stronger AI Overview eligibility. Get it wrong and the product appears without being matched — no price comparison, no knowledge panel, weaker signals across the board.

The schema vs. feed drift problem is subtler. GTINs live in two places: your JSON-LD and your Merchant Center feed, maintained by different teams on different update cycles. A GTIN corrected in the feed after a supplier update doesn't automatically update the page template. A product relaunch that changes the identifier gets the feed updated; the schema is generated from a CDN-cached data layer that nobody flushed. Neither produces an error. Google just sees two sources disagreeing and applies a lower confidence score to both.

The practical check: pull 20 high-traffic PDPs and compare the gtin in the schema against the gtin [gtin] in the Merchant Center feed for the same product. They should be identical. For full identifier field definitions and format requirements: Product Identifiers for Ecommerce SEO.

3. AggregateRating Data Problems

Ratings

AggregateRating is probably the most misrepresented property in product schema

Not maliciously. From stale pipelines, third-party integrations that bleed into the wrong context, and cached counts that stopped updating at some point and nobody noticed.

Three patterns cause suppression:

ReviewCount that doesn't match the page. Schema says 1,247. The page shows 23. The 1,247 comes from a legacy feed that aggregated reviews across all channels — marketplace, email, direct — before the methodology changed. Google crawls the page, sees 23, compares it to 1,247 in the schema, and stops trusting the schema. The annotation disappears.

Store ratings in a product context. A Trustpilot merchant score presented as a product-level AggregateRating in your Product schema. A store rating reflects what customers thought of buying from you. A product rating reflects what customers thought of a specific item. Google knows the difference. For the full distinction: Google Store Ratings vs Product Ratings: How Each Works.

RatingValue that doesn't match the page. Schema says 4.8. The page says 4.2. One was cached. The other wasn't. Google takes the conservative position and suppresses the annotation rather than surfacing data it can't verify independently. The rule: schema values must match what a user can visibly see on the page at the time of crawl.

4. Image Compliance Failures

Image

The schema image property is what Google uses for Product rich results, Discover, and AI retrieval

Not the first image on the page. Not the hero image in your HTML. The URL in the image property of your Product schema. Google Shopping listings use image_link from the Merchant Center feed — but schema image matters for organic rich results, Discover, and increasingly for AI retrieval confidence. When that URL is wrong, too small, or broken, you lose visibility across all three. Quietly.

  • 404s from CDN migrations. The product image moved to a new path. The HTML was updated. The schema wasn't. Google can't fetch the image, no thumbnail appears, and nothing flags it in Search Console.
  • Dimensions below Google's minimums. The validator doesn't enforce dimensions. For schema image, Google's stated minimum for rich results is 160×90px, but the practical minimum for Discover and AI retrieval is higher. For Merchant Center's image_link: 100×100px (non-apparel), 250×250px (apparel). Both Google and Merchant Center recommend 800×800px. An undersized image passes validation and still causes features to be withheld.
  • Wrong image on variant pages. Where all variants share a single URL, the image property sometimes points to a generic shot rather than the variant being described. Google may show the wrong product in Shopping, or none at all.
  • Redirect chains. The image URL resolves — eventually — through multiple redirects. Google follows them, but long chains create uncertainty and images can be skipped during high-volume crawls.

5. Thin Schema: Missing Recommended Properties

Completeness

Schema that passes validation but omits properties Google uses to serve features

Required properties get you into the system. Recommended properties determine how well you perform once you're in it. Missing them isn't an error — it's an invisible opportunity cost.

The properties most commonly absent, and most commercially relevant:

  • shippingDetails and returnPolicy. These generate the shipping and returns annotations in organic results — "Free delivery over £20 · 30-day returns" appearing beneath your meta description before a click. Optional by spec. In practice, the lowest-effort rich result improvement on most ecommerce sites, because few competitors have implemented it correctly.
  • AggregateRating when reviews exist on the page. If your product page displays star ratings and review counts, and your schema doesn't include AggregateRating, you're leaving the most visible organic annotation off the table. The validator has no opinion on this. It will pass your schema with no rating data even if the page is full of reviews.
  • description. Not required for rich results. Used by Google as a content signal for AI Overviews, Discover, and Shopping knowledge panels. On large catalogues it's frequently absent or populated with a truncated string from a legacy feed that predates the current product range.
  • priceValidUntil. Required for Merchant Listing schema when a price has an expiry. Without it on a promotional price, Google has no signal the price is time-limited.
  • brand on products without a GTIN. Without a GTIN, brand combined with mpn is the fallback matching mechanism. Missing brand on a private-label or own-brand product means Google has no manufacturer context and no GTIN; matching confidence drops significantly. For the full identifier hierarchy: Product Identifiers for Ecommerce SEO.
  • Variant properties for selectable variants. color, size, material, and pattern properties on individual variant nodes are what enable colour swatches and size selectors in Google Shopping product panels. Omitting them produces valid schema that just never generates variant-level Shopping features.
How to find thin schema at scale: crawl a sample of your PDPs and extract the full list of properties present in each Product schema block. Build a count of which recommended properties are present vs. absent across the sample. Missing shippingDetails on 80% of pages is a template fix, not a page-by-page fix. The pattern is what matters.

The 3-Layer Product Data Alignment Model

Most product data failures don't happen in one place. They happen because the same data is being maintained in three separate systems, by separate teams, on separate update cycles. When any two layers disagree, you get disapprovals, suppression, or a lower-confidence match that nobody tracks.

The 3-Layer Product Data Alignment Model A triangle diagram showing three data layers — Rendered Page State, Structured Data, and Merchant Center Feed — and the specific failure mode that occurs along each edge when those two layers fall out of alignment. The 3-Layer Alignment Model Google compares the same value across all three layers at crawl time Layer 1 Rendered Page State What a user sees after render Owner: engineering / frontend Layer 2 Structured Data JSON-LD Google parses Owner: SEO / platform Layer 3 Merchant Center Feed Shopping ingestion data Owner: ecommerce / merch Rich result suppression page ≠ schema Merchant Center disapproval page ≠ feed Lower entity match confidence schema ≠ feed
The same product data lives in three places, maintained by different teams on different update cycles. A mismatch on any edge produces a different failure mode — and none of them show up as a validator error. The fix is operational: align the layers, not the markup.
Layer
Purpose & owner
How it fails
Layer 1
Rendered Page State
The product data visible to users once the page is rendered — whether server-rendered HTML, JavaScript-rendered content, or a hybrid of both. This is what Google compares against schema and feed data during verification.
Caching, JavaScript rendering delays, hydration timing, SSR/CSR hybrid architectures, frontend experiments where Googlebot and users receive different content (note: deliberately serving different prices to Googlebot is cloaking — a policy violation, not just a failure mode).
Layer 2
Structured Data
Machine-readable interpretation. Owned by SEO / platform team. What Google parses for rich results and AI retrieval.
Static templates, build-time generation from stale data, manual updates that don't propagate to all page types.
Layer 3
Merchant Center Feed
Shopping ingestion layer. Owned by ecommerce / merchandising team. What Google uses to serve Shopping listings and ads.
Upload frequency misaligned with pricing events, feed transform errors, missing or incorrectly mapped attributes.

The failure mode this creates is systematic, not random. Fixing one layer without checking the other two is the reason the same disapproval keeps reappearing. A Merchant Center price mismatch gets resolved by updating the feed. Three days later it reappears — because a promotion updated the page price without triggering a feed refresh. The fix needs to happen at the process level, not the data level.

This is also why schema audits that only check syntax miss the actual problem. The three layers need to be checked against each other, not just internally. The audit checklist below is structured to do exactly that.

Why This Is Now an AI Trust Problem, Not Just an SEO Problem

Rich results are one consequence of bad product data. They are no longer the biggest one.

AI shopping agents — the systems used in Google's AI Overviews, ChatGPT shopping, Perplexity product recommendations, and the agentic commerce layer being built into most major search interfaces — retrieve product data from structured markup to inform purchase decisions. Based on how these systems behave, they appear to favour product data that is internally consistent across page, schema, and feed. Inconsistency is a low-confidence signal for the same reason it is for Google: it means one of your sources is wrong, and there is no way to know which one.

A product with valid but inaccurate schema isn't just at risk of losing rich results. It's at risk of being skipped by systems that have no obligation to surface data they can't verify. That's a different kind of visibility problem than anything in your Search Console report.

The validator pass is the floor. What's above it — data consistency, feed alignment, identifier accuracy — is increasingly what determines whether your products surface in AI-assisted shopping at all. For the broader context: Agentic Commerce Optimization: What to Fix in Your Schema, Feeds, and Product Data.

Symptoms You'll Actually See

These failures don't announce themselves as schema errors. They show up as operational signals in other systems, usually without an obvious cause.

What you observe Likely cause Where to check
Rich results were showing and then stoppedSchema vs. page mismatch (price, availability, or rating)Search Console Rich Results report → compare schema to live page
Products intermittently disapprove in Merchant CenterPrice or availability out of sync between feed and pageMerchant Center Diagnostics → check price at time of disapproval
Shopping CTR or impression share dropped after a sale endedFeed still showing sale price after promotion ended on pageCompare feed sale_price_effective_date to page
Variant swatches or size selectors missing in Shopping panelsMissing color, size, or hasVariant properties on variant schemaCrawl schema on variant pages; check for ProductGroup structure
Star rating annotations disappeared from organic resultsAggregateRating mismatch or third-party score in wrong schema contextCompare schema reviewCount + ratingValue to visible page values
Products approved in Merchant Center but Shopping traffic lower than expectedGTIN mismatch between schema and feed; product not matching to entityPull 20 PDPs, compare gtin in schema vs. feed line by line
Shipping/returns annotations absent despite implementationMissing shippingDetails or returnPolicy; or Merchant Center feed not alignedRich Results Test on a PDP; check schema for OfferShippingDetails

The Audit Checklist

Start with 20 high-traffic PDPs, not 200. The goal is to identify systematic failures in your template or pipeline. Individual bad URLs are noise. Patterns are signal.

  1. Price spot-check (all three layers) For each URL: compare the price in the JSON-LD, the price in the page HTML, and the price [price] in the Merchant Center feed. All three should be identical. Repeat for sale prices: check priceValidUntil in schema and sale_price_effective_date in the feed, and confirm the promotion is actually live on the page. Any mismatch is a disapproval or suppression candidate.
  2. Availability check Compare schema:availability to actual stock status for each URL. Flag InStock on out-of-stock products and OutOfStock on purchasable ones. Check which products had a stock status change in the last 30 days — these carry the highest schema lag risk.
  3. GTIN format and cross-layer comparison Extract the gtin from schema and compare against gtin [gtin] in the Merchant Center feed. They should be identical. Check format: GTINs are numeric only, 8, 12, 13, or 14 digits. Values containing letters, or starting with 02, 04, or 2 are GS1-reserved for internal/restricted use and are not usable for Google product matching even if they pass format validation. Use the GMC Feed Analyzer for bulk checks across your full feed.
  4. Image URL audit Extract the image URL from each Product schema block and check: HTTP response code (looking for 404s and redirect chains), dimensions (800×800px recommended; anything below 160×90px will be rejected for rich results), and whether the image matches the primary product described on the page. Screaming Frog can extract schema image URLs and check response codes in a single crawl.
  5. Rating consistency check For any URL with AggregateRating: compare ratingValue and reviewCount in schema against the values visibly displayed on the page. Identify the data source for each: live review system, daily snapshot, or static template. Flag anything where the two can fall out of sync.
  6. Cross-layer failure pattern analysis After steps 1–5: categorise failures by layer. Schema-only failures indicate static templates or stale build-time data. Feed-only failures indicate upload frequency or transform issues. Failures in both layers simultaneously usually mean the wrong data is being fed into multiple systems from a single upstream source. That's the one worth escalating.

Common Failure Scenarios

The five failures above aren't theoretical. These are the patterns that appear most frequently in real ecommerce audits.

Flash sale launch with a daily feed cycle
Sale goes live at midnight. Page price updates immediately. Static JSON-LD was generated at the last platform build, a week prior. Merchant Center feed refreshes at 06:00. Between midnight and 06:00, the page, schema, and feed carry three different prices. Products disapprove. Rich results drop. Reapproval happens on the next crawl after the feed refreshes — but the peak traffic window for the sale has passed. Fix: trigger feed refresh and schema regeneration as part of the sale launch process, not on a fixed schedule.
Headless commerce cache drift after a restock
Product goes out of stock. Schema is updated to OutOfStock. Product is restocked two days later. Page HTML updates immediately. Schema is generated from a CDN-cached data layer with a 12-hour TTL. Schema continues to say OutOfStock for 12 hours after the restock. No disapproval — the mismatch direction is availability correct on page, wrong in schema. The availability annotation in organic results disappears or is suppressed for those 12 hours. No flag anywhere. Fix: stock status changes should trigger a schema cache invalidation, not wait for the TTL.
CDN migration without schema update
Platform migrates product images to a new CDN with a different URL structure. HTML image tags are updated in the migration. JSON-LD schema is generated from a product data template that hardcodes the old CDN domain. Schema image URLs return 404s. Product rich result images disappear. Shopping thumbnail annotations drop. Nothing in Search Console flags image 404s as a structured data issue — it appears in a crawl, not in the Rich Results report. Takes weeks to identify without proactive monitoring. Fix: include schema image URLs in post-migration crawl checks.
Review provider switch with cached AggregateRating
Site migrates to a new review provider. New provider loads reviews via JavaScript. Schema AggregateRating is still generated from the old provider's API, which stopped syncing at the point of migration. Schema says 1,104 reviews, 4.7 rating. Page now displays 38 reviews from the new provider, 4.4 rating. Google crawls the page, sees 38 and 4.4, compares to the 1,104 and 4.7 in schema, and suppresses the rating annotation. No error in Merchant Center, no warning in Search Console. Fix: review provider migrations require a schema data source audit, not just a front-end integration check.
Feed GTIN update not reflected in schema after a product relaunch
Product relaunches under a revised variant structure with new GTINs. Merchant Center feed is updated. Schema is generated from a product information management (PIM) system on a weekly sync cycle. For five days, schema carries old GTINs; feed carries new ones. Google sees conflicting identifier signals during the relaunch window — exactly when Shopping impression share for the product matters most. Neither the old nor new GTIN is flagged as wrong. Both are just trusted less. Fix: product relaunches should trigger an immediate PIM-to-schema sync, not wait for the weekly cycle.
The pattern across all five scenarios is the same. The failure isn't visible in any single system. Merchant Center looks clean. Search Console raises nothing. The validator passes. The problem only exists at the intersection of all three layers — which is exactly where Google, Shopping, and AI retrieval systems operate.

Conclusion

The validator checks whether the markup is technically valid. What actually determines whether products surface consistently across organic search, Shopping, and AI-driven experiences is whether the underlying data stays accurate, current, and aligned across the page, schema, and Merchant Center feed.

Getting the implementation live is step one. Keeping those three layers aligned over time is the operational discipline most ecommerce teams never fully solve. That is where the real gap is.

Sources and further reading

Written by
Mags Sikora
Freelance SEO Consultant, SEO Director

Senior SEO Strategist with 18+ years leading search programmes for enterprise and global businesses. Director of SEO at Intrepid Digital. Specialises in the parts of SEO that are hard to fake and harder to fix: technical architecture, structured data, and international implementations.