Overview
Multi-currency support lets you invoice clients, record expenses, and hold bank balances in currencies other than your base currency. If you work with international clients or suppliers, or hold a foreign currency bank account (such as a Revolut EUR wallet), Beeswax handles the exchange rate lookups, currency conversions, and gain/loss calculations for you.
Your base currency is determined by your account region (e.g. GBP for UK accounts, AUD for Australian accounts, EUR for European accounts, USD otherwise). All reporting and general ledger entries are recorded in your base currency, whilst invoices and expenses can be created in any supported currency.
Key characteristics:
- Automatic exchange rates — Rates are fetched daily from Open Exchange Rates (mid-market rates). No manual data entry required.
- Weighted average cost — Foreign currency bank accounts track a running weighted average cost, so gains and losses are calculated fairly.
- Realised FX gains and losses — When you transfer money between currencies, any gain or loss is calculated and posted automatically.
- Xero-compatible — Foreign currency invoices and expenses sync to Xero with the correct CurrencyCode. FX gain/loss entries stay in Beeswax only (Xero calculates its own).
For Beginners: Understanding Multi-Currency
What is an exchange rate?
An exchange rate tells you how much one currency is worth in another. For example, if the EUR/GBP rate is 0.8550, that means 1 euro is worth about 85.5 pence. Rates change constantly based on global markets.
Why does currency matter for my business?
If you invoice a French client in euros but your business reports in pounds sterling, you need to convert that euro amount into pounds for your accounts. The exchange rate on the day you create the invoice determines how much that invoice is "worth" in your books.
What happens when I invoice in a different currency?
Your client sees the invoice in their currency (e.g. EUR 5,000), but your general ledger records the equivalent in your base currency (e.g. GBP 4,275). Beeswax handles this conversion automatically using the exchange rate on the invoice date.
Think of it like units of measurement
Imagine you sell timber by the metre to a client who measures in feet. The physical quantity is the same — you just express it differently depending on who is looking. Multi-currency works the same way: the underlying economic value is the same, but it is expressed in different currencies for different audiences.
Getting Started
Setting up multi-currency takes just a few steps:
Step 1: Create a foreign currency bank account
Go to Bank Accounts (from the sidebar menu) and click New Bank Account. Set the Currency field to the foreign currency (e.g. EUR). This might be your Revolut EUR wallet, a Wise USD account, or any bank account that holds a non-base currency.
Step 2: Beeswax enables the currency automatically
When you save a bank account with a foreign currency code, Beeswax automatically:
- Creates a currency record for that currency
- Seeds the "Realised Currency Gains" and "Unrealised Currency Gains" system accounts in your chart of accounts
You do not need to configure anything else.
Step 3: Create an invoice in that currency
When creating or editing an invoice, select the foreign currency from the Currency dropdown. Beeswax will:
- Fetch the exchange rate for the invoice date
- Display the rate so you can review or override it
- Show the base currency equivalent total
- Automatically set tax to zero (as international invoices are typically zero-rated or subject to reverse charge)
Step 4: The exchange rate is fetched automatically
Exchange rates are fetched daily from Open Exchange Rates. When you create a foreign currency invoice, the rate for that date is looked up automatically. If no rate exists for the exact date (e.g. weekends or bank holidays), the most recent prior rate is used.
You can override the rate manually if you have a specific contractual rate.
For Business Owners: The Complete Workflow
Here is a detailed, real-world example showing how multi-currency flows through your accounts from start to finish.
The scenario
- Your company: Acme Consulting Ltd, based in the UK. Base currency: GBP.
- Your client: Societe Francaise SARL, based in France. Invoiced in EUR.
- You hold: A Revolut EUR wallet (set up as a bank account in Beeswax with currency EUR).
a) Creating the EUR invoice
You create an invoice for consulting services:
| Detail | Value |
|---|---|
| Client | Societe Francaise SARL |
| Amount | EUR 5,000 |
| Date | 1 March 2026 |
| Exchange rate (1 EUR = x GBP) | 0.8550 |
| Base currency equivalent | GBP 4,275.00 |
| VAT | Zero-rated (reverse charge — international B2B supply) |
What Beeswax records:
- The invoice displays EUR 5,000 (this is what your client sees and pays)
- The general ledger records GBP 4,275.00 (this is what appears in your UK accounts)
- Trade Debtors: GBP 4,275.00 debit
- Revenue: GBP 4,275.00 credit
- No VAT entry (zero-rated export of services)
The exchange rate is locked at the invoice date. Even if the rate changes tomorrow, this invoice remains valued at 0.8550.
b) Client pays into your EUR Revolut wallet
On 15 March, your client pays EUR 5,000 into your Revolut EUR account.
- The money stays in euros — no conversion happens at this point
- Your Revolut EUR balance increases by EUR 5,000
- Beeswax records the payment and marks the invoice as paid
- The bank account's cost pool is updated: EUR 5,000 came in, and at the current rate it is worth a certain amount in GBP
The cost pool tracks how much your euros "cost" you in GBP terms. This becomes important later when you convert euros back to pounds.
c) You use the euros to pay a French supplier
On 20 March, you pay EUR 2,000 to a French supplier from your Revolut EUR wallet.
- No currency conversion happens — EUR leaves your EUR account
- Your Revolut EUR balance decreases by EUR 2,000
- The expense is recorded in EUR with a GBP equivalent
- The cost pool decreases proportionally
d) You transfer some euros to pounds
On 5 April, you decide to transfer EUR 2,000 from Revolut EUR to your HSBC GBP account.
| Detail | Value |
|---|---|
| From account | Revolut EUR |
| To account | HSBC GBP |
| Amount leaving Revolut | EUR 2,000 |
| Revolut conversion rate | 0.8700 |
| Amount arriving in HSBC | GBP 1,740 |
Now the FX gain/loss calculation:
- The weighted average cost of your EUR holdings was 0.8600 (a blend of all the rates at which euros entered your account)
- Cost basis of EUR 2,000: 2,000 x 0.8600 = GBP 1,720
- You actually received: GBP 1,740
- FX gain: GBP 20 (you got more pounds than the euros "cost" you)
Beeswax automatically creates an FX Gain journal entry for GBP 20, posting it to the "Realised Currency Gains" account.
e) Period-end reporting
At the end of the period:
- Your balance sheet shows the remaining EUR balance converted at the current rate
- Your profit and loss shows the GBP 20 realised FX gain as income
- All reports are in GBP — your base currency
- The EUR bank account shows both the foreign balance (in EUR) and the base currency equivalent (in GBP)
For Accountants: Technical Accounting Details
Double-entry mechanics
Every foreign currency transaction creates entries in two "layers":
| Column | Purpose | Used for |
|---|---|---|
debit / credit |
Base currency amounts | General ledger, reports, P&L, balance sheet |
foreign_debit / foreign_credit |
Document currency amounts | Invoice display, client-facing documents |
For base currency transactions, both sets of columns hold the same values. For foreign currency transactions, the foreign columns hold the original amounts and the base columns hold the converted equivalents.
The exchange rate is stored on the journal entry and locked at the invoice/expense date. All line item transactions are converted using this single rate.
Weighted average cost method
When you hold a foreign currency bank account, Beeswax tracks a weighted average cost to determine how much your foreign currency "cost" in base currency terms.
Why weighted average? Unlike FIFO (first in, first out), which tracks individual lots of currency, weighted average blends all inflows into a single average rate. This is simpler, widely accepted, and avoids the complexity of tracking which specific euros you are spending.
How the cost pool works:
Each foreign currency bank account maintains two running totals:
- Foreign balance — how much foreign currency you hold (e.g. EUR 3,000)
- Base cost pool — how much that foreign currency cost in your base currency (e.g. GBP 2,580)
The weighted average rate = base cost pool / foreign balance (e.g. 2,580 / 3,000 = 0.8600)
On inflows (e.g. client pays into your EUR account):
- Foreign balance increases by the foreign amount
- Base cost pool increases by the base currency equivalent at the transaction rate
- The average rate shifts accordingly
On outflows (e.g. you pay a supplier or transfer to GBP):
- Foreign balance decreases by the foreign amount
- Base cost pool decreases proportionally (same percentage as the balance decrease)
- The average rate stays the same after an outflow (since both numerator and denominator decrease by the same proportion)
Realised FX gains and losses
Realised FX gains or losses occur when you transfer money between accounts denominated in different currencies. They represent the difference between:
- What you received in base currency (the actual conversion amount)
- What the foreign currency cost you (based on the weighted average)
Formula: FX gain/loss = received in base currency - cost at weighted average
- Positive = gain (you got more base currency than expected)
- Negative = loss (you got less)
These entries are automatically posted to the Realised Currency Gains system account (an income account). Losses appear as debits to this account.
FX gain/loss entries are not synced to Xero. Each system (Beeswax and Xero) calculates its own realised gains independently, as they may use different methods or timing.
Exchange rate source
- Provider: Open Exchange Rates API (mid-market rates)
- Frequency: Fetched daily via a background job
- Fallback: If no rate exists for a specific date (weekends, bank holidays), the most recent prior rate is used
- Override: You can manually enter a rate on any invoice or expense if you have a contractual or agreed rate
- Storage: Rates are stored as currency pairs with 10 decimal places of precision
- Cross-rates: If a direct rate is not available, Beeswax calculates a cross-rate via USD (e.g. EUR to GBP via EUR/USD and USD/GBP)
Xero sync
- Invoices and expenses sync to Xero with the correct
CurrencyCode - The currency is matched to the Xero contact's default currency
- FX gain/loss journal entries (flagged as
fx_generated) are excluded from Xero sync - Each system calculates its own FX gains independently — this avoids double-counting
VAT and International Invoicing
How VAT works with foreign currency invoices depends on the nature of the supply and the location of your client.
Common scenarios (for UK businesses)
| Scenario | VAT treatment |
|---|---|
| UK to UK client | Standard VAT applies (even if invoiced in a foreign currency) |
| UK to EU client (B2B) | Reverse charge — no UK VAT. Client accounts for local VAT. |
| UK to non-EU client | Zero-rated export of services |
What Beeswax does automatically
When you select a foreign currency on an invoice, Beeswax automatically sets the tax code to "No Tax" (zero-rated). This is the correct treatment for most international B2B invoices.
You can override this if needed — for example, if you are invoicing a UK client in EUR (perhaps they prefer to pay in euros), you may still need to charge UK VAT.
What to include on the invoice
For reverse charge invoices to EU clients, you should include wording such as:
"Reverse charge: Customer to account for VAT under the reverse charge mechanism"
Beeswax does not add this text automatically — you should include it in the invoice description or notes.
Bank Transfers Between Currencies
When you create a bank transfer between accounts that hold different currencies, Beeswax handles it as a cross-currency transfer.
How it works
- Select the source and destination accounts — the system detects they have different currencies
- Enter both amounts — the amount leaving the source account (in its currency) and the amount arriving in the destination account (in its currency)
- Effective rate — calculated automatically from the two amounts (to amount / from amount)
- FX gain/loss — calculated by comparing what you received in base currency terms against the weighted average cost of the foreign currency you spent
Example
| Detail | Value |
|---|---|
| From | Revolut EUR: EUR 1,000 |
| To | HSBC GBP: GBP 870 |
| Effective rate | 0.8700 |
| Weighted average cost of EUR | 0.8550 |
| Cost basis | EUR 1,000 x 0.8550 = GBP 855 |
| FX gain | GBP 870 - GBP 855 = GBP 15 |
The GBP 15 gain is posted automatically to the Realised Currency Gains account.
When gains/losses are realised
FX gains and losses are only realised (i.e. posted to the ledger) when a cross-currency bank transfer occurs. Simply holding a foreign currency balance does not create any realised gain or loss — that would be an unrealised gain or loss, which is a future enhancement for period-end revaluation.
FAQ
Can I change the currency of an existing invoice?
Yes, provided the invoice has not been paid. You can change the currency on draft or finalised invoices. The exchange rate will be re-fetched for the invoice date, and all line items will be recalculated.
What if the exchange rate changes after I create the invoice?
The rate is locked at the invoice date and does not change. This is standard accounting practice — the rate reflects the economic reality at the time of the transaction.
Can I have multiple bank accounts in the same currency?
Yes. You can have as many EUR, USD, or other currency accounts as you need. Each tracks its own weighted average cost pool independently.
What about unrealised FX gains?
Unrealised FX gains and losses (from revaluing foreign currency balances at period-end) are a future feature. The system accounts for this are already created ("Unrealised Currency Gains"), but period-end revaluation is not yet automated.
Do I need to manually enter exchange rates?
No. Rates are fetched automatically from Open Exchange Rates every day. You only need to enter a rate manually if you have a specific contractual rate that differs from the market rate.
Can I use this for cryptocurrency?
No. Multi-currency supports fiat currencies only (e.g. GBP, EUR, USD, AUD, JPY). Cryptocurrency is not supported.
Which currencies are supported?
Beeswax supports 20 common currencies out of the box (AUD, GBP, USD, EUR, NZD, CAD, CHF, JPY, SGD, HKD, SEK, NOK, DKK, ZAR, INR, MYR, PHP, THB, AED, SAR). Additional currencies can be added on request.
What happens if the exchange rate API is unavailable?
If the daily rate fetch fails, Beeswax falls back to the most recent available rate. If you create an invoice and no rate can be found at all, you will need to enter the rate manually.