Connect Out: Send Booking Events to Your Other Systems

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

  1. Open Connections and choose the External automations tab.
  2. Choose Add an address and paste the address from Zapier, Make, n8n or your own server. It must start with https://.
  3. Choose which events to send.
  4. 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.
  5. 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_in date.