booking.changed
A booking you created has changed — by you or by the host.
When it fires
A booking you created changed — either the host edited it in the Doorloom app, or your own write is being echoed back to you as confirmation.
This event describes a thing rather than a period, so window is
null.
What to do with it
- This event reaches only the integration that owns the booking. It carries guest contact details, so it is never broadcast to other integrations covering the same property.
- There is no separate created, updated or cancelled event. A cancellation arrives as
booking.changedwithstatus: "cancelled"and a non-nullcancelled_at. origintells you who made this change."partner"is your own write coming back — you can usually ignore it, or use it to confirm the write landed."doorloom"is the host editing in the app, which you must apply.revisionincrements on every change from either side. It is whatIf-Matchcompares against onPATCH /bookings/{id}.datahere is byte-identical to the booking object returned by the REST endpoints, so one parser serves both.
The data block
| Field | Type | Description |
|---|---|---|
id
|
integer | Doorloom's booking id. Use it in the REST paths. |
external_booking_id
|
string|null | The id you supplied at create. |
external_reference
|
string|null | Your source.reference, e.g. the OTA confirmation code. |
revision
|
integer | Increments on every change, from either side. |
origin
|
string | "partner" or "doorloom" — who made the latest change. |
status
|
string | pending, confirmed, cancelled, completed or refunded. |
property.doorloom_id
|
integer | The booked property. |
property.external_id
|
string|null | Your alias for it. |
check_in
|
string | Y-m-d. |
check_out
|
string | Y-m-d. Exclusive — the guest leaves this morning. |
guests.adults
|
integer | Total adults across all units. |
guests.children
|
integer | Total children across all units. |
guest.name
|
string | Lead guest name. |
guest.phone_code
|
string | Dialling code, e.g. "+91". |
guest.mobile
|
string | Mobile number without the dialling code. |
units[].property
|
object | {doorloom_id, external_id} for the unit's property. |
units[].inventory_id
|
integer | The allocated unit. |
units[].external_unit_id
|
string|null | Your alias for it. |
units[].adults
|
integer | Adults in this unit. |
units[].children
|
integer | Children in this unit. |
units[].meal_plan
|
string|null | EP, CP, MP or AP. |
units[].stay_price
|
number | Room money for this unit across the stay. |
units[].meal_total
|
number | Meal money for this unit across the stay. |
units[].line_total
|
number | stay_price plus meal_total. |
pricing.currency
|
string | Always "INR". |
pricing.total
|
number | Booking total. For a booking you created, this is the total you sent. |
pricing.advance
|
number | Recorded as collected. |
pricing.balance
|
number | Still owed. |
pricing.partner_breakdown
|
object|null | The pricing.breakdown you sent at create, stored verbatim and never interpreted. |
payment
|
object|null | The payment object you sent, stored verbatim. |
source.channel
|
string|null | The channel you named at create, e.g. "airbnb". |
source.reference
|
string|null | Your reference on that channel. |
notes
|
string|null | Free-text note on the booking. |
cancelled_at
|
string|null | ISO-8601 in Asia/Kolkata. Non-null once cancelled. |
cancellation_note
|
string|null | Why it was cancelled. |
created_at
|
string | ISO-8601 in Asia/Kolkata. |
updated_at
|
string | ISO-8601 in Asia/Kolkata. |
Example
The full envelope, as it arrives on the wire.
{
"id": "01J6Y0W1T4V7Y9B1D3F5H7J9K1",
"type": "booking.changed",
"version": "2026-09",
"sequence": 1047,
"occurred_at": "2026-10-01T16:22:40+05:30",
"integration": {
"id": 12,
"slug": "acme-pms"
},
"property": {
"doorloom_id": 902,
"external_id": "VILLA-9",
"master_property_id": 902
},
"window": null,
"data": {
"id": 55231,
"external_booking_id": "PMS-100234",
"external_reference": "HM-77",
"revision": 2,
"origin": "doorloom",
"status": "confirmed",
"property": {
"doorloom_id": 902,
"external_id": "VILLA-9"
},
"check_in": "2026-10-12",
"check_out": "2026-10-14",
"guests": {
"adults": 4,
"children": 1
},
"guest": {
"name": "Asha Rao",
"phone_code": "+91",
"mobile": "9876543210"
},
"units": [
{
"property": {
"doorloom_id": 902,
"external_id": "VILLA-9"
},
"inventory_id": 31,
"external_unit_id": "ROOM-A",
"adults": 2,
"children": 1,
"meal_plan": "CP",
"stay_price": 8000,
"meal_total": 2600,
"line_total": 10600
},
{
"property": {
"doorloom_id": 902,
"external_id": "VILLA-9"
},
"inventory_id": 32,
"external_unit_id": "ROOM-B",
"adults": 2,
"children": 0,
"meal_plan": "EP",
"stay_price": 8000,
"meal_total": 0,
"line_total": 8000
}
],
"pricing": {
"currency": "INR",
"total": 18600,
"advance": 4000,
"balance": 14600,
"partner_breakdown": {
"room": 16000,
"meals": 2600
}
},
"payment": {
"status": "partial",
"amount_collected": 4000,
"collected_by": "partner",
"reference": "pay_123"
},
"source": {
"channel": "airbnb",
"reference": "HM-77"
},
"notes": "Late arrival, around 11pm",
"cancelled_at": null,
"cancellation_note": null,
"created_at": "2026-10-01T15:58:12+05:30",
"updated_at": "2026-10-01T16:22:40+05:30"
}
}
Related
- The event envelope — the wrapper
around
data, shared by every event. - Ordering and idempotency — how to decide whether to apply this event.
- The booking object — the same representation, returned by the REST endpoints.