Multi-currency accounting tracks holdings and transactions in more than one currency. This includes foreign currencies, cryptocurrencies, and investment securities — anything denominated in a unit different from your base reporting currency.
Core concepts
- Operating currency: the currency you report in and think in — usually the currency of the country where you live and pay taxes.
- Cost basis: the amount you paid for a holding in your operating currency at the time of acquisition. This is what matters for tax purposes.
- Market value: the current value of a holding at today’s exchange rate or price. The difference between cost basis and market value is unrealized gain or loss.
- Realized gain/loss: when you sell or convert a holding, the difference between the proceeds and the cost basis becomes a realized gain or loss.
In Beancount
Beancount handles multi-currency natively. Each account is opened with a list of allowed currencies:
2024-01-01 open Assets:Bank:EuroAccount EUR
2024-01-01 open Assets:Crypto:Bitcoin BTC
Transactions that convert between currencies use the @ (total cost) or
@@ (per-unit cost) syntax:
2025-03-01 * "Buy euros"
Assets:Bank:EuroAccount 500.00 EUR @@ 540.00 USD
Assets:Bank:Checking -540.00 USD
Price directives track market values over time:
2025-03-01 price EUR 1.08 USD
2025-03-01 price BTC 65000.00 USD
Practical considerations
- Reconcile in the native currency. Your euro bank statement is in euros; reconcile in euros. Currency conversion affects reporting, not reconciliation.
- Track cost basis carefully. When you sell or convert, Beancount uses the recorded cost basis. If the basis is wrong, gains and losses will be wrong.
- Exchange rate sources. Use consistent sources for exchange rates. Beancount supports price feeds that can automate this.
- Tax implications. Currency conversions and crypto transactions may be taxable events. The ledger should record enough detail to compute gains.