Webhook Events

Reference for all webhook event types, their payloads, and delivery behavior.

Event Types

EventDescription
booking.createdA new booking was created
booking.confirmedBooking payment confirmed
booking.cancelledBooking was cancelled
booking.completedBooking has ended
payment.receivedPayment was received
payment.refundedPayment was refunded
door.unlockedDoor was unlocked (scan or manual)
door.lockedDoor was locked
door.faultDoor reported a fault
device.onlineDevice came online
device.offlineDevice went offline (missed heartbeat)

Payload Format

All webhook payloads follow the same structure:

Example payload: booking.confirmedjson
{
  "id": "evt_uuid",
  "type": "booking.confirmed",
  "created_at": "2026-02-16T12:00:00Z",
  "tenant_id": "tenant-uuid",
  "data": {
    "booking": {
      "id": "booking-uuid",
      "guestName": "Jan de Vries",
      "guestEmail": "jan@example.com",
      "objectId": "object-uuid",
      "startTime": "2026-02-17T10:00:00Z",
      "endTime": "2026-02-17T11:00:00Z",
      "status": "CONFIRMED",
      "totalPrice": 2500
    }
  }
}

Signature Verification

Each webhook request includes a X-BOOQR-Signature header containing an HMAC-SHA256 signature. Verify this to ensure the request came from BOOQR.

Node.js signature verificationjavascript
import crypto from "crypto";

function verifyWebhookSignature(payload, signature, secret) {
  const expected = crypto
    .createHmac("sha256", secret)
    .update(payload)
    .digest("hex");

  return crypto.timingSafeEqual(
    Buffer.from(signature),
    Buffer.from(expected)
  );
}

// In your webhook handler:
const isValid = verifyWebhookSignature(
  JSON.stringify(req.body),
  req.headers["x-booqr-signature"],
  process.env.WEBHOOK_SECRET
);

Retry Policy

Failed deliveries (non-2xx response or timeout) are retried with exponential backoff:

AttemptDelay
1st retry1 minute
2nd retry5 minutes
3rd retry30 minutes
4th retry2 hours
5th retry24 hours

After 5 failed attempts, the webhook is marked as failing and disabled after 3 consecutive failures.

Best Practices

  • Always verify the webhook signature
  • Return 200 OK as quickly as possible — process the event asynchronously
  • Handle duplicate events idempotently (use the event id)
  • Use HTTPS endpoints only
  • Monitor your webhook delivery status in the admin dashboard