# My price only appears after JavaScript runs. How do I confirm an AI agent can read it?

> Compare page-source price, currency, and availability with Shopify responses in the same visitor context. Hand confirmed gaps to the developer.

September 5, 2026 · Updated September 21, 2026 · Sources checked September 21, 2026

https://app.ai-commerce-ready.com/blog/confirm-agents-can-read-your-price-without-javascript/

## When this applies

You need to check whether a public product page includes price, currency, and availability in its server-sent JSON-LD, including after Store Check reports a gap. [1][4]

## When this does not apply

Shopify Catalog sends product data to activated AI channels through Shopify. This Answer covers the separate open-web route, not Catalog delivery. [6]

## Why this matters

Not all crawlers run JavaScript. Google warns that dynamically generated Product markup can make Shopping crawls less frequent and less reliable for price and availability. [1][2]

## What to do

Find the product’s JSON-LD Offers in page source. Compare their minimum price, currency, and combined availability with the product .js and cart.js responses in the same visitor context. Correct confirmed gaps and repeat. [4][5]

## When you’re done

For each page checked, the server-sent JSON-LD identifies that product and has complete Offers with nonnegative prices. Their minimum price, currency, and combined availability match the same-context Shopify responses. [4][5]

## What this cannot prove

Matching evidence covers only the pages and visitor context checked. It does not prove that a crawler fetched or indexed them, that an assistant quoted them, or that Shopify Catalog delivered them. [1][6]

## Steps

1. Open a public product page while signed out and view its source. Find the application/ld+json block for that product and its Offer or AggregateOffer data. Visible price text alone is insufficient. [1][5]
2. In the same visitor context, open the product URL with .js appended to its product path and the locale-appropriate cart.js. Record price_min divided by 100, available, and the cart currency. [4]
3. Compare every Offer’s price, currency, and availability as described below. If the minimum price and combined availability agree, keep the page unchanged. If context or currency differs, stop without diagnosing a theme fault. [4]
4. For a confirmed missing or inconsistent Offer, have the theme or storefront developer correct the server-sent markup, then repeat the comparison and Re-check Store Check. If you cannot safely edit code, send the observed evidence to that developer. [5][2]

- Official page: [Shopify admin theme code editor](https://admin.shopify.com/)
- How to get there: Shopify admin > Online Store > Themes > For the relevant theme, click the ··· menu > Edit code
- Before you act: The theme code editor opens with the theme's directories, including sections and snippets.
- When to stop: Stop without changes when the sampled evidence agrees. Stop and hand off when evidence is unreadable, visitor context or currency differs, or the markup uses forms this check cannot compare. Preserve intended login and pricing restrictions. [4][3]

## Paid help and free options

- When paid help makes sense: Developer help can be useful when a confirmed markup gap needs changes to a custom theme, pricing integration, or headless storefront while preserving the intended pricing and access rules. [2][5]
- What’s already free: A browser can show page source and Shopify’s public product JSON. Shopify also provides a Liquid structured_data filter for generating product JSON-LD; a theme must use it to include that output. [4][5]

**Check the price data sent with the page, not only the price you see.** JSON-LD is product data a theme can put in the HTML response. Compare its price, currency, and availability with Shopify's public product and cart responses.

This covers public-page discovery. Shopify's [data sharing explanation](https://help.shopify.com/en/manual/online-sales-channels/agentic-storefronts/data-privacy) separates that route from Shopify Catalog delivery.

## 1. Read the page source

Open the product page signed out and use **View page source**. The browser inspector may show changes made after JavaScript runs.

Find `application/ld+json`, then the `Product` or `ProductGroup` for this product and its `offers`, including variants. Confirm identity by URL, identifier, or other product evidence. A recommended product's Offer, visible price text, or the word `Offer` alone is insufficient.

Google says [not all bots run JavaScript](https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics). [Dynamically generated Product markup](https://developers.google.com/search/docs/appearance/structured-data/generate-structured-data-with-javascript) can also make Shopping crawls less frequent and reliable. These statements promise no particular agent's behavior.

## 2. Read Shopify's matching values

Keep the same domain, locale, market, and signed-out visitor context. For `/products/example`, open `/products/example.js`, retaining any locale prefix. Record `price_min / 100` and product-level `available`.

Shopify's [Ajax product reference](https://shopify.dev/docs/api/ajax/reference/product) says prices use the customer's presentment currency. Read `currency` from the locale-appropriate `cart.js` in that same context. The product response is not a universal base-currency reference.

Stop with “unable to compare” if a response is unreadable, a redirect changes the product or context, or currencies differ. These gaps do not identify a faulty theme, app, or JavaScript.

## 3. Compare the product's Offers

Every Offer needs its own complete numeric, nonnegative `price`, `priceCurrency`, and `availability`. Do not combine fields from incomplete Offers.

- The lowest Offer price must match `price_min / 100`.
- Every Offer currency must match cart `currency`.
- Combined availability must match product `available`: true means at least one available Offer; false means none. The cheapest variant may be sold out while another is available.

For Store Check, available states are `InStock`, `PreOrder`, `BackOrder`, and `LimitedAvailability`. Unavailable states are `OutOfStock`, `SoldOut`, and `Discontinued`. Read the final name of a schema.org URL. Other values need review.

For `AggregateOffer`, compare `lowPrice` and `priceCurrency`. Complete child Offers must have that minimum price and supply combined availability; any aggregate availability must agree. Without children, the aggregate needs its own availability.

If markup uses only `priceSpecification` or an unsupported availability value, ask the developer to review it. Re-check may still report missing or mismatched evidence even if the developer confirms accurate markup. Do not change accurate markup solely to pass this check. [Google's merchant listing rules](https://developers.google.com/search/docs/appearance/structured-data/merchant-listing) are separate; Store Check accepting zero prices says nothing about Google eligibility.

## 4. Correct confirmed gaps and check again

Send the developer the product URL, visitor context, JSON-LD, and product/cart values. Stop here if you cannot safely edit code.

For Liquid themes, use the theme code editor. Shopify's [structured_data filter](https://shopify.dev/docs/api/liquid/filters/structured_data) can generate JSON-LD; the developer should correct its source and avoid conflicting duplicate Offers. A headless developer owns that storefront's response; the theme editor may not control it.

Preserve market pricing, login restrictions, and B2B rules. Do not remove pricing apps or expose restricted prices. After correction, compare the same responses again.

If you came from a Finding, return to Store Check and run Re-check. Read coverage and evidence availability: it checks at most three published pages on the primary domain anonymously. Its context may differ from yours. Redirected hosts or paths, missing currency context, or different currencies leave it Not Checked.

Matching data confirms only the pages and context checked. It proves no crawler fetch, indexing, assistant quotation, or Catalog delivery.

## Sources

1. [JavaScript SEO basics](https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics)
2. [Generate structured data with JavaScript](https://developers.google.com/search/docs/appearance/structured-data/generate-structured-data-with-javascript)
3. [Merchant listing structured data](https://developers.google.com/search/docs/appearance/structured-data/merchant-listing)
4. [Ajax API product endpoint](https://shopify.dev/docs/api/ajax/reference/product)
5. [Liquid structured_data filter](https://shopify.dev/docs/api/liquid/filters/structured_data)
6. [Data sharing and privacy for agentic storefronts](https://help.shopify.com/en/manual/online-sales-channels/agentic-storefronts/data-privacy)
