Stall library · Discover
Product pages have no schema.org markup
Missing schema.org Product markup means the purchase facts on your product page exist only as layout, so an AI agent has to infer the price, the stock status and the identifier from where text happens to sit on the page. Inference is where agents get facts wrong, and an agent that is unsure of a price will usually recommend the store it is sure about.
Why the agent stops
Structured data is a statement in a fixed vocabulary: this number is the price, this value is the availability, this string is the identifier. Without it, the agent is reading a design. A struck through original price beside a sale price, a bundled option, a price in a nested element rendered after load: each of those is unambiguous to a person and a coin flip to a parser.
The consequence is not usually a wrong answer shown confidently. It is a hedge. Agents are tuned to avoid asserting facts they cannot ground, so an unreadable price tends to produce a recommendation of somewhere else rather than a mistake about you.
How often we see this
Not stated here. A frequency means nothing without the cohort it was counted over, and this page is about one stall rather than one category. Where a category has enough stores measured at every stage, the share of them showing this stall is published on its benchmark page, with the methodology beside it.
See it for yourself
- Open a product page and view source, or fetch the URL with curl so you see the HTML as delivered rather than after scripts run.
- Search the source for "application/ld+json".
- If a block exists, check it contains an object with "@type": "Product" and an "offers" object carrying "price", "priceCurrency" and "availability".
- Repeat on a product added by a different app or template. Markup is often present on one template and absent on another.
What to change
- Add schema.org Product JSON-LD to every product page, including offers.price, offers.priceCurrency and offers.availability.
- Include an identifier: a GTIN, EAN, UPC or MPN, so an agent can match your product to the one a shopper named elsewhere.
- Emit the markup in the server response rather than injecting it with a script after load.
- Describe variants with hasVariant entries, each carrying its own offer, so a size or colour choice is readable without running the page.
What Ottom looks at
Ottom reads several product pages per scan and records whether each carried schema.org Product markup as delivered. The finding is raised when none of the pages we could read carried it, and the price, stock and identifier checks that follow only run against pages that did.
Questions
Is rich results markup the same schema agents read?
Usually yes, and if search shows a price for your product you probably have offers.price. It does not follow that you have availability, variants or an identifier, and those are the fields a purchase decision turns on rather than a search result.
Does schema markup an app injects after load count?
Only for clients that run scripts. An agent reading the delivered HTML sees the page without it, so markup that depends on client side execution is markup some agents will never see.