· 6 min read
Preserve your bank’s real exchange rate — not a reference one.
Reference rates and bank rates almost never match. Most apps overwrite yours. BudgetLuma stores it, protects it, and reuses it — on purpose.
If you have ever travelled abroad with a debit card, opened your statement, and tried to reconcile it with a budgeting app, you already know the feeling: the app says you spent €12,08 at the ramen shop, the statement says €12,57, and nothing adds up cleanly. The app isn’t lying, exactly — it’s using a reference rate the moment you entered the transaction. Your bank used a different one.
Why reference rates aren’t enough
A reference rate is a public benchmark: the European Central Bank publishes one daily; Frankfurter (the provider BudgetLuma uses) republishes it and keeps history. It’s accurate — for what it measures — but it almost never matches what a bank or a card issuer applies. Banks add spreads, weekend markups, conversion fees and sometimes rounding tricks. Your effective rate is somewhere close to the reference, but rarely equal.
That means every time an app silently applies a reference rate, you end up with numbers that are right on paper and wrong in practice. The wallet total drifts from reality. By the time you check your statement, reconciliation feels hopeless.
What BudgetLuma actually stores
Every transaction in BudgetLuma persists six things:
- The amount you entered (e.g.,
1 850). - The currency you entered it in (e.g.,
JPY). - The converted amount in the wallet’s base currency.
- The exchange rate used.
- The rate source — one of
identity(no conversion),system(reference rate),custom(the rate you provided), orunknown_legacy(pre-provenance data). - The rate provider and fetch timestamp.
If you’re on Premium and you enter your real bank rate, that rate is what’s stored. Database-level triggers enforce that it doesn’t get silently overwritten on later edits — changing the rate requires an explicit “rate mode” choice. You can edit the amount all you want; the rate stays yours.
Where reference rates still apply
Custom rates aren’t the only rates in the product. BudgetLuma still refreshes reference rates hourly from Frankfurter — for 30 supported currencies, 870 currency pairs. They’re used in three places:
- At create time, if you don’t override the rate manually. Your transaction still stores the provider and timestamp, so you always know where the number came from.
- In cross-wallet views in Insights, when you look at combined totals across wallets whose base currencies differ. The combination has to use a common reference, so the UI explicitly labels it — “Combined across N wallets · reference rates” — and uses an “≈” prefix on aggregated numbers.
- In the display-currency override (also Premium), which lets you view a wallet or the Insights screen through a different currency lens, without touching the stored data.
The rule is simple: inside a wallet, your rate is the truth. Across wallets, reference rates are used, and the UI says so.
Why this matters more than it sounds
It’s not about being right by a few cents. It’s about trust. When a budgeting app silently rewrites a number you entered, you stop trusting the app. You start keeping parallel spreadsheets “just in case”. Or, more often, you quietly stop using it.
Preserving your bank rate — on purpose, by design — means you only have to reconcile once, at write time. Every later view of the transaction, every budget progress recalculation, every wallet total, is built on that single source of truth. No drift. No silent edits. No ambiguity about whose number it is.
The summary, one line
Reference rates are great for aggregation and public comparison. Bank rates are what you actually lived. BudgetLuma lets both coexist — without letting either pretend to be the other.