Connect Out: Send Booking Events to Your Other Systems
Connect out — Airflow tells your other systems when a booking is created, changed or cancelled, and when a payment is received. It works with Zapier, Make, n8n or your own server.
What it does
You add a web address. When a booking in your account is created, changed or cancelled, Airflow sends a message to that address, usually within a minute. It covers every booking Airflow holds: those read from Airbnb, Booking.com and Vrbo emails, direct bookings from your booking page, and bookings you added by hand or imported.
What people build with it
A message to the cleaner for each new booking. A task per turnover that moves when the booking moves. A shared calendar, a booking log, an income sheet. A reminder the day before check-in. How to Connect Airbnb to n8n walks through the setup step by step; Zapier and Make work the same way with their own webhook triggers.
Adding an address
- Open Connections and choose the External automations tab.
- Choose Add an address and paste the address from Zapier, Make, n8n or your own server. It must start with
https://. - Choose which events to send.
- Copy the signing secret that appears. It is shown once. You only need it if your system checks the signature; Zapier and Make do not.
- Press Send test event to check it arrives. You can send 20 test events an hour.
Only an owner or manager of the account can add or change an address.
You can have up to five addresses. Each one receives the events of every listing in the account; to act on one listing only, filter on listing.name in your own tool.
The events
| Event | Sent when |
|---|---|
booking.created |
A booking is first confirmed. An unpaid or abandoned booking is not announced. |
booking.updated |
The dates, guests, total or status of a booking change. |
booking.cancelled |
A booking is cancelled. |
payment.received |
More has been received on a booking than at the last check: a deposit, a balance, or a payment you record by hand. |
Bookings that were already in your account when you added your first address are the starting point. They are not sent as new.
What a message looks like
{
"id": "evt_3ca06bd71aa4…",
"type": "booking.created",
"api_version": "2026-10-04",
"created": "2026-10-04T10:15:02Z",
"organisation": { "id": "…", "name": "Your business" },
"data": {
"booking": {
"id": "…",
"reference": "HM1234ABCD",
"source": "channel",
"channel": "airbnb",
"status": "confirmed",
"check_in": "2027-01-10",
"check_out": "2027-01-14",
"nights": 4,
"guests": { "adults": 2, "children": 0, "infants": 0 },
"currency": "USD",
"total": 800,
"payout": 676,
"financials": {
"currency": "USD",
"accommodation": 720,
"cleaning_fee": 80,
"fees": [],
"taxes": [],
"taxes_included": null,
"discounts": [],
"channel_fee": 124,
"airflow_commission": null,
"total": 800,
"payout": 676,
"paid": null,
"balance_due": null
},
"listing": { "id": "…", "name": "Sea Cottage" }
}
}
}
source is channel for a booking read from a channel’s email or added by hand, and direct for one made on your booking page.
channel is always lower case with words joined by an underscore: airbnb, booking_com, vrbo, direct.
booking.reference stays the same across the created, changed and cancelled messages for one booking. Use it to find what your automation made earlier.
The money lines
Every booking message carries a financials block, so the system that receives it can raise an invoice with proper lines, not one total.
| Field | What it is |
|---|---|
accommodation |
The stay itself, before fees |
cleaning_fee |
The cleaning fee, where there is one |
fees, taxes, discounts |
Lists of lines, each with a name and an amount |
taxes_included |
Whether the prices already include tax, where the channel says so |
channel_fee |
What the channel kept: Airbnb’s host service fee or Booking.com’s commission. Empty on a direct booking |
airflow_commission |
Airflow’s commission on a direct booking. Empty on a channel booking |
total, payout |
What the guest pays, and what reaches you |
paid, balance_due |
Received so far and still owed, for bookings you collect yourself. Empty where the channel collects from the guest |
A value Airflow does not hold is null. What a channel booking carries depends on what the channel’s email states, so check the fields on a real booking before you rely on one.
Payments
A payment.received message has a payment block beside the booking:
"payment": {
"amount": 300,
"currency": "USD",
"paid_total": 300,
"balance_due": 500,
"method": "card",
"reference": null,
"received_at": "2026-10-04T10:15:02Z"
}
amount is this payment; paid_total is everything received on the booking so far. method, reference and received_at are filled in when Airflow holds them, and are null otherwise. Payments that were already on your bookings when payments were first switched on are not sent. Refunds are not sent.
Using it for accounting
Airflow connects to Xero, QuickBooks, Sage and FreshBooks itself: use that where you can. For any other accounting system, send booking.created to Zapier, Make or n8n, create the invoice there from the money lines, and use payment.received to mark it paid. booking.reference links the two. Nothing comes back into Airflow, so invoice numbers and statuses stay in your accounting system.
Guest contact details
By default a message has no guest name, email or phone. Switch on Include guest contact details for an address and a guest block is added to booking. The system that receives it then holds your guests’ details, and looking after them there is your responsibility.
Retries
Your address should answer with a 2xx status within 10 seconds. If it does not, Airflow tries again after 1 minute, 5 minutes, 30 minutes, 2 hours, 6 hours and 12 hours, then gives up on that message. An address that fails 20 deliveries in a row is switched off and you are notified. Recent deliveries on each address shows what was sent and what came back.
A message can arrive more than once. Use its id to ignore one you have already handled. After a retry, messages can also arrive out of order: created is when the event happened.
Airflow keeps its record of what was sent, and what came back, for 60 days.
Checking the signature
Every message carries an Airflow-Signature header:
Airflow-Signature: t=1791060000,v1=5f3c…
v1 is the HMAC-SHA256 of the text t, a full stop and the raw request body, using your signing secret as the key. Work out the same value and compare. t is the time the message was sent, in seconds; refuse a message more than five minutes old. In Node.js:
const crypto = require('crypto');
function isFromAirflow(rawBody, header, secret) {
const t = (header.match(/t=(\d+)/) || [])[1];
const v1 = (header.match(/v1=([0-9a-f]+)/) || [])[1];
if (!t || !v1) return false;
const expected = crypto.createHmac('sha256', secret).update(`${t}.${rawBody}`).digest('hex');
if (expected.length !== v1.length) return false;
return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(v1));
}
Use the body exactly as it arrived, before any parsing. In n8n, switch on Raw Body in the Webhook node’s options to get it. New signing secret on an address replaces the secret at once.
What it costs
One automated task for each booking sent out, taken the first time an event for that booking is delivered. Later changes to it, its cancellation, payments on it, further addresses, failed deliveries and test events cost nothing. If you run out of tasks, your addresses are paused and events are held for 72 hours. Connect out is part of the Growth plan and above; see pricing.
What it does not do
- It is one way: Airflow sends, and does not accept instructions back. It cannot change anything on Airbnb, Booking.com or Vrbo.
- It sends four events. Nothing is sent for a refund, when an invoice is drafted, when a review is left or when a guest writes to you.
- It does not wait. A step such as “the day before check-in” is built with the waiting step in your own tool, using the
check_indate.