Multi-Currency Shopify: Why Ad Platforms Show the Wrong Conversion Value

Multi-Currency Shopify: Why Ad Platforms Show the Wrong Conversion Value

TL;DR

On a multi-currency store, the conversion value that lands in GA4, Meta, TikTok, Reddit, and Google Ads is your shop's base currency, not the local amount the customer was charged. Shopify's scalar total_price field is the presentment amount converted back into shop currency at the day's exchange rate, and currency is the shop's three-letter code. That pairing is correct and consistent, so the ad platform does its FX math right. It just means a German shopper who paid 92 EUR shows up in your USD ad account as roughly 100 USD, the shop-currency equivalent, not 92 of anything. Knowing which field carries which currency is the difference between a real bug and a normal currency translation.

Key Takeaways

  • On Shopify, total_price and currency are both expressed in your shop's base currency, not the buyer's presentment currency. The customer's actual charge lives in total_price_set { presentment_money } and presentment_currency.
  • Conversion value and currency code are sent as a matched pair in shop currency, so the ad platform converts at the correct rate. There is no value-versus-label mismatch to fix.
  • A Markets store with a USD base reports every international sale to all five platforms in USD, the FX-converted equivalent, not the EUR or GBP the customer paid.
  • The value sent includes tax and shipping, because total_price is the order total, not subtotal_price.
  • If your ad-platform revenue is off by a fixed multiple (like roughly 150x for a JPY store), that is a true currency-label mismatch somewhere in your stack, not normal FX drift.
  • You can confirm the behavior in minutes: open one international order in Shopify Admin and compare the presentment total to the shop-currency total, then check what your ad platform recorded.

What currency does Shopify actually send to ad platforms?

The short version: your shop's base currency, every time. When an order is placed, Shopify exposes two money fields that look interchangeable but are not. The scalar field total_price is the order total in your shop currency, and currency is the shop's three-letter ISO 4217 code. If a customer in another country paid in their own currency, Shopify back-converts that presentment amount into your shop currency at the live exchange rate and stores the result in total_price [1].

This is the value a conversion-tracking setup reads when it builds the purchase event for each ad platform. So the number flowing into GA4, Meta, TikTok, Reddit, and Google Ads is the shop-currency total, labeled with the shop-currency code. For a single-currency store the distinction never surfaces, because presentment and shop currency are the same thing. For a Shopify Markets store selling internationally, it is the whole story.

The customer's real charge, the amount on their receipt, is not in those scalar fields. It lives in total_price_set, a money bag that carries both shop_money (your base currency) and presentment_money (the buyer's currency), alongside presentment_currency [1]. Standard scalar money fields default to shop currency, which is by design and documented, not an accident [1].

Why does the value look wrong if it is technically correct?

Because "correct" and "what I expected" are two different things here. The value and the currency code agree with each other, both shop currency, so no platform mis-converts anything. But if you are picturing the buyer's receipt, the number will not match, and that gap is real.

Take a concrete case. Your shop base is USD. A shopper in Germany checks out and pays 92 EUR. Shopify back-converts that to roughly 100 USD at the day's rate and writes 100 to total_price with currency set to USD. Your ad platforms record a 100 USD conversion. Nobody paid 100 USD, and nobody paid 100 of anything in EUR. The 100 USD is the shop-currency equivalent of a 92 EUR sale.

Field What it holds Example value
total_price (scalar) Order total in shop currency, FX back-converted 100.00
currency (scalar) Shop currency code USD
total_price_set.shop_money Same shop-currency total, in a money bag 100.00 USD
total_price_set.presentment_money What the customer was actually charged 92.00 EUR
presentment_currency The buyer's currency code EUR

Shopify itself notes that because these shop-currency values are back-converted at the live rate, intermediate amounts "might not sum perfectly to totals" [1]. So beyond the currency swap, you can see small rounding differences against a naive presentment-times-rate calculation. None of that is a tracking defect. It is the cost of reporting every sale in one consistent currency. This is a different problem from why Shopify Analytics and GA4 revenue never match, which is about two analytics tools disagreeing inside a single currency. Here it is one value translated across many currencies, going outbound to ad platforms.

Does the matched pair guarantee correct FX math?

Yes, and this is the part worth being precise about. Every ad platform converts the value you send using the currency code you send. GA4 requires a currency whenever you set a value, and converts to the property's reporting currency using the prior day's exchange rate, keyed entirely on that code [2]. Google Ads reads a currency_code and converts cross-currency values at the average daily rate, falling back to the conversion action's default if you omit it [3]. Meta and TikTok follow the same rule: the currency label decides the conversion.

