Missed Check-in
The Missed Check-in trigger fires when a device doesn't enter a checkpoint geofence during a scheduled window on a given day. Use it for a daily arrival that should always happen: a driver clocking in at a depot, a guard reaching a checkpoint, a courier picking up from a fixed location.
The API and SDK use trigger_type: "expected_visit" as the internal identifier. Customers see "Missed Check-in" in the Workflow Builder UI and in this documentation; both refer to the same trigger.
What It Does
The trigger watches one device and one geofence. For each day the window applies, SpatialFlow checks whether the device entered the geofence between the window's start and end, plus a grace period. If no entry was recorded by the deadline, the workflow fires once for that day's window.
This is evidence of absence, not proof: a device that entered but had its location upload delayed past the deadline, or a device that was never tracking, both look identical to a device that genuinely never arrived. The trigger payload says so explicitly in its message field.
When to Use
- A route that should start from the same depot every morning
- A guard patrol with a fixed checkpoint and shift start time
- A courier or driver who should clock in at a hub before their shift
Configuration
| Field | Type | Default | Description |
|---|---|---|---|
device_id | UUID | (required) | The one device this trigger watches |
geofence_id | UUID | (required) | The checkpoint geofence the device must enter |
start | string | (required) | Window start, HH:MM |
end | string | (required) | Window end, HH:MM. A start after the end wraps overnight |
days | array of integers | every day | Weekdays the window applies to, 0 (Monday) through 6 (Sunday) |
timezone | string | inherits the workspace timezone | An IANA timezone name. Falls back to UTC if neither is set |
grace_minutes | integer | 15 | How long past the window's end a late-uploaded location still counts as on time, 0 to 1440 |
In the builder, this is Window start, Window end, Days the window starts, Timezone, and Late-upload grace (minutes).
Trigger Payload
{
"event_type": "expected_visit",
"timestamp": "2026-05-20T14:15:00+00:00",
"workspace_id": "a1b2c3d4-5678-90ab-cdef-1234567890ab",
"device_id": "truck-42",
"device_uuid": "d1e2f3a4-5678-90ab-cdef-1234567890ab",
"device_name": "Truck 42",
"geofence_id": "b2c3d4e5-6789-01ab-cdef-1234567890ab",
"geofence_name": "Main Depot",
"window_start": "2026-05-20T13:00:00+00:00",
"window_end": "2026-05-20T14:00:00+00:00",
"deadline": "2026-05-20T14:15:00+00:00",
"timezone": "America/New_York",
"grace_minutes": 15,
"outcome": "no_recorded_check_in",
"message": "No entry event was recorded during the check-in window. This does not prove absence."
}
Template Variables
| Variable | Resolved Value |
|---|---|
{{trigger.event_type}} | "expected_visit" (internal type string) |
{{trigger.device_id}} | External device identifier (customer-assigned) |
{{trigger.device_name}} | Human-readable device name |
{{trigger.geofence_id}} | UUID of the checkpoint geofence |
{{trigger.geofence_name}} | Human-readable geofence name |
{{trigger.workspace_id}} | UUID of the workspace that owns the device |
{{trigger.window_start}} | ISO 8601 timestamp of the window's start, in UTC |
{{trigger.window_end}} | ISO 8601 timestamp of the window's end, in UTC |
{{trigger.deadline}} | ISO 8601 timestamp of window_end plus grace_minutes |
{{trigger.timezone}} | The IANA timezone the window was evaluated in |
{{trigger.grace_minutes}} | The grace period the trigger was configured with (echoed back) |
{{trigger.outcome}} | Always "no_recorded_check_in" today; the field exists for future outcomes |
{{trigger.message}} | A human-readable caveat about the evidence |
Example Use Case
Scenario. A courier company wants to know if a driver never picked up from the central hub before 09:00 on a weekday.
Workflow.
- Trigger: Missed Check-in on the driver's device and the hub geofence,
start: "07:00",end: "09:00",days: [0, 1, 2, 3, 4],grace_minutes: 15. - Action - Slack: Notify
#dispatchwith the driver name and the window that closed. - Action - Webhook: POST to the routing system so the day's manifest can be reassigned.
Because the window only re-arms the next day it applies to, a driver who genuinely skips one morning doesn't generate repeat alerts until the next scheduled window.
Related Recipes
End-to-end runnable guides for routing this trigger to external systems:
See Also
- Alert on a missed check-in in the manager guides
- Device Offline: a device stops reporting, wherever it is
- Workflows In Depth: actions, conditions, and execution model