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

A crawler that does not run scripts sees only the HTML your server sent. Two checks show whether the price and availability are in it.

When this applies
A product page shows the correct price in a browser, but an assistant quotes no price, an old price, or the wrong currency, and a currency app, a B2B pricing app, a login-to-see-price app, or a headless front end writes the price. [1] [6]
When this does not apply
Price that reaches ChatGPT, Copilot, or another activated channel through Shopify Catalog is sent by Shopify from your product data and does not depend on the page. This Answer covers only the open-web route. [6]
Why this matters
Google states that not all bots can run JavaScript, and that dynamically generated Product markup makes Shopping crawls less frequent and less reliable for fast-changing content like price and availability. [1] [2]
What to do, or not do
Read the page source rather than the rendered page, confirm the price digits and availability are in the HTML, and compare them with the public product JSON. Where a script writes the price, find the app or section that does it. [1] [4]
What you'll see when it's done
The raw HTML of a product page contains the same price and availability as the product JSON, with no placeholder that a script fills in later. [4] [5]
What this result does not prove
A readable price proves that a crawler without JavaScript can see it. It does not prove that any crawler fetched the page, that the page was indexed, or that an assistant quoted the product. [1] [6]
Sources checked
September 5, 2026

Steps

  1. Open the product page in a signed-out window, open the page source rather than the inspector, and search for the price digits and for the word Offer. Note whether each appears or a placeholder stands in its place. [1] [2]
  2. Replace the end of the product URL with .js, open it, and read price and available. Write down both values. [4]
  3. If the source shows the same price and availability as the JSON, stop. If the source shows a placeholder, a different currency, or nothing, a script writes the price and the next step finds it. [4] [5]
  4. In Online Store, Themes, Edit code, open the product price section or snippet and read whether it prints the Liquid price or leaves a container for an app. Name the app or the front end that fills it. [5] [3]

Open the official page, then report your progress

Progress stays in this browser on this device. We record only which official page you opened and whether you report that you finished or stopped at a step. AI Commerce Ready and Shopify do not check the result or change your store here.

Where the official page is
Shopify admin → Online Store → Themes → For the relevant theme, click the ··· menu → Edit code
What you'll see before you act
The theme code editor opens with the theme's directories, including sections and snippets.
What you'll see when it's done
The raw HTML of a product page contains the same price and availability as the product JSON, with no placeholder that a script fills in later.
When to stop, or leave it as it is
Stop with no change when the raw HTML carries the price and availability the JSON reports. Stop before removing or reconfiguring an app when it also does the store's currency or B2B pricing job and no replacement is ready. [4] [2]
Go to Shopify admin theme code editor

Come back here after: Keep this page open. After reading the price section or naming the app, return to this tab and record which system writes the price and whether the raw HTML now carries it.

What would you like to report?

When a third party is worth paying for, and what you do not have to buy

When paid help is worth it
Paid help is worth it only for a headless or custom storefront where a developer must move price and Offer markup into the server-rendered HTML, or when a pricing app must stay and needs a server-side fallback built. [2] [3]
What you do not have to buy
A Liquid theme prints the product's price from the product object into the HTML, and Shopify serves the product JSON publicly, so the two checks need a browser window and nothing else. [5] [4]

A product page can show the right price to every person who opens it and still show no price to a crawler. The difference is JavaScript. A browser runs the page’s scripts and then paints the price. A crawler that does not run scripts reads only the HTML your server sent. If the price arrives by script, that crawler sees a placeholder or nothing.

Why this is a real gap and not a theory

Google’s JavaScript SEO basics describes its own three phases of crawling, rendering, and indexing, and states that a page can wait in the rendering queue for longer than a few seconds. The same page recommends server-side or pre-rendering because it makes the site faster and because not all bots can run JavaScript.

For product pages, Google’s page on structured data generated with JavaScript states that Google can process markup available in the DOM after rendering, then adds a warning specific to Product markup: dynamically generated markup can make Shopping crawls less frequent and less reliable, which is an issue for fast-changing content like product availability and price. Google’s merchant listing requirements require a price greater than zero in the Offer for a page to qualify.

Google is the vendor that documents its renderer in the most detail. Shopify’s data sharing page describes the other AI channels’ open-web route in one sentence: they can reach product information through web crawling and indexing, where the data might not always be as complete, accurate, or up to date. A price that exists only after a script runs is the plainest way for that sentence to come true.

Where a Shopify price normally lives

A Liquid theme prints the price with the product object, whose price property is the lowest variant price in the currency’s subunit and whose available property reports whether any variant can be bought. That value is in the HTML before any script runs. The stores that lose it are the ones where something rewrites it afterward: a currency converter that replaces the number for the visitor’s region, a B2B or wholesale pricing app that hides the price until login, a bundle or subscription app that recomputes it, or a headless front end that fetches the price after the page loads.

Shopify also serves each product’s data as public JSON. The Ajax product endpoint returns price, price_min, compare_at_price, and available for the product and each variant at the product URL with .js appended. That file is your reference value: it is what Shopify holds for the product, independent of what the theme or an app paints.

The two checks

  1. Read the page source. Open the product page in a signed-out window. Use the browser’s view source command, not the inspector; the inspector shows the page after scripts ran, and the source shows what the server sent. Search for the price digits and for the word Offer. If both appear with the right numbers, the price is readable without JavaScript.
  2. Read the product JSON. Replace the end of the product URL with .js and open it. Read price and available. This is the value Shopify holds.

If the source and the JSON agree, stop. If the source shows a placeholder such as an empty span, a different currency from the JSON, or no price at all, a script writes the price and you need to name it.

Finding what writes the price

Open Online Store, then Themes, then Edit code for the live theme, and open the section or snippet that renders the product price. In most themes it is named for price. Read whether it prints the Liquid price or leaves a container that an app fills. The theme’s own code will name the app or the block that owns that container.

For a headless front end, the theme editor is not the place; the developer who owns the front end can say whether the price and the Offer markup are rendered on the server or fetched afterward.

What to do with the result

Keep the Liquid price in the HTML and let the app rewrite it afterward if it must. Most currency and pricing apps can be set to leave the server price in place and replace it on screen, which gives a crawler the base price and a person the converted one. A wholesale app that hides prices until login is a business decision, and a hidden price is hidden from crawlers by design; confirm that the products meant for the open web are outside that rule.

The observable result is a product page whose raw HTML carries the same price and availability as the product JSON. That proves a crawler without JavaScript can read them. It does not prove that any crawler fetched the page, that the page was indexed, or that an assistant quoted the product.

Sources

  1. JavaScript SEO basics
  2. Generate structured data with JavaScript
  3. Merchant listing structured data
  4. Ajax API product endpoint
  5. Liquid product object
  6. Data sharing and privacy for agentic storefronts