That means a correct number with the wrong code is silently mis-converted, and no platform throws an error. A 5000 JPY sale labeled USD becomes a 5000 USD conversion, inflating your reported revenue by about 150x. This is the failure mode people fear when they see a "wrong" value. The defense against it is sending value and currency as a pair that always agrees, which is exactly what reading total_price together with currency does. Both are shop currency, so the pair is internally consistent and the platform's math is right.

So the value can look unfamiliar (shop currency instead of receipt currency) while being mathematically sound. The thing to rule out is the fixed-multiple error, where the magnitude is off by an exchange rate, because that points to a genuine label mismatch somewhere in your stack, not to normal Markets translation.

Verify on your own store

You can settle this for your store in about five minutes with one international order.

  1. In Shopify Admin, go to Orders and open a recent order placed from another country (one where the customer paid in a non-base currency).
  2. Look at the order total. Shopify shows the presentment amount the customer paid, for example 92.00 EUR, often with the shop-currency equivalent shown alongside.
  3. Note both numbers: the presentment total (what the buyer paid) and the shop-currency total (your base currency equivalent).
  4. Now open the same purchase in your ad platform. In GA4 go to Reports > Engagement > Events, open purchase, and check the event value and currency. In Meta or TikTok, find the order in Events Manager by its order or event ID.
  5. Compare. The ad platform value should equal the shop-currency total, in your base currency code, not the presentment amount. If it equals the shop-currency figure, your setup is behaving correctly.

If instead the ad-platform value matches neither and is off by a clean exchange-rate multiple, you have a label mismatch to chase down. That is also where server-side delivery matters, because a value sent from the order webhook carries the order's own currency fields rather than whatever a browser session guessed. The difference between browser and server value is covered in conversion API vs browser pixel, and multi-domain Markets setups add their own identity wrinkles in cross-domain tracking on Shopify.

What this means for ROAS and reporting

The upside of one-currency reporting is that your ROAS math inside each ad platform is consistent. Every conversion is denominated the same way, so spend and revenue line up without you reconciling three currencies. A USD ad account sees USD conversions, full stop, and your blended return calculation just works.

The thing to set expectations on is per-order matching. Do not expect a single international conversion in Meta or Google Ads to equal that customer's receipt, because it will be the shop-currency equivalent at that day's rate. If your finance team reports sales in presentment currency and your marketing team reads ad-platform revenue in shop currency, those two views will not tie out at the order level, and that is structural, not a bug. Set the Google Ads account currency to your shop base so the platform stops applying its own conversion on top of Shopify's. The reporting question is not which number is right; both are. It is which currency each audience needs to see.

FAQ

Why is my Shopify conversion value in USD when my customer paid in EUR?

Because Shopify's total_price and currency fields report your shop's base currency, not the buyer's. Shopify back-converts the customer's presentment amount into shop currency at the live exchange rate, and that converted value is what reaches your ad platforms.

Is the conversion value wrong or just in a different currency?

Just a different currency, in almost every case. The value and currency code are a matched pair in shop currency, so the platform converts correctly. It only signals a real bug if revenue is off by a fixed exchange-rate multiple, which points to a value labeled with the wrong currency code.

Does the conversion value include tax and shipping?

Yes. The value sent is the order total from total_price, which includes tax and shipping, not subtotal_price. So your ad-platform revenue reflects the full amount, not the pre-tax line-item subtotal.

Can I make ad platforms show the customer's local currency instead?

Shopify stores the buyer's amount in total_price_set.presentment_money and presentment_currency, so the data exists. Whether your tracking sends shop or presentment value is a setup choice, but reporting in shop currency keeps every conversion in one consistent currency for ROAS.

Send the right value to every platform

On a Markets store the safest setup is one that reads the order's own currency fields and sends value and currency as a matched pair, so no platform mis-converts your revenue. WeltPixel Conversion Tracking delivers every Shopify order server-side to GA4, Meta, TikTok, Google Ads, and Reddit using the order's total_price and currency together, tax and shipping included, so your conversion values stay internally consistent across all five platforms.

Install WeltPixel Conversion Tracking on the Shopify App Store

Sources

  1. Shopify: About Shopify Markets, currencies and foreign exchange
  2. Google Analytics 4: Measure ecommerce, currency and value parameters
  3. Google Ads Help: About conversion value and currency

Ready to upgrade your tracking?

Server-side tracking for Magento and Shopify — accurate data, better attribution, full privacy compliance.