If you use a multi-currency budgeting app, every number you see depends on an exchange rate. Your total spending, your budget progress, your net worth across countries. Get the rate wrong and everything downstream is wrong too.
Most apps don't tell you where their rates come from. Some reference an unnamed "open exchange rates service." Others don't mention it at all. You're trusting numbers that affect real financial decisions, and you can't verify the source.
This post explains exactly how Borderless Budget calculates exchange rates. Where the data comes from, how cross-currency conversions work, what happens on weekends, and why we made each decision.
Two data sources, one goal
Borderless Budget pulls exchange rates from two providers, each serving a different purpose.
Primary: the European Central Bank. The ECB publishes reference rates for 32 currencies every working day at around 16:00 CET.1 All rates are expressed relative to the euro: 1 EUR = X of the target currency. These cover the major world currencies that most expats deal with: USD, GBP, CHF, JPY, AUD, CAD, and others.
Secondary: ExchangeRate-API. For currencies the ECB doesn't cover, we pull from ExchangeRate-API's open-access endpoint, which provides rates for approximately 168 currencies using USD as the base.2 This covers currencies like the Thai baht, Mexican peso, Brazilian real, and many others that expats and digital nomads encounter regularly.
The two providers complement each other. ECB rates are the first choice for any currency they publish, since they come from a central bank with no commercial interest in the rate. ExchangeRate-API fills in the gaps, extending coverage from 32 currencies to over 160. When both providers have a rate for the same currency, the ECB rate takes priority.
Why central bank rates?
ECB reference rates are not transaction rates.3 That's an important distinction. They represent a snapshot of market conditions at a specific time. Your bank might charge you slightly more or less depending on its own markup. But as a baseline for budgeting, central bank reference rates have three properties that matter:
- Transparent. Anyone can look up the rate on the ECB website and verify it.
- Free of markup. There's no spread, no proprietary adjustment. The rate is what it is.
- Consistent. The same rate is used by financial institutions and companies across Europe as a benchmark. You're comparing against a widely accepted reference point.
For budgeting purposes, you don't need the exact rate your bank charged on Tuesday at 2:47 PM. You need a reliable daily rate that lets you track spending trends, compare months, and understand where your money goes. Central bank reference rates are built for exactly that.
Cross-rate triangulation
ECB rates are all relative to the euro. You get EUR-to-USD, EUR-to-GBP, EUR-to-JPY. But what if you need USD-to-GBP? The ECB doesn't publish that directly.
This is where cross-rate triangulation comes in. When direct quotes between two currencies aren't available, the rate is derived through a third currency - a standard practice in foreign exchange markets.4 In our case, the euro serves as that intermediary.
Here's a concrete example. Say you spent $100 on a flight while visiting the US, and your home currency is GBP. The ECB publishes:
- EUR-to-USD: 1.09 (1 euro = 1.09 US dollars)
- EUR-to-GBP: 0.84 (1 euro = 0.84 British pounds)
To convert USD to GBP, divide the target rate by the source rate:
USD-to-GBP = EUR-to-GBP / EUR-to-USD = 0.84 / 1.09 = 0.7706
So $100 USD converts to:
$100 x 0.7706 = £77.06
Every currency pair in the app derives from the same set of ECB-published rates, so you never get contradictory conversions. If you convert USD to GBP and then GBP back to USD, you get the original amount (minus rounding at the cent level).
The identity rule
Converting USD to USD returns the exact original amount. Always. No conversion happens, no rounding applies, no rate is fetched. The amount passes through unchanged.
This sounds obvious, but it matters because some implementations route every conversion through the same code path, including same-currency conversions. If the code multiplies by (rate / rate), floating-point arithmetic can introduce tiny discrepancies. In a budgeting app where $100.00 needs to remain exactly $100.00, we short-circuit before any math happens.
Weekends, holidays, and rate freshness
The ECB doesn't publish rates on weekends or EU public holidays. Foreign exchange markets are closed. So what happens when you log a transaction on a Saturday?
The app uses the most recent available rate. If today is Saturday, that means Friday's rate. It automatically falls back up to five previous days, which covers even long holiday weekends. For the typical expat's daily spending, the difference between Friday's rate and Monday's rate is negligible.
Both providers are checked daily on business days, and rates are stored for use across all conversions.
When a rate is missing
Between ECB and ExchangeRate-API, coverage extends to over 160 currencies. But if a currency pair can't be calculated from either source, the conversion returns null. The app shows "rate unavailable" rather than guessing.
It never silently substitutes a default like 0 or 1, because either of those would produce a wildly incorrect result. You'd rather see "unavailable" than see your £500 rent appear as $0 or $500 in your budget. A missing rate is inconvenient. A wrong rate is dangerous.
Precision and rounding
Exchange rates need more decimal places than you might expect. The EUR-to-USD rate might be 1.0856. The EUR-to-GBP rate might be 0.8421. When you divide these to get a cross-rate, small rounding errors can multiply across thousands of conversions.
All the intermediate math happens at full precision, and rounding only applies at the final step when you see the converted amount in the app. This prevents small errors from accumulating across many conversions.
Why this matters for your budget
Exchange rates are not a technical detail you can ignore. If you earn in dollars and spend 2,000 euros per month in daily expenses, a 2% shift in the EUR/USD rate changes your monthly cost by about $40. Over a year, that's roughly $480 in apparent spending changes that have nothing to do with your actual habits.
If your budgeting app uses rates from an unknown source that updates at unknown intervals, you can't distinguish between "I spent more this month" and "the exchange rate moved." Both look the same in your budget.
Borderless Budget uses transparent, verifiable rates so you can trust the numbers. You can see which provider supplied a rate and when it was last updated. And the spending analytics break down rate impact separately, so you always know whether your grocery bill went up because you bought more, or because the euro moved.
Join the waitlist for early access and 50% off launch pricing. There's a 30-day free trial.
Sources
- 1. The European Central Bank publishes euro foreign exchange reference rates for 32 currencies every working day at around 16:00 CET. Per ecb.europa.eu, "Euro foreign exchange reference rates", March 2026.
- 2. ExchangeRate-API provides free, open-access exchange rates for 168+ currencies, updated daily, using USD as the base currency. Per exchangerate-api.com, March 2026.
- 3. ECB reference rates are intended as a reference for the general public and are widely used by financial institutions and companies. They are not intended to represent rates at which transactions can be carried out. Per ecb.europa.eu, "ECB euro reference exchange rate methodology", March 2026.
- 4. Cross-rate calculation using a common reference currency is standard practice in foreign exchange. When direct quotes between two currencies are unavailable, the rate is derived through a third currency (typically EUR or USD). Per bis.org, "Triennial Central Bank Survey: Foreign exchange turnover", 2022.
Related reading: