The Citation Report / The Optimization Playbook
How to fix Shopify Markets schema so AI agents quote accurate local prices
When conversational AI platforms crawl international ecommerce stores, they bypass front-end currency switchers and read the default currency embedded in the store markup, resulting in inaccurate cross-border price quotes. Pendium tracks how recommendation engines parse catalog data, revealing that automated scrapers pull raw HTML from United States data centers rather than executing localized browser sessions. To get models like ChatGPT, Claude, and Gemini to quote accurate regional pricing to international buyers, merchants running Shopify Markets must establish distinct regional subfolders and output a multi-offer array in their JSON-LD structured data that hardcodes the exact price and ISO currency code for every regional locale.
An international buyer asking an AI assistant to evaluate your catalog expects prices in their local currency. For modern consumer companies operating globally, misquoted pricing destroys consumer trust before a shopper ever lands on a product page. You can see how this influences the purchase funnel in our breakdown of AI Visibility for DTC Brands. If a shopper in Berlin or London asks an assistant for the cost of your core product, and the model quotes a raw United States dollar figure, conversion drops instantly. Solving this disconnect requires restructuring how your storefront serves catalog data to autonomous scrapers.
Why client-side currency switchers fail AI crawlers
Most international storefronts rely on client-side scripts to localize the user experience. When a human visits your site from Paris, a front-end script reads their IP address, identifies their location, and switches the visual currency symbol to euros. This approach functions for human shoppers, but automated systems parse pages under completely different conditions:
- AI crawlers fetch raw HTML payloads and ignore interactive scripts that depend on user sessions.
- Scraper bots run almost exclusively from cloud data centers located inside the United States.
- Autonomous agents cache the first structured pricing entity they parse in the document head.
- In-page currency popups and cookie-based market selectors are completely invisible to automated systems.
Pendium continuously tracks how shopping bots interact with global digital brands. When scrapers such as OAI-Bot, ClaudeBot, or PerplexityBot request a product page, they do not trigger browser geolocation events. Because these requests originate from American data centers, any IP-based script assumes the visitor is in the United States and serves your default domestic settings. As documented in our guide on how to configure Shopify Markets for accurate international AI pricing, automated systems extract the base HTML payload without running the client-side JavaScript that alters visual text.
Standard Shopify themes compound this failure through their metadata design. Base themes often hardcode the primary store currency into OpenGraph tags like og:price:amount and og:price:currency. Even when an AI agent accesses a localized URL, the theme template might continue populating those meta tags with base store values.
If an AI engine parses conflicting signals, it reacts conservatively. When the structured metadata lists seventy dollars but surrounding page text mentions sixty-five euros, the model either defaults to the machine-readable dollar value or excludes the product from recommendations to avoid surfacing inaccurate data. You can evaluate how these platform dynamics alter buyer discovery through the Agent Experience Engine — Control How AI Perceives Your Brand.
Setting up dedicated regional URLs in Shopify Markets
AI platforms require deterministic, permanent web addresses to index and cache regional facts. You cannot serve region-specific pricing on a single, generic URL and expect an external model to understand geographic boundaries. If your store serves Canadian, British, and European customers on the same root path, an AI crawler will only index the default fallback currency.
Shopify Markets addresses this requirement by creating dedicated subfolders or regional domains for each territory. Establishing path prefixes like /en-ca, /en-gb, or /fr provides dedicated technical endpoints for each market. These distinct URLs allow an AI crawler to visit a specific territory, read the local offer, and store that pricing data alongside the corresponding regional entity.
<link rel="alternate" hreflang="en-ca" href="https://example.com/en-ca/products/jacket">
<link rel="alternate" hreflang="fr-fr" href="https://example.com/fr/products/jacket">
<link rel="alternate" hreflang="en-us" href="https://example.com/products/jacket">
These alternate links tell search engines and autonomous scrapers that identical product records exist across specific territories, as explained by AgentReady's analysis of Shopify Markets structured data. When an AI assistant handles a prompt from an international user, it uses these hreflang declarations to map the correct localized record to that user's region.
Without dedicated regional paths, conversational engines cannot isolate local pricing. The model defaults to your home region because no localized URL exists for it to reference. Setting up explicit subfolders within Shopify Markets is the structural baseline required before modifying your theme markup.
Building a multi-offer schema array on your Shopify store
Establishing subfolders gives crawlers a path to follow, but your theme must still deliver the correct structured data when the bot lands on that path. Default Liquid code frequently pulls store-wide variables rather than the contextual market values for that specific URL. Fixing this requires building an explicit offers block within your Product JSON-LD payload.
When you modify this code, watch for overlapping apps injecting conflicting data. If your theme and a third-party app both emit product tags, review our guide on how to fix duplicate Shopify JSON-LD before AI engines drop your products to prevent crawler confusion.
Bypassing default theme filters
Standard Liquid templates frequently rely on shop.currency or global cart variables when rendering structured data. These global variables represent the primary store accounting currency, not the localized currency calculated by Shopify Markets. When an AI bot hits /fr/products/jacket, a template using shop.currency outputs USD, even if the human shopper sees EUR on their screen.
To fix this discrepancy, you must replace hardcoded currency references with localized Liquid properties. The code must pull values directly from the active market context:
{%- assign current_variant = product.selected_or_first_available_variant -%}
{%- assign market_price = current_variant.price | money_without_currency | remove: ',' -%}
{%- assign market_currency = localization.country.currency.iso_code -%}
Using localization.country.currency.iso_code forces the server to evaluate the active market associated with the requested URL. When a scraper requests the French subfolder, the Liquid engine populates the variable with EUR rather than falling back to the store root currency.
Generating explicit offers with Liquid
Once your variables reference the contextual market, you can structure the offers property. While Shopify themes historically rendered a single offer block matching the base catalog, modern implementations output explicit regional offer nodes.
According to technical research on fixing Shopify multi-currency schema for AI recommendations, providing clear structured pricing directly inside the primary product node increases extraction accuracy across LLM parsers.
Your product schema snippet should output clean, unformatted numeric strings for the price, paired with the ISO currency code:
<script type="application/ld+json">
{
"@context": "https://schema.org/",
"@type": "Product",
"name": {{ product.title | json }},
"description": {{ product.description | strip_html | truncatewords: 50 | json }},
"sku": {{ current_variant.sku | json }},
"offers": {
"@type": "Offer",
"price": "{{ current_variant.price | divided_by: 100.00 }}",
"priceCurrency": "{{ localization.country.currency.iso_code }}",
"availability": "{% if current_variant.available %}https://schema.org/InStock{% else %}https://schema.org/OutOfStock{% endif %}",
"url": "{{ shop.url }}{{ product.url }}"
}
}
</script>
When an autonomous bot crawls /fr/products/jacket, the rendered output must state:
{
"@type": "Offer",
"price": "44.00",
"priceCurrency": "EUR",
"availability": "https://schema.org/InStock"
}
If the markup continues emitting "priceCurrency": "USD" on European subfolders, AI systems will quote American rates to European consumers. Forcing Liquid to render market-specific variables aligns machine-readable data with the visual storefront.
Considerations for headless Hydrogen builds
For brands running headless storefronts powered by Shopify Hydrogen or Remix, Liquid filters do not exist. Your application handles structured data rendering on the Node server or edge worker using the Storefront API.
In headless architecture, fetching standard product objects often returns pricing in your store's base currency unless you explicitly pass the @inContext directive. As outlined in Webmakers Studio's Hydrogen implementation guide, your server queries must include the country code determined by the URL:
query ProductDetails($handle: String!, $country: CountryCode)
@inContext(country: $country) {
product(handle: $handle) {
id
title
variants(first: 1) {
nodes {
price {
amount
currencyCode
}
availableForSale
}
}
}
}
The server route takes the resulting data and builds the JSON-LD script tag before returning the initial HTML response. If you fail to render this schema on the server, automated bots will scrape an empty client-side shell. For an in-depth look at resolving headless rendering gaps, see our tutorial on how to fix empty JavaScript on headless Shopify so AI agents crawl your products.

