Direct answer

Direct answerSend in the Meta Pixel the numeric value and the ISO 4217 three-letter code of the currency in which the purchase was made (USD, BRL, EUR, etc). Meta doesn't automatically convert, so if you mix currencies without specifying which is which, your ROAS becomes a meaningless number. Use country-based reporting or separate pixels per currency to measure real performance.

Why does ROAS break with multiple currencies?

Because Meta Pixel adds values from different currencies as if they were the same. You sell 100 reals, 50 dollars, and 30 euros on the same day. Meta records 100 BRL + 50 USD + 30 EUR. In the report, it shows 180 as if it's a single currency. That's phantom ROAS.

Your Brazil buyer paid in reals because your product price is in reals. Your US buyer paid in dollars. The money hits different bank accounts with different fees, but Meta treats it as one addition. If you spend 50 dollars on ads and the system reports 180 in revenue mixing currencies together, you don't know if you made money or lost it, because you can't tell which part is which. If your pixel doesn't send the right currency, you're left without comparison. How to measure approval by country and currency is covered in approval by country with UTM Analytics, and you'll see the same currency problem appears there too.

What currency should the purchase event send?

The currency in which the transaction actually occurred, using ISO 4217 code. If your Mundpay checkout shows a price in dollars, the pixel sends USD. If it shows in reals, it sends BRL. If the buyer doesn't see a conversion, you shouldn't convert in the code.

ISO 4217 is the international standard. USD for US dollars, BRL for Brazilian real, EUR for euro, MXN for Mexican peso. The official Meta Pixel documentation requires this format for the currency parameter. When you implement the Purchase event, it looks like this:

fbq('track', 'Purchase', {currency: "USD", value: 30.00});

Or like this, if it's in Brazilian reals:

fbq('track', 'Purchase', {currency: "BRL", value: 150.00});

The numeric value is the second parameter. It's in reals or dollars depending on the currency code. This separation is what Meta needs to measure correctly afterward.

Does Conversions API change anything?

It doesn't change the logic, just the delivery method. If you use Conversions API instead of Meta Pixel in the browser, the same parameters apply. You still send currency and value with the original currency. The difference is that the API sends from your server to Meta, not from your customer's browser.

Conversions API is more common for checkout platforms that want to log the sale on their server for more control. The Conversions API parameters document specifies the same fields: currency in ISO 4217 and numeric value.

If you use both at the same time, watch out for duplication. Pixel tracks in the browser, API tracks on the server. Meta can count the same purchase twice if you don't disable one of them. Pick one path and keep the currency and value consistent in both.

How do I check the pixel value against my sales dashboard?

Use Meta Pixel Helper to see the event captured, then compare it with your Mundpay dashboard. Pixel Helper is a Chrome extension that shows every event your pixel fires in real time. Make a test purchase and open Pixel Helper.

  1. Test purchase: Use a test card from your payment processor. If you use Mundpay, create an order in your dashboard.
  2. Open Pixel Helper: Chrome extension that shows pixel events. Look at the Purchase event captured.
  3. Note value and currency: For example, {currency: USD, value: 49.99}.
  4. Go back to your Mundpay dashboard: Find that same sale. The value should be 49.99 USD if the event sent USD.
  5. If they don't match: The pixel might be sending the wrong currency or rounding the value. Check your implementation code.

If you sell to the US, Brazil, and Mexico from the same page, test from each country. Mundpay's checkout detects the visitor's IP and changes the displayed price. But the pixel only records what your code sends. Check that you're sending BRL from a Brazil IP and USD from a US IP, not hardcoded to one currency.

Users spend most of their time on other sites. This means that users prefer your site to work the same way as all the other sites they already know.

Jakob Nielsen Source: Nielsen Norman Group.

What's the difference between per-country pixel or one unified pixel?

One pixel with multiple currencies is simpler but less accurate. One pixel per country takes more work but gives you full control. Choose based on the size of your operation.

ApproachImplementationReportBest for
Single pixel with multiple currenciesSame pixel ID, values in different currenciesMixed number, needs conversion afterwardSmall operation or testing
Separate pixel per countryDifferent ID for each country, each in its own currencyClean report per country, consistent currencyScaled operation, multiple countries
Single pixel, conversion in Ads ManagerSame ID, multiple currencies, then convert on platformConverted to one base currency for comparisonWhen you need consolidation in one currency

