Multi-Currency Airbnb Income in Xero

One booking, three exchange rates

Ask most hosts what exchange rate applies to a foreign-currency booking and you’ll get one answer. The correct answer is three, and almost every reconciliation headache in a multi-currency rental business comes from collapsing them into one.

Here’s a real shape. A guest agrees a price in EUR. Your business accounts in USD. Your Xero organisation’s base currency is KES. Nothing about that is exotic — it’s an ordinary situation for anyone letting property in one country, banking in another, and filing accounts in a third.

Three conversions are genuinely in play:

Conversion What it answers When it’s fixed
Agreed → ledger What is this booking worth in the currency I run my business in? At booking, then trued up at payment
Payment → realised What did I actually receive when the card cleared? At the moment of payment
Ledger → accounting What figure goes into Xero? At invoice time, at Xero’s rate

Software that offers you a single “currency” field is hiding two of those from you. That’s not simplification — it’s a silent decision about your books made by someone who never saw them.

The rate that must never be 1

Before the detail, the single most expensive mistake in this area.

When a system can’t find an exchange rate, there is a tempting fallback: use 1. The code runs, no error appears, and the number looks like a number.

For KES to USD that turns 15,000 into $15,000 instead of roughly $115. A 130-fold overstatement, presented with total confidence, that will flow into your revenue figures, your dashboard and your tax return.

The rule we hold ourselves to, and the one to demand of any tool: when a rate is unavailable, the correct behaviour is to fail, not to substitute 1. A booking with no resolvable rate should be excluded and counted as pending, not multiplied by one and added to a total. If you’re auditing your own setup, that’s the first thing to check — it’s invisible until it’s catastrophic.

Which rate goes on the guest invoice

The guest agreed a number. That number is the promise, and it shouldn’t move because a currency market moved.

So the guest-facing invoice shows the agreed currency and agreed total. If the card is charged in a different currency — because your processor won’t settle euros, which is common outside the eurozone — the guest should see the agreed price, the converted amount, and the rate between them. On the receipt, not just in your records.

The mistake to avoid is re-rating unpaid bookings daily. It sounds more accurate. In practice it rewrites every foreign-currency booking every morning, pokes your accounting sync each time, and means no figure on your dashboard is the same two days running. Fix the rate at payment and true it up when the payment confirms — then your books show money that genuinely arrived rather than an estimate from three months ago.

One consequence worth stating plainly: the outstanding balance is tracked in the agreed currency. The guest owes their agreed total minus what they’ve paid, in euros. Asking “what’s still owed” in your ledger currency is asking a question whose answer changes daily.

Which rate goes into Xero

This is the one people get wrong, because it feels like it should be the same rate.

It isn’t. Xero has its own base currency and its own moment of truth. The rate that converts your ledger figure into a Xero invoice is taken at invoice time, independently of whatever rate you used to charge the guest weeks earlier. That’s correct accounting behaviour, not a bug — the invoice records the transaction in your reporting currency at the date it’s raised.

Which means you should expect a difference between what the guest paid and what Xero shows, and that difference has a name: realised FX gain or loss. It belongs in its own account. If you find yourself editing invoice totals to make two numbers agree, you’re hiding an FX movement inside your revenue, and your margin will be quietly wrong all year.

The failure this causes if your base currency is blank

A short, real cautionary tale. An account connected Xero without its accounting currency ever being set. The code fell back to a default of USD. Xero replied, correctly, that the organisation is not subscribed to currency USD, and rejected every draft invoice.

Four invoices failed. The host wasn’t told. The retry ran every fifteen minutes and burned a credit per attempt. Everything looked fine from the outside.

Two things came out of that, and both are worth copying if you’re building this yourself. The base currency is now read from Xero’s own organisation record at the moment you connect, rather than guessed. And when it still isn’t known at invoice time, the system refuses and tells you, with a link to fix it, rather than defaulting to a currency and failing silently four times. We wrote up that whole episode in Thirty Emails, or One.

If you’re connecting Xero to anything, check its base currency first. It takes ten seconds and it’s the single most common cause of “my invoices just aren’t appearing”.

Reconciling a foreign payout

The last piece is the bank line, and multi-currency makes it worse than the usual mismatch.

An Airbnb payout in a foreign currency arrives having been through their conversion, not yours. So the amount hitting your bank will not equal your invoice total, and it will not equal the guest total either. Three separate reasons stack up:

  1. The host service fee was deducted before payout.
  2. Their exchange rate applied, at their timing.
  3. Your bank may have taken its own conversion or fee on receipt.

Trying to match a payout to a single invoice is therefore hopeless by construction. The workable approach is the one we set out in Why None of Your OTA Payouts Match Your Invoices: treat the payout as a settlement of several invoices, book the fee as an expense, and let the FX difference land in its own account rather than adjusting revenue.

A short checklist

If you run bookings in more than one currency and Xero is your ledger, work through this:

  • Xero’s base currency is set, and whatever feeds it knows what it is.
  • No rate ever falls back to 1 — unresolved rates are excluded and counted, not multiplied.
  • Rates come from a defined source with a fallback chain, cached, and recorded with the transaction. A rate you can’t reproduce later is a rate you can’t defend.
  • Guest invoices are in the agreed currency; the conversion is shown, not hidden.
  • Realised FX differences have their own account, and nobody is editing invoice totals to make lines agree.
  • The balance owed is tracked in the currency it was agreed in.

Get those six right and multi-currency stops being a monthly argument with your own spreadsheet.

Related: Multi-Currency, Made Simple for the model, Multi-Currency Is Breaking Your Spreadsheet for why manual doesn’t scale, and Quote in Their Currency, Bank in Yours for how Airflow implements it. Or read how the Xero sync works.