All help articles
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 8 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.
| Event type | Fires when… |
|---|---|
appointment.created | A carrier books a new appointment via your booking link. |
appointment.approved | A teammate approves a pending booking from the schedule. |
appointment.checked_in | Driver scans the check-in code or staff marks them arrived. |
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 a reason. |
appointment.no_show | Appointment time passes without check-in. |
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.createdA carrier books a new appointment via your booking link.
json
{
"id": "evt_2tQ9pX8Lm6Nz",
"type": "appointment.created",
"createdAt": "2026-05-08T17:12:03.481Z",
"organizationId": "org_acme",
"locationId": "loc_main",
"data": {
"id": "appt_abc123def456",
"status": "APPROVED",
"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": "DRY",
"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 8 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.customFieldsis a flat object of any custom booker fields your team configured — keys match the field IDs from Settings → Appointment fields.data.manageUrldeep-links to the appointment for staff. Don't expose this externally — it grants edit access.