TL;DR
Adobe's AI Content Visibility Checker found the average U.S. retail product page is only 66% machine-readable, the weakest link compared to homepages (75%) and category pages (74%). A stale priceValidUntil property — even when the live page shows the correct price — can cause Google to flag the price as unconfirmed and stop displaying the listing. Google requires price >0 for merchant listings, and missing priceCurrency or availability can make agents reject or misinterpret the product entirely.
The article's verdict: use JSON-LD over fragile microdata, keep every recommended field (gtin, return policy, shipping details) accurate and current, because each directly determines whether an AI shopping agent surfaces, matches, or ranks your product — and without that precision, agents will guess, drop, or confidently repeat wrong numbers.
Product schema is the JSON-LD markup — built from schema.org's Product and Offer types — that tells a crawler or an AI agent, in a fixed vocabulary, what a product is called, what it costs, whether it's in stock, and what condition it's in. It exists because none of that is reliably inferable from a rendered page: "$129" could be the price, a crossed-out former price, or a shipping fee, and a page that still loads after a product sells out gives no plain-text signal that it's gone. Structured data replaces inference with a declared field.
That distinction matters more now than it did two years ago. A traditional search crawler could tolerate some ambiguity because a human was going to look at the page and use judgment. An AI shopping agent — inside ChatGPT, Perplexity, or Google's AI-driven shopping surfaces — has to resolve price and availability into a single answer it states as fact, often without a human checking the source page first. When the markup is missing, stale, or contradicts the visible page, the agent either guesses, drops the product, or occasionally repeats a wrong number with full confidence.
Where the ambiguity actually creeps in
The most common failure isn't the absence of schema — it's schema that used to be right. Google's own guidance on the priceValidUntil property exists because prices go stale: it's defined as "the date after which the price is no longer available," and Google explicitly warns that a merchant listing "may not display if the] property indicates [a] past date" ([schema.org/priceValidUntil; Google's merchant listing documentation). A retailer that marks a sale price with a priceValidUntil of the sale's end date, then forgets to update it when the sale ends, is now telling every downstream reader that the price is unconfirmed — even though the live page shows the correct number.
Real-world instances of this compound quickly. In one documented case, a WooCommerce store's structured data was flagged in Search Console with a "Missing field priceCurrency" error inside offers.priceSpecification on every product page, despite the site appearing to output valid schema.org markup — the kind of defect that's invisible on the rendered page and only shows up in a validator (WooCommerce GitHub issue #60652). Shopify's own community forum has recurring threads about themes silently dropping the price microdata from the offer entirely, usually because inline microdata markup breaks the moment a theme's HTML changes — a fragility that's part of why Google and most implementers now recommend JSON-LD over microdata for this exact reason.
The scale of the underlying problem is bigger than a few misconfigured stores. Adobe's AI Content Visibility Checker, which scores how much of a page's content is actually parseable by large language models, put the average U.S. retail product page at 66% machine-readable — meaningfully behind homepages (75%) and category pages (74%) — and attributed weaker scores in categories like furniture and home goods to page structures that "suppress AI citation" (Adobe: AI traffic surge, retail sites not machine readable). Product pages, which are exactly where price and availability live, are the weakest link.
Required vs. recommended: what the specs actually ask for
Direct answer: Google publishes two separate markup profiles depending on whether a page can complete a purchase. Product snippets are for pages where the product is described but not directly bought; merchant listings are for pages where the merchant is the seller and price/availability drive a purchase decision. The two overlap heavily, but merchant listings carry stricter requirements — notably, a price greater than zero is mandatory, which isn't true for product snippets (Google: Merchant listing structured data; Google: Intro to Product structured data).
| Property | Where it lives | Status | What breaks if it's wrong or missing |
|---|---|---|---|
name | Product | Required | Agent can't reliably match the product to a query |
image | Product | Required | Product may be excluded from visual shopping surfaces |
offers (Offer) | Product | Required | No price context at all — the product reads as unpriced |
price / priceSpecification.price | Offer | Required | Must be > 0 for merchant listings; zero or absent kills eligibility |
priceCurrency | Offer | Required | Ambiguous currency; agents may misinterpret or reject the price |
availability | Offer | Strongly recommended | Agent can't tell in-stock from sold-out without a page fetch |
priceValidUntil | Offer | Recommended | Stale prices flagged unconfirmed; listing can stop displaying |
itemCondition | Offer | Recommended | New vs. used/refurbished goes unstated, a real problem for marketplaces |
gtin / gtin8/12/13/14 | Product | Recommended (required where one exists) | Agent can't confidently match the same product across retailers |
sku | Product | Recommended | Weakens internal identity matching, no cross-retailer effect |
brand | Product | Recommended | Loses a key disambiguation and ranking signal |
aggregateRating / review | Product | Recommended | No trust signal; some AI shopping surfaces down-rank unreviewed items |
hasMerchantReturnPolicy | Offer | Recommended | Return terms unstated, a factor in agent ranking |
shippingDetails | Offer | Recommended | Shipping cost/speed unstated, another agent ranking factor |
(Table condensed from Google's merchant listing requirements and the schema.org Offer reference.)
The pattern worth noticing: nearly everything outside the four hard-required fields is officially "recommended," but in practice each recommended field is load-bearing for a specific downstream decision — availability for whether an agent will surface the item at all, gtin for whether it gets correctly matched against competing sellers, hasMerchantReturnPolicy and shippingDetails for whether it wins a price-and-terms comparison against a rival listing.
Google Merchant Center as a correctness proxy — and its limits
Google Merchant Center's product feed is a useful second reference point because it enforces, as hard requirements, several fields schema.org treats as optional: id, title, description, link, image_link, price, and availability are required for essentially all products, and for most products brand plus gtin (or an explicit identifier_exists: false) are required too (Google Merchant Center: Product data specification). Google's GTIN guidance is unusually blunt about accuracy: "only provide a GTIN if you are sure it is correct... when in doubt, don't provide one" (Google Merchant Center: GTIN) — a fabricated or guessed identifier is treated as worse than no identifier at all, because it actively mismatches the product against a real one.
That proxy has a real limit, though: Merchant Center feed correctness and on-page structured data correctness are two different pipelines that are supposed to agree and frequently don't. Google's own documentation notes that "some experiences combine data from structured data and Merchant Center feeds if both are available," and that product snippets may pull pricing from the feed if it's absent from the page markup. When the two disagree — feed says $89.99, on-page JSON-LD still says $99.99 from before a price drop — the correctness of either one stops being enough on its own.
Why AI shopping agents care more, not less
Perplexity's shopping surface makes the dependency explicit: it ingests the same Google Shopping product data specification merchants already submit to Merchant Center, and treats GTIN as the primary key for matching — Perplexity "collapses identical products] into a single product card" across retailers using GTIN, then ranks sellers by price, shipping, and trust signals built partly from that same structured data ([Shopify: Perplexity Shopping guide). OpenAI's Agentic Commerce product feed spec goes further in the other direction — instead of crawling pages, merchants push a structured file directly, with updates accepted as often as every 15 minutes specifically so price and stock don't go stale between fetches (OpenAI Developers: Product Feed Specification; OpenAI Help Center: Shopping with ChatGPT Search). Both designs point at the same conclusion: these systems were built on the assumption that retailers' structured data drifts from reality, and they've engineered around that assumption rather than trusting it away.
A step-by-step process for making product schema unambiguous
- Inventory every product template, not just the flagship PDP. Variant pages, out-of-stock pages, and category-page product cards often use different templates that silently lack markup the main template has.
- Move from inline microdata to JSON-LD if you're still using the former. JSON-LD lives in a single script block independent of the visible HTML, so a theme or layout change can't silently strip a property the way it can with attributes embedded in markup.
- Populate the four hard-required fields first:
name,image, and anoffersobject carryingpriceandpriceCurrencyin ISO 4217 format (three letters, e.g.USD). For merchant listings, confirm price is strictly greater than zero. - Add
availabilityand keep it wired to the same inventory system the page itself reads from. A separate, manually maintained availability flag is exactly how markup and page state drift apart. - Set
priceValidUntildeliberately, and put its refresh on the same job that changes the price. Treat a stalepriceValidUntilas a bug class, not a one-time setup task — it's the single most common cause of markup going quietly wrong after launch. - Add
gtin(or the most specific GTIN variant you hold) only when you're certain it's correct, and setidentifier_existsto false when no identifier exists rather than fabricating one. A wrong GTIN actively mismatches the product; Google's own guidance treats a guessed value as worse than an absent one. - Add
brand,sku,itemCondition,hasMerchantReturnPolicy, andshippingDetails. None of these are hard-required, but each answers a specific question an AI shopping agent uses to rank or filter listings. - Validate with both Google's Rich Results Test and the independent Schema Markup Validator (validator.schema.org) — the two catch different classes of error, and Google's tool won't flag every schema.org-level problem a stricter validator will.
- Reconcile against the Merchant Center feed if one exists. Price and availability should match exactly between the feed and the on-page markup; a mismatch is a documented trigger for both Merchant Center disapprovals and inconsistent AI-agent answers.
What this doesn't guarantee
Direct answer: Correct schema is a necessary condition for being read accurately, not a sufficient one for being shown at all. Google states this directly in its structured data guidelines: using structured data "enables a feature to be present, it does not guarantee that it will be present," even when a page validates cleanly (Google: General structured data guidelines). Ranking, competing offers, and Google's own editorial judgment all still apply on top of correct markup.
It also doesn't fix upstream data quality. If the live price on the page is wrong, marking it up correctly just propagates the wrong number faster and more confidently. If your GTIN is wrong, correct-looking schema will get you matched to the wrong product, not exempted from matching. And it doesn't stop an AI agent from summarizing, compressing, or occasionally still getting something wrong even when the source is unambiguous — 2026 reporting has documented frontier models weighting AI-generated review summaries over the underlying reviews they were shown, which is a synthesis failure schema can't correct for. Structured data narrows where an agent has to guess; it doesn't remove every place an agent can still be wrong.
Where nqzai fits
Direct answer: nqzai's product-page audit checks the structured data that's actually on the page — not just whether a Product/Offer block exists, but whether the required and recommended fields are present, whether priceValidUntil has quietly expired, and whether the declared price and availability match what's visibly rendered — and turns the gaps into a prioritized fix list rather than a pass/fail score, so the fields that actually change how an AI shopping agent reads the page get fixed first.
FAQ
Direct answer: Does adding Product schema guarantee my products show up in ChatGPT or Perplexity shopping results?
No. It makes your price, availability, and identifiers legible to the systems that read them, but inclusion still depends on the merchant program or feed each platform runs — Perplexity, for instance, requires separately enrolling in its Merchant Program even though it also reads on-page schema.org markup (Shopify: Perplexity Shopping guide).
What's the single most common product schema error?
A priceValidUntil date that's slipped into the past because the sale ended but the schema wasn't updated with it, plus a smaller but recurring class of missing priceCurrency fields that only surface in Search Console, not on the rendered page (Google: priceValidUntil guidance; WooCommerce priceCurrency issue).
Do I need a GTIN if I'm the only seller of a product?
No — Google's own guidance says if you're the sole seller or the product is a store brand, it may not have a GTIN at all, in which case submit brand and mpn instead, or set identifier_exists to false rather than inventing a value (Google Merchant Center: GTIN).
Is JSON-LD required, or can I keep using Microdata/RDFa?
Google supports all three formats, but JSON-LD is the de facto standard now, largely because it isn't embedded in the visible HTML and so survives theme and template changes that routinely strip inline microdata attributes.
Should my on-page schema and my Merchant Center feed always match exactly?
Yes for price and availability — a mismatch is a documented cause of Merchant Center disapprovals, and some AI shopping surfaces blend both sources, so a discrepancy doesn't get definitively resolved one way, it just becomes ambiguous.
Does Product schema help with traditional Google Search too, not just AI surfaces?
Yes — the same markup drives Google's product snippets and merchant listing rich results in classic search, and Google explicitly designed the two markup profiles (snippet vs. listing) to overlap so a well-marked-up merchant listing page is generally also eligible for snippet display (Google: Intro to Product structured data).



