If you have your display currency set to EUR, GBP, or any of the other non-USD options, you might notice that the displayed value of an old transaction — or your portfolio's overall value — drifts slightly day to day even when nothing about your stack has changed.
You haven't bought or sold; spot might not even have moved much, and yet the headline number is a few currency units different from what you saw yesterday. This article is the read on why.
The short answer
Your data is stored in USD. The displayed non-USD value is a live translation through the FX feed. When FX moves, the displayed value moves — even though the stored USD value is sitting perfectly still. That's true for historical transactions, current holdings, portfolio totals, and report cards alike.
If you change your display currency back and forth and notice the numbers don't return exactly to where they were, that's the same effect: the second pass uses a fresher FX rate than the first.
A worked example
Pick a single transaction — say, a 1 oz American Gold Buffalo you recorded in January 2024 at a total of $3,290 USD. That number is stored once and never moves.
At the time of the purchase: Live USD-to-EUR was around 0.92. Displayed value in EUR: $3,290 × 0.92 = €3,026.80.
Three months later: USD-to-EUR has moved to 0.90. Displayed value in EUR for the same transaction: $3,290 × 0.90 = €2,961.00.
A year later: USD-to-EUR is 0.88. Displayed value: $3,290 × 0.88 = €2,895.20.
You switch to GBP and back to EUR within a week, and the rate has moved to 0.89: Displayed value: $3,290 × 0.89 = €2,928.10.
The transaction has not been edited. The USD figure stored in the database is $3,290.00, full stop. What's drifting is the translation, and the translation drifts because the FX market drifts.
Why this happens
Three things have to be true at once for the effect to appear, and they all are:
Data is stored in USD, not in the display currency. See [How currency conversion works].
FX rates move continuously during market hours. See How often FX rates update.
The conversion happens at render time, using the live FX rate at that moment. Every page load fetches a fresh translation.
If any one of those weren't true, the effect would disappear. If we stored values in the display currency, switching display currency would produce a fixed translation locked at the moment of conversion. If FX never moved, the translation factor would be a constant.
If we cached the converted values rather than re-rendering them, you'd see snapshots rather than live numbers. We don't do any of those things, because each would introduce a different kind of distortion — a worse one than the FX drift.
What's actually moving — and what isn't
Worth being precise about which numbers shift and which stay anchored.
Stored USD values: Locked. Your transaction's spot-at-time, price per unit, premium, and total are all USD figures recorded at the moment you saved the transaction. They never move.
Displayed non-USD values: Move continuously with the FX feed. Every render is a fresh calculation against the latest rate.
Underlying cost basis: Stable, in USD. Your USD cost basis for an item is what you paid in USD at purchase time. It doesn't drift.
Current portfolio value in USD: Moves with spot, not with FX (there's no FX involved when display is USD).
Current portfolio value in non-USD: Moves with both spot and FX. Two sources of motion, applied on top of each other.
So a user on USD display sees their portfolio value move with spot only. A user on EUR display sees it move with spot and the USD/EUR rate, which is why the EUR figure can drift on quiet days when spot has barely moved.
When you'll notice it most
The shift is small in normal market conditions — fractions of a percent over an ordinary trading day — and most users won't see it without looking. A few situations where it becomes visible:
Looking at a single old transaction across visits: The most direct exposure. Open the transaction Monday and again Friday; if FX has moved, the displayed total has moved with it.
Around major central-bank announcements or geopolitical events: FX can move by half a percent or more in a few hours during these windows. Your portfolio's non-USD display value can tick visibly across the same window.
Switching display currency and then switching back: If a few minutes pass between switches and FX has refreshed, the round-trip won't be quite identical. Usually a difference of pennies; rarely more.
Comparing the same report at two points in time: An Annual Report generated last month in GBP will show slightly different numbers if you regenerate it today, even with no new transactions. See below.
In quiet conditions and over short periods, you'd have to be looking to notice. In active markets or over months, the drift accumulates into something you'd see if you compared screenshots.
Reports generated at different times
This one comes up specifically for users handling tax filings or year-end records.
If you generated an Annual Report in EUR last month and you regenerate it in EUR today, the headline cards — Total Proceeds, Total Cost Basis, Short-Term G/L, Long-Term G/L — will be slightly different even though the underlying transactions haven't changed.
The reason is the same FX drift: every value in the report is the stored USD figure times the current EUR rate, and the current EUR rate today isn't quite the current EUR rate last month.
In practice, two implications:
Pick a version and stick with it for any given filing. A PDF carries a Generated [date] timestamp; whichever PDF you handed to your tax advisor is the version that matters, not whatever the page shows next time you regenerate.
The underlying USD record never changes. If a tax advisor needs the precise figures and the FX context, they can work from the USD-denominated CSV exports of your transactions, which don't carry the drift at all. See [Exporting your transactions as CSV] and [Exporting your holdings as CSV].
Why we let it happen rather than freezing FX
Pinning an FX rate at the moment of each transaction and never updating it would make individual transactions look stable across visits — but it would silently break a lot of other things.
Current portfolio value would be wrong: Live FX is the right rate for a value that's supposed to represent what your stack is worth right now. Frozen FX from years ago wouldn't.
Different transactions in the same portfolio would mix old and new rates: A coin bought in 2024 would render at the 2024 EUR rate; a coin bought today at the live rate. The totals wouldn't be coherent.
Switching display currency would produce stale-looking outputs: A user moving from USD to EUR would get a number reflecting last year's FX environment rather than today's.
Compare-to-USD would constantly be off: A USD user and an EUR user looking at the same portfolio would see two inconsistent stories, with neither matching the live market.
Live, render-time FX is the right model for a portfolio tracker. The cost is the slight drift we're describing in this article; the benefit is that every number you see is current to today's market across both axes — spot and FX.
Where to go next
How currency conversion works: The storage-vs-display model that makes the drift possible (and bounded).
How often FX rates update: The five-minute cadence that drives the shifts.
Choosing your display currency: The setting at the centre of it all.
The 15 supported display currencies: What's on the list and the pegged exceptions.
Exporting your transactions as CSV: USD-only export for users who need a drift-free record.
