Does your price survive with JavaScript off?
Free 20-second check. We fetch one product page the way AI agents and shoppers on slow connections first see it, scripts off, and tell you whether the price and the stock line are in the HTML your server sends.
It fetches one product page, scripts off
Your pasted product page, or one we find from your store root. The raw server response, before any JavaScript has run.
It reads the price and the stock line
A price with a currency, and an availability phrase like 'in stock' or a ship date, in the HTML text or in the JSON-LD. The same detector the full 115-rule audit runs.
Pass, partial or fail, with what we found
Both present is a pass, one of the two is a partial, neither is a fail. If the page cannot be fetched we say so rather than guess. Free, no sign-up.
What we check: rule PDP-A02 in four parts
Full rule page ›The rule requires that a machine reading the raw page, with no JavaScript, can find the price and the availability. That is how AI shopping agents read your store, and it is what a shopper on a slow connection sees first.
| Rule | What we check | Passes when |
|---|---|---|
| PDP-A02 · aPrice in the server HTML | A price with a currency symbol or code in the HTML text your server sends, before any script runs. | ✓ pass a readable price is in the raw response. |
| PDP-A02 · bAvailability in the server HTML | An availability phrase near the product: in stock, out of stock, a count, or a pre-order note. | ✓ pass a stock signal is in the raw response. |
| PDP-A02 · cPrice in the JSON-LD | A price declared in the structured data as well, so a parser does not have to guess from page text. | ✓ pass offers.price is declared. |
| PDP-A02 · dAvailability in the JSON-LD | An availability value in the structured data, in the schema.org vocabulary a parser accepts. | ✓ pass offers.availability is declared. |
Best practices any store should adopt
Each point comes with the reason it matters and the research it rests on. Most of it is one template edit or one server-side setting, not a redesign.
Currency converters and storefront APIs that fill the price after load leave a blank for crawlers, agents and slow connections. Print the default price in the HTML and let scripts update it.
'In stock · ships today' next to the price answers the second question a shopper has. Hiding it until a size is chosen delays the answer by a tap.
Title, price, stock, then the gallery. On a phone the first screen has room for four things; the price must be one of them.
A struck-through compare-at price, a per-unit price and a subscription price in the same line read as three prices. Make the one they pay largest, and label the rest.
The visible text serves people; the structured data serves parsers. Declaring both, and keeping them equal, is what makes your price quotable everywhere.
Three stores that get it right
All 37 passing stores ›Related articles
Resources ›My price depends on the variant. What counts as readable?
A default price, or a from-price, in the server HTML before any tap. A price that exists only after a size or colour is chosen, or only after JavaScript runs, is invisible to a machine reader.
Why check with scripts off? Real browsers run JavaScript.
AI shopping agents and most crawlers read the HTML your server sends and leave. So does a shopper on a slow connection for the first seconds. If the price is injected afterwards, both see an empty box.
Do you measure where the price sits on a phone screen?
Not yet. This check reads the raw HTML only. The full audit opens your page in a real phone-sized browser as well, and its product-page rules cover layout and the fold.
This is one rule. The full audit runs 115.
Product page, cart and checkout, scored for human shoppers and for AI shopping agents, with a revenue band on every failing issue.