inventory.changed
The unit list, including units that have been retired.
When it fires
A unit was added, renamed, deactivated, deleted, or had its external alias changed by Doorloom staff.
This event describes a thing rather than a period, so window is
null.
What to do with it
- This is the one event that deliberately includes inactive and deleted units. You need them to retire an alias rather than have it silently vanish.
total_unitscounts only active units, so it will not matchcount(units)once anything has been deactivated.- There is no date window. This event describes the property, not a period.
The data block
| Field | Type | Description |
|---|---|---|
total_units
|
integer | Count of ACTIVE units only. |
units[]
|
array | Every unit, active or not. |
units[].inventory_id
|
integer | Doorloom's permanent id for the unit. |
units[].external_unit_id
|
string|null | Your alias for it, if one has been mapped. Null means unmapped — you can still book the unit by inventory_id, or omit both and let Doorloom allocate. |
units[].name
|
string | Host-facing unit name, e.g. "Garden Suite". |
units[].code
|
string|null | Host-entered short code, if any. |
units[].is_active
|
boolean | False for a unit the host deactivated or deleted. An inactive unit cannot be booked. |
units[].is_default
|
boolean | True for the property's default unit. Single-unit properties have exactly one. |
units[].max_occupancy
|
integer|null | Maximum guests the unit sleeps. Null means the host has not set one; Doorloom does not enforce it. |
units[].deleted
|
boolean | True once the host deletes the unit. Retire your alias when you see this. |
Example
The full envelope, as it arrives on the wire.
{
"id": "01J6Y0T7P0R3S6V8X0Z2B4C6D8",
"type": "inventory.changed",
"version": "2026-09",
"sequence": 1045,
"occurred_at": "2026-10-01T15:06:02+05:30",
"integration": {
"id": 12,
"slug": "acme-pms"
},
"property": {
"doorloom_id": 902,
"external_id": "VILLA-9",
"master_property_id": 902
},
"window": null,
"data": {
"total_units": 2,
"units": [
{
"inventory_id": 31,
"external_unit_id": "ROOM-A",
"name": "Garden Suite",
"code": "GS",
"is_active": true,
"is_default": true,
"max_occupancy": 4,
"deleted": false
},
{
"inventory_id": 32,
"external_unit_id": "ROOM-B",
"name": "Pool Suite",
"code": "PS",
"is_active": true,
"is_default": false,
"max_occupancy": 4,
"deleted": false
},
{
"inventory_id": 30,
"external_unit_id": "ROOM-OLD",
"name": "Annexe",
"code": null,
"is_active": false,
"is_default": false,
"max_occupancy": 2,
"deleted": true
}
]
}
}
Related
- The event envelope — the wrapper
around
data, shared by every event. - Ordering and idempotency — how to decide whether to apply this event.