Reservation webhooks migration
How to move from legacy reservation events to v2 ones
What has changed?
Guesty has introduced two new reservation webhook events to replace our legacy ones:
reservation.created.v2replacesreservation.newreservation.updated.v2replacesreservation.updatedandreservation_update_shortlist
The new webhook events separate financial and payment information from stay details, making it easier to track changes and manage reservations efficiently. Here’s what’s improved:
- Lean payloads: With less data sent in each webhook, your system processes updates faster. You’ll see only the key stay details and the change sub-types. To access full financial, listing, or guest information, simply use the relevant API endpoint.
- Clearer change tracking: The updated event shows which fields or reservation section changed, so you know exactly what triggered the webhook and can respond quickly.
- Improved sequencing: Each event includes a timestamp (
publishedAt) and subtype, helping you keep updates in order and avoid processing errors.
We recommend switching to the v2 events, as the legacy webhooks will be phased out by the end of 2026. If you run into any issues during migration, reach out to us, and we’ll help you resolve them.
How to migrate
- Subscribe: Add the v2 events to your existing webhook subscription (
PUT/webhooks/{id}) - Observe: Your endpoint will begin receiving both legacy and v2 events. Validate that the v2 delivery is consistent in your test environment.
- Switch logic: Update your system to use the v2 payload first. If you need more details, use the
reservationIdto pull extra information from the Open API.GET /reservations-v3GET /guest-folio/overviewGET /guest-folio/invoice-itemsGET /listings/{id}
- Confirm migration: When you’ve tested and are confident in the new setup, move your production accounts to v2.
Best PracticeAfter you receive a webhook, use the API to get the latest reservation data. Compare it with your local records to see exactly what’s changed.
Handling events
Refer to Guesty’s main webhooks article on how to process webhooks here (Webhook Subscriptions)
Data structure
Legacy data structure
The legacy events emitted the full reservation object and event label, with updates adding a reservationBefore object. Due to the size of the payloads, only the top-level parameters are shown. Perform your own tests to map event shapes.
{
// The event value will be either `reservation.new`, `reservation.updated`, or `reservation_update_shortlist`
"event: "reservation.event",
"meta": {},
"reservation": {},
// The following appears on `reservation.updated` events only
"reservationBefore": {}
}Legacy payloads included all settings, pricing, and payment information, which made them difficult to manage. To simplify your workflow and follow webhook best practices, we’ve introduced the new v2 structure, explained below.
V2 Shared data structure (data)
Both events share a common data interface representing the core state of the reservation. These include the following:
| Field | Type | Description |
|---|---|---|
accountId | string | Unique Guesty account ID |
checkinDateLocalized / checkoutDateLocalized | ISO date | Arrival and departure dates according to the listing’s time zone. For example, 2026-08-28 |
confirmationCode | string | Secondary reservation identifier |
createdAt / confirmedAt | ISO date-time | The booking creation and confirmation dates. E.g., 2026-08-25T12:02:16.299Z |
guestId | string | Unique Guesty ID for the guest |
guestCount | integer | Total number of guests booked |
inquiryId | string | Unique Guesty inquiry ID. Every booking starts as an inquiry on the backend, even instant bookings. |
lastStayListingId | string | Relates to mid-stay listing changes and is the most recent property the guest occupied throughout the stay. The unitId and unitTypeId retain the original listing that was assigned to the booking. |
numberOfGuests | object | Guesty breakdown of adults, children, infants, and pets |
platform | string | The unique OTA integration used to book the reservation. For example, direct, bookingCom, etc. |
quoteId | string | Unique Guesty quote ID representing the rate plan applied to the booking |
reservationId | string | Unique Guesty reservation ID |
source | string | Booking source. E.g., manual, airbnb, etc. |
status | string | Current reservation status (e.g., confirmed, canceled) |
checkIn / checkOut | ISO date-time | Arrival and departure timestamps. E.g., 2026-08-28T15:00:00.000Z |
stay | Array | Breakdown of the stay per unit/rate plan |
unitId / unitTypeId | string | The guest listing ID of the booked property and space. If the property booked is a multi-unit, unitId will be the multi-unit parent and untiTypeId the sub-unit. |
event | string | The event subscription that triggered the webhook |
V2 metadata (meta)
The meta object contains context about the event itself.
| Field | Type | Event | Description |
|---|---|---|---|
eventId | string | Both | Internal unique message ID |
publishedAt | ISO Date | Both | Timestamp of when the event occurred |
subType | Enum | Updated | The specific nature of the update. See the meta.subType reference table below |
changedFields | Array | Updated | List of fields that were modified. See the meta.changedfields reference table below |
meta.subType reference
meta.subType referenceOnly present on reservation.updated.v2.
| Value | Definition |
|---|---|
ALTERATION | Dates, guests, or stay structure changed (the "big edit") |
ASSIGNED | Unit that was assigned to the reservation and has been replaced, or a sub-unit recently assigned to a multi-unit booking. |
CONFIRMED | Reservation moved to confirmed status |
CANCELED | Reservation was canceled |
EXPIRED | Reservation expired (TTL hit) |
DECLINED | Reservation was declined by host/PM |
AWAITING_PAYMENT | Moved to awaiting-payment status |
RESERVED | Moved to reserved status |
CLOSED | Reservation closed (checkout completed) |
STATIC_STATUS_CHANGED | Status changed without a specific flow (catch-all) |
PLANNED_SCHEDULE_ALTERED | ETA/ETD times changed without date change |
TRAVEL_INFORMATION_ALTERED | Transportation details changed |
NOTES_ALTERED | Notes (guest/cleaning/other/etc.) changed |
SOURCE_ALTERED | Reservation source changed |
LISTING_UPDATED | Unit type or unit reassigned |
CUSTOM_FIELDS_ALTERED | Legacy custom fields modified |
CONFIRMATION_CODE_ALTERED | Confirmation code changed |
meta.changedFields — All possible values
meta.changedFields — All possible valuesOnly present on reservation.updated.v2.
| Value | Definition |
|---|---|
checkIn | Check-in datetime (UTC ISO) changed |
checkOut | Check-out datetime (UTC ISO) changed |
checkInDateLocalized | Localized check-in date string changed |
checkOutDateLocalized | Localized check-out date string changed |
status | Reservation status changed (confirmed, canceled, etc.) |
guestsCount | Total guest count changed |
numberOfGuests | Structured guest breakdown (adults/children/infants/pets) changed |
notes | Notes object (other, cleaning, guest, specialRequests, keyCode) |
legacyCustomFields | Legacy custom fields array changed |
confirmedAt | Confirmation timestamp set or changed |
canceledAt | Cancellation timestamp set or changed |
transportation | Transportation/travel info changed |
platform | Platform value changed |
quoteId | Associated quote changed |
unitType | Unit type (listing) reassigned |
unit | Specific unit reassigned |
Identifying owner reservations
Currently, there’s no reliable way to identify owner reservations directly from the webhook payload. While data.source may show owner or 'owner-guest, it’s not always enough. To confirm, use the API to retrieve the reservation and check the creationInfo value.
Ordering and idempotency
Guesty processes events asynchronously, so webhooks may sometimes arrive out of order. The v2 events help you keep updates in the right sequence and avoid duplicates. Here’s how:
- Use
publishedAtto determine the chronological order of webhooks that may arrive out of order - To optimize your processing, Guesty performs deduplication for v2 webhooks. If an update occurs but none of the tracked
changedFields(e.g., status, check-in, guests) actually change, a webhook will not be emitted.
Known issues
We’re working on new webhooks and endpoints for reservation financial and payment changes. Until these are ready, you can continue using the legacy resources. If you need help accessing information, contact our support team, and we’ll assist you.
Updated about 5 hours ago