If your e-commerce app operates in more than one country, you have a multi-currency problem. A purchase of 9,800 JPY and a purchase of $89.99 USD are roughly the same value, but your analytics dashboard needs to know that. Without proper currency normalization, your revenue reports are a mix of incompatible numbers. Summing them is meaningless.
This article covers the technical and practical challenges of multi-currency analytics: why you need a base currency, how exchange rates work, the edge cases that break naive implementations, and how to build reporting that gives you accurate cross-market revenue data.
For e-commerce analytics fundamentals, see e-commerce analytics with deep links. For SDK integration details, see the e-commerce API reference.
The Core Problem
Consider a simple scenario. Your app sells in three markets:
| Market | Currency | Example Transaction |
|---|---|---|
| United States | USD | $89.99 |
| Japan | JPY | 9,800 |
| United Kingdom | GBP | 72.50 |
If you sum these raw amounts (89.99 + 9,800 + 72.50 = 9,962.49), you get a number that means nothing. You cannot compare revenue across markets, calculate global average order value, or rank your top customers by lifetime spend without converting everything to a common denominator.
This is the base currency problem, and it affects every metric that involves money: revenue, AOV, LTV, refund rates, cart values, and cost per acquisition.
Choosing a Base Currency
Your base currency is the single currency in which all revenue is reported. Every transaction in a foreign currency gets converted to this base before it enters your analytics.
Most companies choose one of:
- USD (most common for global businesses, widely understood)
- EUR (common for European companies)
- Their home currency (whatever currency the business uses for financial reporting)
The choice matters less than consistency. Pick one and stick with it. Changing your base currency later means reprocessing every historical transaction.
One consideration: choose a currency with relatively low volatility. USD and EUR are standard choices because exchange rate data is abundant and the currencies are stable. If your base currency is a volatile one, your historical revenue trends will show fluctuations that have nothing to do with your actual business performance.
Exchange Rate Sources
To convert currencies, you need exchange rate data. The quality of this data directly affects the accuracy of your revenue reporting.
Common Sources
| Source | Update Frequency | Currencies | Notes |
|---|---|---|---|
| Open Exchange Rates | Hourly | 170+ | Popular API, reasonable pricing |
| European Central Bank | Daily | ~33 | Free, but limited currency coverage |
| Bank of Canada | Daily | 26 | Free, limited to major currencies |
| Fixer.io | Hourly (paid) | 170+ | Backed by ECB data |
| CurrencyLayer | Hourly (paid) | 168 | REST API, historical rates available |
For analytics purposes (not financial transactions), hourly updates are sufficient. You are not executing trades; you are normalizing data for reporting. A few hours of exchange rate lag will not materially affect your aggregate metrics.
Rate Freshness vs. Accuracy
There is a trade-off between how frequently you update rates and how accurate your reporting is. For most e-commerce analytics:
- Hourly updates give you good accuracy without excessive API calls
- Daily updates are acceptable if you are processing events in batch
- Real-time rates are unnecessary for analytics (save those for payment processing)
The difference between an hourly and real-time rate is typically less than 0.1% for major currency pairs. Over thousands of transactions, this washes out.
Zero-Decimal Currencies
Not all currencies have decimal subunits. This is a common source of bugs in multi-currency systems.
The ISO 4217 standard defines three categories:
| Type | Examples | Smallest Unit | How to Store |
|---|---|---|---|
| Two-decimal | USD, EUR, GBP | 0.01 (cent, penny) | Amount in minor units (e.g., 8999 = $89.99) |
| Zero-decimal | JPY, KRW, VND | 1 (yen, won, dong) | Amount as-is (e.g., 9800 = 9,800) |
| Three-decimal | BHD, KWD, OMR | 0.001 | Amount in minor units (e.g., 89990 = 89.990) |
If your system assumes every currency has two decimal places, a 9,800 JPY purchase becomes 98.00 JPY (off by a factor of 100). This is a common and costly bug.
Stripe's currency documentation provides a reliable list of zero-decimal currencies. If you are building your own system, use it as a reference.
Handling in Practice
The safest approach is to store amounts in the currency's smallest unit and include metadata about the currency's decimal places:
Event: purchase
Amount: 9800
Currency: JPY
Decimal places: 0
Converted amount (USD): 67.23
When your analytics system receives this event, it knows that 9800 JPY means 9,800 yen (not 98.00 yen) and can convert correctly.
Normalization at Ingestion vs. Query Time
There are two approaches to currency conversion in analytics, and they have very different trade-offs.
Ingestion-Time Conversion
Convert every transaction to the base currency when the event is received. Store both the original amount/currency and the converted amount.
Advantages:
- Queries are fast (no conversion math at query time)
- Reports are consistent (everyone sees the same numbers)
- Aggregations work without extra logic
Disadvantages:
- Historical data uses the exchange rate at the time of ingestion
- Cannot retroactively adjust for rate changes
- If you change your base currency, you must reprocess everything
Query-Time Conversion
Store transactions in their original currency. Convert to the base currency when generating reports.
Advantages:
- Can apply current exchange rates to historical data
- Changing the base currency is trivial
- Original data is always preserved
Disadvantages:
- Queries are slower (conversion on every row)
- Reports may show different numbers depending on when you run them
- Aggregation queries become more complex
The Practical Choice
Most analytics platforms use ingestion-time conversion. The performance and consistency benefits outweigh the flexibility of query-time conversion. If exchange rates shift significantly, you can always reprocess historical data in batch.
Tolinku uses ingestion-time conversion. When an e-commerce event arrives with a currency different from the Appspace's configured base currency, the amount is converted using the most recent exchange rate from Open Exchange Rates (updated hourly). Both the original amount/currency and the converted amount are stored, so you never lose the raw data. The platform supports over 200 currencies, including all zero-decimal currencies defined by ISO 4217.
For configuration details, see the e-commerce analytics documentation.
Revenue in Reports
Once transactions are normalized, your reports can answer questions that are impossible with raw multi-currency data:
Global Metrics
| Metric | What It Tells You |
|---|---|
| Total revenue (base currency) | Actual business performance across all markets |
| AOV by market | How purchase sizes differ across countries |
| Revenue per deep link click | Which links generate the most value, globally |
| LTV by acquisition channel | Long-term value of users acquired through different channels |
Market Comparison
Normalized revenue lets you compare markets directly:
US Market: $234,500 (revenue) | $87.20 (AOV) | 2,689 orders
UK Market: $198,200 (revenue) | $94.10 (AOV) | 2,106 orders
Japan Market: $156,800 (revenue) | $62.40 (AOV) | 2,513 orders
All values in USD. Now you can see that the UK market has the highest AOV, the US has the most orders, and Japan has the most orders per revenue dollar. These comparisons are impossible without normalization.
Cohort Analysis Across Markets
Cohort LTV analysis becomes particularly powerful with normalized currency. You can compare the 90-day LTV of users acquired through a Japan-targeted Instagram campaign against a US-targeted email campaign, with both values in the same currency. This drives budget allocation decisions.
Currency in Product-Level Analytics
Product analytics across markets introduce additional complexity. The same product may be priced differently in different currencies, and those prices may not move in lockstep with exchange rates.
For example, a product might cost $49.99 in the US and 5,980 JPY in Japan. At current exchange rates, 5,980 JPY might be $41.00, not $49.99. This is a deliberate pricing decision (market-specific pricing), not a currency conversion issue.
When analyzing product performance across markets:
- Use local prices when analyzing pricing strategy and price sensitivity per market
- Use converted prices when calculating global revenue contribution and cross-market comparisons
- Track both so you can answer either type of question
If you are using Tolinku's e-commerce event tracking, the SDK sends both the original currency/amount and item-level data, so product-level analytics work correctly regardless of currency.
Best Practices for International E-Commerce Analytics
1. Set Your Base Currency Early
Do this before you start collecting data. Changing it later is possible but requires reprocessing.
2. Always Store Original Currency and Amount
Never discard the original transaction data. You will need it for:
- Financial reconciliation
- Tax reporting by jurisdiction
- Debugging conversion issues
- Reprocessing if exchange rate data was incorrect
3. Use ISO 4217 Currency Codes
Always use three-letter codes (USD, EUR, JPY), not symbols ($, which is ambiguous across AUD, CAD, SGD, etc.) or country names. The ISO 4217 standard exists for exactly this reason.
4. Handle Edge Cases
Build explicit handling for:
- Zero-decimal currencies (JPY, KRW, VND, and others)
- Three-decimal currencies (BHD, KWD, OMR)
- Unknown or unsupported currencies (reject gracefully, do not default to USD)
- Missing exchange rates (queue the event for reprocessing rather than dropping it)
5. Monitor Exchange Rate Data Quality
Set up alerts for:
- Exchange rate updates failing (API downtime)
- Rates that deviate significantly from the previous update (data quality issue)
- Gaps in rate history (missing data points)
6. Document Your Conversion Methodology
Make it clear in your reports:
- What base currency is used
- When exchange rates are applied (ingestion time or query time)
- What exchange rate source is used
- How frequently rates are updated
This prevents confusion when stakeholders in different countries see revenue figures that do not match their local numbers.
7. Consider Seasonal Rate Volatility
Exchange rates fluctuate, and those fluctuations can create misleading trends in your revenue data. A 5% decline in the Japanese yen will make your Japan revenue appear to drop 5% in USD terms, even if local sales are flat.
For executive reporting, consider showing both:
- Revenue in base currency (actual financial impact)
- Revenue in local currency (operational performance)
This separates business performance from currency effects.
Conclusion
Multi-currency analytics is not optional for international e-commerce. Without proper normalization, your revenue data is unreliable and your cross-market comparisons are invalid.
The key decisions are: pick a base currency, choose a reliable exchange rate source, convert at ingestion time, and always preserve the original transaction data. Handle zero-decimal currencies correctly from day one, because retroactively fixing that bug is painful.
Tolinku's e-commerce analytics handles currency normalization automatically across 200+ currencies, so you can focus on what the numbers mean rather than how to make them comparable. For setup details, see the e-commerce analytics guide.
Get deep linking tips in your inbox
One email per week. No spam.