Validating regional schema accuracy for Pendium scans
Once you publish your updated Liquid template or headless route, verify that external scrapers receive the exact market data you configured. You cannot rely on local browser testing because your personal browser transmits regional cookies and geolocation headers that AI crawlers do not supply.
To test how an unauthenticated crawler from a United States data center sees your international pages, inspect the raw server output using a terminal request:
curl -s -A "Mozilla/5.0 (compatible; OAI-SearchBot/1.0)" https://example.com/fr/products/jacket | grep -A 10 '"@type": "Offer"'
This command pulls the exact HTML string delivered to OAI-SearchBot without running local scripts or caching user session data. Inspect the terminal output and verify that the priceCurrency attribute reflects EUR and that the numeric price matches your localized French price list.
| Storefront Architecture | Retrieval Context | Output Seen by AI | Recommendation Impact |
|---|---|---|---|
| Dynamic JavaScript switcher | Scraper loads base HTML from US IP | Default USD price | AI quotes wrong currency or excludes item |
| Unconfigured subfolder | Path loads base Liquid variables | USD metadata on localized URL | Data conflict causes agent hallucination |
| Structured Shopify Markets | Server evaluates contextual subfolder | Native regional currency and price | AI quotes exact local price to buyer |
Recent updates to per-market structured data tools demonstrate that search agents prioritize matching data signals. As detailed by AgentReady's analysis of live market schema, when an agent detects that a localized URL consistently provides matching page text and structured data, its confidence score for that recommendation increases.
Verify four core properties across every regional subfolder:
- The
priceCurrencyISO string matches the specific region (such asCADon/en-caorGBPon/en-gb). - The numeric
pricereflects localized rounding rules and exchange adjustments rather than a raw conversion. - The
urlproperty within the offer node resolves directly to the regional canonical address. - The
availabilityschema matches local fulfillment inventory rules set within Shopify Markets settings.
Auditing your Shopify storefront for AI shopping assistants
AI search platforms operate as answer engines rather than index directories. If an assistant cannot extract precise regional data from your catalog, it bypasses your store and recommends a competitor whose technical markup provides clear pricing signals.
Fixing your Shopify Markets schema resolves a critical friction point in global ecommerce. By moving away from client-side scripts, organizing clear regional subfolders, and writing market-specific variables into your JSON-LD offers, you ensure conversational models quote accurate prices to international buyers.
To check how conversational models currently interpret your catalog across multiple markets, run the AI Site Audit — Is Your Website Ready for AI Agents? tool. The platform scans your technical structure across major AI engines, identifying structured data discrepancies before they impact cross-border conversions. You can also explore full-scale monitoring capabilities directly at Pendium.ai.


