Import Airbnb Booking History into Xero

The question everyone asks second

The first question a host asks about accounting software is “will it handle my bookings going forward?” The second, about ten minutes later, is much harder:

“What about the two years I already have?”

You have a spreadsheet of past stays. You have an Airbnb calendar full of dates that are already sold. You may have a Xero file that’s been hand-keyed, half-keyed, or not keyed at all. And somewhere in there is a real question about whether your prior-year figures should change at all.

Most guides skip this because the honest answer is “it depends, and doing it wrong is worse than not doing it”. So here is the version nobody writes: what actually happens when you import historical bookings into an accounting workflow, what it can break, and the order that makes it safe.

The trap: 200 draft invoices dated today

Start with the failure mode, because it’s the reason the rest of this exists.

Booking systems that talk to accounting software generally run a background job: find every booking that has a value, has no invoice yet, and belongs to an account with accounting connected — then raise a draft invoice for it. That job is correct and useful for bookings that happen from now on.

Now import 200 historical stays straight into your bookings. Within the job’s next cycle — often fifteen minutes — you have 200 draft invoices in Xero, dated today, for stays from 2024 and 2025.

Every one of them is wrong in the same way. They land in the current period. They’ll distort this month’s revenue. They may cross a VAT period or a closed financial year. And deleting 200 drafts by hand in Xero is an afternoon you will never get back.

That isn’t a hypothetical. It’s the precise behaviour of the job that makes automated accounting work, applied to data it was never meant to see. If you take one thing from this article: historical bookings must not enter the invoicing path by the same door as new ones.

The safe order

Step 1: bring in the dates first, as blocks, not bookings

Before anything touches your books, get your sold dates protected. If you’re putting a booking widget on your own website, this is urgent — until the system knows which nights are already gone, it can double-book you on day one.

The right shape here is an availability block: a record that says “these nights are unavailable” and nothing more. A block creates no booking, no invoice, no guest email, and in Airflow costs no credits. It’s inert by design.

There are two doors:

  • An iCal feed from Airbnb, Booking.com, or a shared calendar. Paste the URL, and it syncs hourly.
  • A CSV or Google Sheet of your own records — the spreadsheet you’ve actually been keeping.

Use both. They know different things: a calendar feed knows dates and keeps them live; a spreadsheet knows the guest and the money. Whichever arrives first creates the block, and the other attaches to it rather than creating a duplicate over the same week.

Airbnb’s feed is unusually good for this, because its reservation events carry a confirmation code. That makes matching deterministic rather than a date-based guess, and it survives a guest moving their dates. Booking.com’s feed is the opposite — every event just says “not available”, with no guest, no reference and no distinction between a reservation and a manual block. Expect to supply the detail yourself there.

Step 2: check the date format before you trust a single row

The most dangerous field in any booking spreadsheet is the date.

05/01/2026 is the 5th of January in most of the world and the 1st of May in the United States. Guess wrong and nothing errors — you block the wrong week, in the wrong month, silently, and only discover it when a guest turns up.

A sound import decides date order per column, from evidence across the whole file: if any row has a first component above 12 the column is day-first; if any row has a second component above 12 it’s month-first; if both appear the file contradicts itself and should be flagged; and if neither appears anywhere, the file is genuinely ambiguous and the right behaviour is to refuse every row and ask you, not to pick one.

That last case is more common than you’d think — a file where every date happens to be in the first twelve days of its month is unresolvable, and any tool that imports it confidently is guessing with your calendar.

Step 3: decide, deliberately, which bookings become financial records

Now the actual accounting question, and it’s a judgement call rather than a setting.

Bookings in a closed period should usually stay out of your books. If your accountant has filed the year, your Xero figures for that year are correct as filed. Re-creating those stays as invoices now doesn’t improve the record — it corrupts a period that was already signed off, and you’ll spend longer reconciling the difference than you saved.

Bookings in the current open period are worth importing properly. These are the ones where a clean invoice per stay, with the guest, the nights, the cleaning fee and the channel commission itemised, genuinely improves your books.

Future bookings should absolutely come in. They haven’t been invoiced anywhere yet, they’ll be paid through your normal flow, and they belong in your ledger from the start.

This is why conversion from block to booking is a separate, previewed action in Airflow rather than something the import does on your behalf. Converting 47 paid stays will queue 47 draft invoices — which is correct behaviour and exactly what you want when you’ve chosen it. The point is that you choose.

What “properly” looks like in Xero

If you’re going to create historical invoices, create them the way you’d want them to have been created at the time. The most common mistakes are the same ones people make going forward:

The payout is not the income. An Airbnb payout is the guest total minus the host service fee, sometimes minus tax withheld. Booking the payout as revenue understates your income and hides the commission entirely. The guest total is your revenue; the host fee is an expense.

Channel commission is an expense, not a discount. Netting it out makes your business look smaller and your costs look lower than they are. We covered the mechanics in How to Track OTA Commissions as Expenses.

Cleaning fees, deposits and taxes are not all revenue. A refundable damage deposit is a liability until it’s released. Cleaning Fees, Damage Deposits & Taxes has the full breakdown.

Dates matter more than usual on a backfill. An invoice dated the stay date tells the truth about when the income was earned. An invoice dated the import date tells you when you ran an import, which is of no interest to anyone.

If your Xero file isn’t set up for short-term rental income in the first place, fix that before you import anything into it — Xero + Short-Term Rentals: The Setup Nobody Teaches You and Your Short-Term Rental Chart of Accounts are the two to read first. Importing good data into a bad chart of accounts just gives you more to re-categorise.

What to do about the gap

There’s a version of this where you do none of it, and it’s often the right answer.

Leave the closed years alone. Import your calendar so your dates are protected. Bring in current-period and future bookings as real records. Let everything from this point forward flow automatically — booking email to structured record to draft invoice, which is the thing that actually saves you the time.

Your historical data stays where it is, in the spreadsheet, as a record. Your books from here are clean. And you skipped the afternoon deleting 200 drafts.

Honest limits

Two things worth knowing before you start.

Airflow’s bulk import handles CSV and Google Sheets, maps columns, matches against what’s already there, and has been run end-to-end against real messy files in production — but it has not yet been exercised by a host against their own two-year spreadsheet. It’s careful software, not battle-worn software. If you’re about to be the first, tell us how it goes and we’ll fix what breaks.

And the mapping is deterministic, not AI-guessed per row. One model call maps the columns of a file; real-world headers like Arrival, Departure, Client, Paid, Ref, Source, Notes usually resolve with no model call at all. The same file imported twice gives the same result.

Next: the product side of this is in Every Booking You Already Have, In One Place, and if you’re moving off a spreadsheet entirely, From Spreadsheets to Real STR Bookkeeping is the companion piece. Or get started and bring your calendar with you.