Reference · Webhook events
Events & payloads
Every event SimpleDock can send, when it fires, and exactly what the JSON looks like. Use this page as your spec sheet while you build.
The 9 events
One envelope per event. The type field tells you what happened; the data object is always the same appointment shape, with status fields filled in for the relevant transition.
A new endpoint starts subscribed to every event except appointment.updated. Turn that one on if you want time, door, or detail changes.
| Event type | Fires when… |
|---|---|
appointment.created | Any new booking: from your booking link, by staff on the dashboard, or through the API or MCP. Pending requests fire it too. |
appointment.approved | A teammate approves a pending booking from the schedule. |
appointment.checked_in | The driver answers the check-in prompt: on track, running late, or cancelling. Cancelling also fires appointment.cancelled. |
appointment.arrived | Staff marks the truck arrived at the dock, starting the dwell-time clock. |
appointment.updated | Time, door, or contact details change after booking. |
appointment.completed | Staff marks the appointment finished. |
appointment.cancelled | Carrier or staff cancels the appointment. |
appointment.rejected | Staff rejects a pending booking, with an optional reason. The appointment's status becomes CANCELLED. |
appointment.no_show | Staff marks the appointment as a no-show. Nothing fires automatically when the time passes. |
Try the payload
Click any event type to see the JSON envelope your endpoint will receive. Status-specific fields (like cancelledAt or rejectionReason) are filled in for the matching event.
appointment.createdAny new booking: from your booking link, by staff on the dashboard, or through the API or MCP. Pending requests fire it too.
{
"id": "evt_2tQ9pX8Lm6Nz",
"type": "appointment.created",
"createdAt": "2026-05-08T17:12:03.481Z",
"organizationId": "org_acme",
"locationId": "loc_main",
"data": {
"id": "appt_abc123def456",
"status": "CONFIRMED",
"startTime": "2026-05-12T14:00:00.000Z",
"endTime": "2026-05-12T15:00:00.000Z",
"companyName": "Acme Freight",
"contactEmail": "[email protected]",
"contactPhone": "+1-555-234-1180",
"driverName": "Maria Lopez",
"driverPhone": "+1-555-901-2233",
"trailerNumber": "TRL-44781",
"poReference": "PO-2026-4471",
"notes": "Pallet jack ready",
"driverNotes": null,
"customFields": {},
"arrivalStatus": null,
"estimatedDelay": null,
"checkedInAt": null,
"completedAt": null,
"approvedAt": "2026-05-08T17:12:00.000Z",
"rejectedAt": null,
"cancelledAt": null,
"rejectionReason": null,
"createdAt": "2026-05-08T17:10:00.000Z",
"updatedAt": "2026-05-08T17:12:00.000Z",
"manageUrl": "https://simpledock.ai/manage/mt_4j2k...",
"door": {
"id": "door_4",
"name": "Door 4"
},
"appointmentType": {
"id": "atype_inb_dry",
"name": "Inbound dry van",
"loadType": "FTL",
"direction": "INBOUND",
"durationMinutes": 60
},
"location": {
"id": "loc_main",
"name": "Reno DC",
"slug": "reno-dc",
"timezone": "America/Los_Angeles",
"address": "1200 Industrial Way",
"city": "Reno",
"state": "NV",
"zip": "89502"
}
}
}Envelope fields
id— unique event id. Stable across retries; dedupe on this.type— one of the 9 event types above.createdAt— ISO 8601 timestamp the event was created.organizationId/locationId— scope identifiers. Useful when you have multiple endpoints.data— the appointment object (see explorer above).
Field-level guarantees
data.statusalways reflects the appointment's current state, not the transition. For deltas, watch the timestamp fields:approvedAt,cancelledAt,rejectedAt.data.startTimeanddata.endTimeare UTC ISO strings. Usedata.location.timezoneto display them.data.poNumbersis every purchase order on the appointment, in order.data.poReferencestays the first one, so an integration that only reads the single field still gets a string.data.customFieldsis a flat object of the answers to your custom booking questions, keyed by each question's key. Questions are set per appointment type: open Types, pick the type, and scroll to Booking questions.data.manageUrlis the carrier's self-service link (/manage/<token>), where they can view, reschedule, or cancel. Anyone with the link can change the booking, so only share it with the carrier.