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 typeFires when…
appointment.createdA carrier books a new appointment via your booking link.
appointment.approvedA teammate approves a pending booking from the schedule.
appointment.checked_inDriver scans the check-in code or staff marks them arrived.
appointment.arrivedStaff marks the truck arrived at the dock, starting the dwell-time clock.
appointment.updatedTime, door, or contact details change after booking.
appointment.completedStaff marks the appointment finished.
appointment.cancelledCarrier or staff cancels the appointment.
appointment.rejectedStaff rejects a pending booking with a reason.
appointment.no_showAppointment 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.created

A 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.status always reflects the appointment's current state, not the transition. For deltas, watch the timestamp fields: approvedAt, cancelledAt, rejectedAt.
  • data.startTime and data.endTime are UTC ISO strings. Use data.location.timezone to display them.
  • data.customFields is a flat object of any custom booker fields your team configured — keys match the field IDs from Settings → Appointment fields.
  • data.manageUrl deep-links to the appointment for staff. Don't expose this externally — it grants edit access.