Multi-Currency

How to work with multiple currencies in Beeswax — invoicing in foreign currencies, bank transfers, and exchange rates

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

  1. Select the source and destination accounts — the system detects they have different currencies
  2. Enter both amounts — the amount leaving the source account (in its currency) and the amount arriving in the destination account (in its currency)
  3. Effective rate — calculated automatically from the two amounts (to amount / from amount)
  4. 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.