The right implementation depends on where conversion happens. If you set all campaigns in USD and want results in USD, you can send converted values. But then you lose the original information of how much came in real or local currency. Better to send original currency and let Meta handle consolidation, if needed.

How do I avoid rounding errors in currency?

Pass the exact transaction value, without intermediate conversion. If your checkout charged 99.99 reals, send 99.99, not 100. Cent errors add up when you have many sales.

Wrong implementation:

let valueInDollars = valueInReals / 5; // approximate conversion
fbq('track', 'Purchase', {currency: "USD", value: valueInDollars});

Right implementation:

fbq('track', 'Purchase', {currency: "BRL", value: valueInReals});

When you pull the transaction value from your database, it already comes with the right currency. Pass it straight to the pixel without conversion. If you need to convert later for a consolidated report, do it in Ads Manager, not in your code.

When should I use Conversions API instead of pixel?

When your checkout runs on your own server or a platform that doesn't allow browser scripts. Conversions API sends the sale straight from your backend to Meta, without going through your customer's browser.

Cases that call for Conversions API:

  • Mobile app checkout: Apps don't run Meta Pixel scripts. Use the API.
  • CRM or ERP integration: You want to log in Meta data that's already in your system, without relying on a browser event.
  • Data protection: Some industries need more control over what data gets sent. API allows more validation before sending.
  • Deduplication: If you use both pixel and API, Meta offers event_id to avoid counting the same purchase twice.

Currency works the same in both. The Conversions API documentation asks for the same parameters: currency in ISO 4217 and numeric value. If you choose the API, get it right from the start because fixing it later is harder.

Your margin is my opportunity.

Jeff Bezos Source: attributed to the author in published interviews and profiles.

Where does Mundpay fit in measuring international ROAS?

Your sales dashboard is the single source of truth for what hit your bank account. When Meta's ROAS doesn't match the profit you see in your sales dashboard, start here: verify that your pixel is receiving the right value and currency, and compare with the dashboard. Check your sales dashboard to see if there's an export function for sales reports that lists dates, values, and status of each transaction. Download that report and cross-check with what Meta reports in your ads.

If the sale count matches but the currency is wrong, it's a pixel code problem, not the payment processor. If the count doesn't match, you're losing events in the tracking. In your payment platform's Help Center, you'll find instructions on how to set up your pixel and validate it's working.

In summary: Meta Pixel with multiple currencies

  • Send the original currency of the transaction in the pixel, using the three-letter ISO 4217 code (USD, BRL, EUR, etc).
  • Meta doesn't automatically convert, so values from different currencies get added together as if they're one, causing phantom ROAS.
  • Use Meta Pixel Helper to check that the event is sending the right currency, then compare against your sales dashboard.
  • For scaled operations with multiple countries, consider a separate pixel per country or consolidated conversion in Ads Manager.

Frequently asked questions

Does Meta automatically convert pixel value to dollars?

No. Meta Pixel records the value and currency exactly as you send it. If you send BRL, it stays as BRL in your report. Meta doesn't automatically convert to a single currency. The Ads Manager has a conversion option in reports, but the original tracking maintains the currency you passed.

Should I send the value in dollars or local currency?

Send it in the currency where the transaction actually occurred. If the buyer paid in Brazilian reals, send BRL. If they paid in dollars, send USD. This way, the pixel records exactly what hit your bank account, without intermediary conversions that cause rounding errors.

Why does ROAS break with multiple currencies?

Because Meta adds values from different currencies as if they were the same. If you have sales in BRL and USD on the same day, Meta might add 1000 BRL + 100 USD and show 1100, with no conversion. The result is phantom ROAS. The solution is measuring by country or running separate pixels per currency.

What currency format does Meta accept?

ISO 4217 three-letter codes. USD for US dollars, BRL for Brazilian real, EUR for euro, MXN for Mexican peso, etc. Check the complete list of valid codes before implementing so you don't make a typo.

How do I verify the pixel is sending the correct value?

Open Meta Pixel Helper in your browser, make a test purchase, and watch the events captured. The Purchase event should show the numeric value and the ISO currency code. Then compare in Ads Manager with the value that appears in your Mundpay sales dashboard.