Payments are experiencing issues due to temporary restrictions in Russia. If your payment does not go through, please submit a support request.Our support team is available 24/7 — we are always here to help with hosting and server issues.We are now accepting requests for dedicated server rental and colocation services in our data center.Reminder: we recommend enabling backups for additional data protection.A new VPS/VDS lineup with NVMe storage and improved performance is now available.Maintenance work on some servers has been completed. All services are operating normally.
Article6 min readViews4

Price and Availability in Microdata Disagree with the Page: What to Check on a Product

The product card shows one price, JSON-LD another, and the feed remembers a third. We analyze where to find the source of the discrepancy and how to verify product variants without relying on enhanced snippet promises.

Comments 0

A sneaker product card with price and availability consistent across multiple product representations.
In this article

The product card says "in stock," the microdata source code still shows a pre-order status, and the product feed retains yesterday's price. For the buyer, this is one product. For the store, it is several representations updated by different processes at different times. Here is the interesting part: fixing one field is insufficient if the others diverge again after the next data exchange.

I would start not by re-running the validator, but by asking: what value is currently considered final for the selected product variant, and who is responsible for transmitting it to all channels. Valid markup can be semantically outdated. Conversely, a match today does not prove the chain will withstand a price or inventory change tomorrow.

First, separate syntax from meaning

The Rich Results Test tool answers an important but narrow question: does Google recognize supported types and properties? It does not know internal store agreements, does not select the price owner, and does not confirm that the visible value has passed through all caches.

For a product, price and offer availability are at minimum essential. Microdata must describe the content of this page and the specific variant the user actually opened. Adding Product or Offer only makes the page suitable for the corresponding search format; displaying a rich result is not guaranteed.

  • Syntax check: properties are recognized, required fields are filled, and values have an acceptable format.
  • Semantic check: the markup describes the visible product and the selected variant, and the price and availability match.
  • Operational check: after the source is updated, all representations receive the new value within the expected timeframe.

A single product usually has more than one representation

A simple store already has a visible card, server-side or client-side JSON-LD, and a product feed. Add the selected size or color, page cache, and search engine robot cache, and you get a small distributed system, even though only one buy button appears on the screen.

Four product representations receive price and availability from a consistent source.
The card, selected variant, JSON-LD, and feed must receive consistent values. The specific source and delays depend on the store architecture.

It is useful to map the two fields separately. The price may come from 1C or ERP, then be calculated taking into account the price type and promotion. Stock may start from the physical balance, decrease by reserves, and only then become available for sale. If both fields are collected by the card template while JSON-LD is generated by another module, the discrepancy arises not from "bad microdata" but from two calculation logics.

Check the selected variant, not the average product

For a variable product, the phrase "product price" is too vague. A red jacket in size M may cost differently than a blue one in size XL, and some variants may already be out of stock. If the URL or page state preselects a specific variant, its image, price, and availability must correspond exactly to it and allow adding it to the cart.

A typical error occurs when the visible part of the page switches without reloading, while JSON-LD remains from the default variant. The buyer sees a new price, while the robot sees the old offer. Another version of the same error: the markup reports a range or minimum price, but the page opens on an unavailable variant with a different total.

Do not automatically merge variants into a single record just because they share a name. First, fix a persistent product variant identifier, the selection method for the variant, and the address where this variant is available. The name and list position are unreliable for such a link.

Where discrepancies arise after a correct update

  • The page and JSON-LD read different price types or different warehouses.
  • The visible card updates in the browser, while the markup remains in the original HTML.
  • The feed is exported on a schedule and naturally lags behind the real-time stock.
  • Page cache is cleared by product, but not by the linked product variant.
  • The promotion has ended, yet the old value remains in one of the computed fields.
  • An unavailable variant remains the default option for the robot.

Latency alone is not always a defect. If the feed is generated once every few hours, a difference within that window is expected. A defect begins where the window is undefined, an update may be silently skipped, or a shopper can no longer complete a purchase under the stated conditions.

Checking a small sample is more useful than a single perfect product

A popular product often follows the most direct scenario, hiding edge cases. For acceptance testing, I would use a small but diverse sample: a standard product, a discounted product, one of its variants, the last available quantity, and a fully sold-out item. This is not a statistical assessment of the entire catalog, but a quick way to check different logic branches.

A check matrix for the visible product card, microdata, and feed for several product variants.
A test matrix helps identify divergence branches. The set of scenarios and the allowable update window are defined for a specific store.

For each scenario, record the time, URL, selected variant, visible price, and availability, along with values in JSON-LD and the last value in the feed. If an allowable delay exists, indicate its boundary next to it. This way, a result of 'mismatch' becomes a localized issue: an incorrect source, the wrong variant, a missed event, or a channel waiting for an update.

What to consider the source of truth

The source of truth does not have to be a single database, but a specific rule. For example, the base price comes from the accounting system, the promotion is calculated on the website, and availability equals the stock minus active reservations. The main requirement is that this rule remains consistent for the visible card, microdata, and feed, or that any differences are explicitly limited.

Dangerous phrasing: 'taking the current value.' Current where and at what moment? Fixing this requires four answers: who owns the field, which event triggers the update, how long a discrepancy can last, and what happens after an error. Without these, another cache clear looks convincing only until the next price change.

After fixing, verify the chain, not just the code

First, change the value in its true source on a test product or in a safe scenario. Then observe when the card, selected variant, JSON-LD, and feed update. After that, recheck using the Rich Results tool and ensure the old result has not returned from the cache.

Search results do not update on the store's command, so the absence of an immediate snippet change does not prove an error. A reliable criterion is that the page and all robot-facing representations are already aligned, the variant can be purchased under the displayed conditions, and the update process leaves a verifiable trace.

If price and availability diverge, the task is not limited to replacing two lines of JSON-LD. You must remove conflicting rules and measure the value path from the source to each representation. Then, structured data stops being a separate SEO layer fixed after a complaint and becomes a regular consumer of the same data the buyer sees.

Discussion 0

Share your experience and ask questions. Comments without links appear after editorial review.

No comments yet. Start the discussion.