Webhook events: payloads for every event

The envelope every webhook delivery shares, the data each event carries with examples, the headers, and how retries work.

Webhooks tell your system the moment something happens in a business. Setting them up in the dashboard is covered in Webhooks; this page is the reference for what arrives.

The request

POST https://example.com/ordina/events
Content-Type: application/json
User-Agent: Ordina-Webhooks/1.0 (+https://www.useordina.com)
X-Ordina-Event: booking.created
X-Ordina-Delivery: 98231
X-Ordina-Signature: t=1759312800,v1=5f2c...e9a1

Always verify the signature before trusting a delivery.

The envelope

Every event has the same outer shape:

{
  "id": "evt_Qm9yZGluYS1leGFtcGxl",
  "event": "booking.created",
  "created_at": "2026-10-01T10:00:00.000Z",
  "business": { "id": "6f1c...", "handle": "brightsalon", "name": "Bright Salon" },
  "data": { }
}

id is unique per event. The same event can reach you more than once after a retry, so use id to ignore duplicates.

Events and their data

Event data
booking.created { booking }
booking.rescheduled { booking, previous: { date, time } }
booking.cancelled { booking, cancelled_by: "client" or "merchant", reason }, or { booking, action: "no_show", reason } for a no-show
booking.completed { booking }, with completed_by: "client" when the customer confirmed it
order.created { order }
order.preparing, order.ready, order.dispatched, order.fulfilled { order }
order.cancelled { order, reason }
payment.received { kind: "booking" or "order", amount, currency, reference, booking or order }
lead.created { lead: { id, name, contact, message, source, created_at } }
review.created { review: { id, rating, body, client_name, status, submitted_at } }
ping { message }, sent by the Test button in the dashboard

booking and order are the same objects the REST API returns. See API reference.

Example: booking.rescheduled

{
  "id": "evt_...",
  "event": "booking.rescheduled",
  "created_at": "2026-10-01T10:00:00.000Z",
  "business": { "id": "6f1c...", "handle": "brightsalon", "name": "Bright Salon" },
  "data": {
    "booking": { "id": 4182, "status": "confirmed", "date": "2026-10-04", "time": "10:00", "...": "..." },
    "previous": { "date": "2026-10-03", "time": "14:30" }
  }
}

Example: lead.created

{
  "event": "lead.created",
  "data": {
    "lead": { "id": 311, "name": "Tunde", "contact": "tunde@example.com", "message": "Do you run corporate sessions?", "source": "page", "created_at": "2026-10-01T09:58:40.000Z" }
  }
}

Answering

  • Answer with any 2xx within 10 seconds. Do the real work after answering, for example in a queue.
  • A redirect, a timeout, or any other status is a failure.
  • Failures are retried after 1, 5, 30, 120 and 720 minutes: six attempts over about 15 hours. Then the delivery is marked failed, and the owner sees it in the endpoint's history.
  • Deliveries are not guaranteed to arrive in order. Use created_at, and the object's own status, rather than arrival order.
Did this answer it?If not, write to help@useordina.com with your handle, or contact us. A person replies.
Contact us