Event types
Every webhook event, when it is sent, and the payload it carries.
Event types#
| Event | Sent when | Environment | data |
|---|---|---|---|
booking.created | A customer books: an activity booking, a dining reservation, an event RSVP or a ticket order. | Production | booking |
booking.updated | A booking changes state: confirmed, checked in, completed, no-show, rescheduled, an RSVP decided, or confirmed by a payment. | Production | booking, change |
booking.cancelled | A booking is cancelled, by the customer or by you. | Production | booking, change |
payment.updated | A booking's payment status changes: marked paid, refunded, or failed. | Production | booking, change |
catalog.item.created | A catalogue item is created — through the API, or by a connected store's sync. | The key's; production for a store sync | item |
catalog.item.updated | A catalogue item is written again, patched, or changed by a store sync. | As above | item |
catalog.item.deleted | A catalogue item is deleted, or removed by a store sync. | As above | item (as it was) |
ping | You press Test in the portal. It cannot be subscribed to. | The endpoint's | message, endpointId |
Booking and payment events come from real customer activity, so they are only sent to production endpoints.
The envelope#
Every event has the same outer shape:
{
"id": "evt_mfz3k2a1Xq9vT0bLm3Rk",
"event": "booking.created",
"occurredAt": "2026-09-26T08:15:30.123Z",
"environment": "production",
"partnerId": "cm1partnerid000000000000001",
"data": { "…": "…" }
}| Field | Meaning |
|---|---|
id | The event ID, also sent as X-Localoy-Event-Id. |
event | The event type. |
occurredAt | When it happened, ISO 8601 UTC. |
environment | sandbox or production, in lower case. |
partnerId | Your Localoy partner ID. |
data | The event's payload, below. |
The order of keys in the JSON is not fixed. Parse the body as JSON — but verify the signature against the raw bytes first.
Booking events#
booking.created, booking.updated, booking.cancelled and payment.updated carry a booking.
Every field is always present; fields that do not apply to a booking are null.
{
"booking": {
"id": "cm5b00k1ng0000000000001",
"module": "activity",
"reference": "BKG-7F3K9Q",
"experienceId": "cm5act1v1ty000000000001",
"experienceName": "Kayak (1 hour)",
"status": "CONFIRMED",
"paymentStatus": "PAID",
"customerName": "Nusrat Jahan",
"customerPhone": "01712345678",
"customerEmail": null,
"quantity": 2,
"totalTaka": 900,
"scheduledFor": "2026-09-30T00:00:00.000Z",
"startTime": null,
"endTime": null,
"checkedInAt": null,
"cancelledAt": null,
"cancellationReason": null,
"createdAt": "2026-09-26T08:15:30.123Z"
},
"change": {
"previousPaymentStatus": "PENDING",
"reason": "payment_paid"
}
}| Field | Meaning |
|---|---|
module | activity, dining or event. |
reference | The booking reference shown to the customer, where there is one. |
status | The booking's status. |
paymentStatus | The booking's payment status. |
quantity | Units booked. For dining, the party size. For events, always 1. |
totalTaka | The total in whole taka — not minor units. |
scheduledFor, startTime, endTime | When the booking is for, where it has a date or time. |
Differences between modules#
- Events: one webhook is sent per admission — a ticket order for four people sends four. Each
has
quantity1andreferencenull. - Dining:
quantityis the party size, andexperienceNameis the branch's name.
The change object#
Sent on updates, and present when Localoy knows what changed. Every field is optional:
| Field | Meaning |
|---|---|
previousStatus | The booking's status before this change. |
previousPaymentStatus | The payment status before this change. |
reason | A short hint such as payment_paid, payment_refunded or cancelled_by_customer. |
Treat reason as informational. New values can appear at any time; do not reject unknown ones.
Catalogue events#
catalog.item.* events carry the item — without its metadata and localoyRef:
{
"item": {
"id": "cm1q2w3e4r5t6y7u8i9o0p1a2",
"externalId": "sku-4471",
"name": "Kacchi Biryani (full)",
"description": "Mutton kacchi with borhani",
"priceCents": 45000,
"currency": "BDT",
"available": true,
"stock": 12,
"createdAt": "2026-09-26T08:15:30.123Z",
"updatedAt": "2026-09-26T08:15:30.123Z"
}
}An API write sends its event to your endpoints of the key's environment. A connected store's sync sends to your production endpoints.