Event types

Every webhook event, when it is sent, and the payload it carries.

Event types#

EventSent whenEnvironmentdata
booking.createdA customer books: an activity booking, a dining reservation, an event RSVP or a ticket order.Productionbooking
booking.updatedA booking changes state: confirmed, checked in, completed, no-show, rescheduled, an RSVP decided, or confirmed by a payment.Productionbooking, change
booking.cancelledA booking is cancelled, by the customer or by you.Productionbooking, change
payment.updatedA booking's payment status changes: marked paid, refunded, or failed.Productionbooking, change
catalog.item.createdA catalogue item is created — through the API, or by a connected store's sync.The key's; production for a store syncitem
catalog.item.updatedA catalogue item is written again, patched, or changed by a store sync.As aboveitem
catalog.item.deletedA catalogue item is deleted, or removed by a store sync.As aboveitem (as it was)
pingYou press Test in the portal. It cannot be subscribed to.The endpoint'smessage, 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:

Envelope
{
  "id": "evt_mfz3k2a1Xq9vT0bLm3Rk",
  "event": "booking.created",
  "occurredAt": "2026-09-26T08:15:30.123Z",
  "environment": "production",
  "partnerId": "cm1partnerid000000000000001",
  "data": { "…": "…" }
}
FieldMeaning
idThe event ID, also sent as X-Localoy-Event-Id.
eventThe event type.
occurredAtWhen it happened, ISO 8601 UTC.
environmentsandbox or production, in lower case.
partnerIdYour Localoy partner ID.
dataThe 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.

data
{
  "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"
  }
}
FieldMeaning
moduleactivity, dining or event.
referenceThe booking reference shown to the customer, where there is one.
statusThe booking's status.
paymentStatusThe booking's payment status.
quantityUnits booked. For dining, the party size. For events, always 1.
totalTakaThe total in whole taka — not minor units.
scheduledFor, startTime, endTimeWhen 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 quantity 1 and reference null.
  • Dining: quantity is the party size, and experienceName is the branch's name.

The change object#

Sent on updates, and present when Localoy knows what changed. Every field is optional:

FieldMeaning
previousStatusThe booking's status before this change.
previousPaymentStatusThe payment status before this change.
reasonA 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:

data
{
  "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.