Skip to content

Check in to a Booking

A checkin records actual presence at a bookable, on top of or independent of a booking. Tablets at the door, kiosk screens, badge readers and QR scan flows all create the same row.

1. Create the Checkin

POST /checkin

json
{
  "starts_at": "2026-05-15T08:00:00Z",
  "ends_at": "2026-05-15T09:00:00Z",
  "object_type": "public.bookable",
  "object_id": "c3d4e5f6-a7b8-9012-cdef-345678901234",
  "booking_id": "f9955a9a-bb9e-450b-8e91-09a43f0e6cd6",
  "owner_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}

starts_at, ends_at, object_type and object_id are required. object_type must be public.bookable. Link to a booking with booking_id when tracking attendance for a specific reservation. Standalone drop-ins leave booking_id out. checkin_created fires on the bookable.

Response:

json
{
  "data": {
    "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "starts_at": "2026-05-15T08:00:00Z",
    "ends_at": "2026-05-15T09:00:00Z",
    "object_type": "public.bookable",
    "object_id": "c3d4e5f6-a7b8-9012-cdef-345678901234",
    "check_in": null,
    "check_out": null,
    "type": null,
    "created_by": "e992bfc1-0336-42c5-bd0a-4f4804a9fd24",
    "owner_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "created_at": "2026-05-15T07:59:44.112Z",
    "updated_at": "2026-05-15T07:59:44.112Z"
  },
  "request_id": "c1d2e3f4-a5b6-7890-cdef-123456789012",
  "count": 1
}

Note: booking_id is used to link the checkin to the booking row but is not stored on the checkin itself.

2. Record Arrival

PUT /checkin/{id}

json
{
  "check_in": "2026-05-15T08:02:14Z"
}

checkin_updated fires on the bookable.

3. Record Departure

PUT /checkin/{id}

json
{
  "check_out": "2026-05-15T08:58:30Z"
}

checkout_started fires first as a pre-hook, then checkout_completed fires once check_out is written. Both fire on the bookable.

Response (same shape for both PUT calls):

json
{
  "data": {
    "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "starts_at": "2026-05-15T08:00:00Z",
    "ends_at": "2026-05-15T09:00:00Z",
    "object_type": "public.bookable",
    "object_id": "c3d4e5f6-a7b8-9012-cdef-345678901234",
    "check_in": "2026-05-15T08:02:14Z",
    "check_out": "2026-05-15T08:58:30Z",
    "type": null,
    "created_by": "e992bfc1-0336-42c5-bd0a-4f4804a9fd24",
    "owner_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "created_at": "2026-05-15T07:59:44.112Z",
    "updated_at": "2026-05-15T08:58:31.004Z"
  },
  "request_id": "d2e3f4a5-b6c7-8901-def0-234567890123",
  "count": 1
}

Triggers

TriggerFires when
checkin_createdA checkin is registered
checkin_updatedA checkin is modified
checkout_startedA PUT is received (pre-hook, used for payment gating)
checkout_completedcheck_out is set for the first time
checkin_deletedA checkin is deleted

Bind any of these to an action on the bookable to drive a real world side effect.

Where this fits

A typical room flow: user books a room, scans a QR code at the door, the server resolves the code, an action creates the checkin with check_in set, checkout_started and checkin_updated fire, and a door unlock action runs. See Code Scan Flow for the scan side. The Activity log compares booked time against actual presence after the fact.