Automation
Automation troubleshooting
A command ladder and the common failure shapes for scheduled jobs. Part of the Automations guide.
Troubleshooting
Command ladder
openclaw statusopenclaw gateway statusopenclaw automations statusopenclaw automations listopenclaw automations runs <jobId> --limit 20openclaw system heartbeat lastopenclaw logs --followopenclaw doctorAutomations not firing
- Check
cron.enabledand theOPENCLAW_SKIP_CRONenv var. - Confirm the Gateway is running continuously.
- For
cronschedules, verify timezone (--tz) vs the host timezone. reason: not-duein run output means the manual run was checked withopenclaw automations run <jobId> --dueand the job was not due yet.
Job fired but no delivery
- Delivery mode
nonemeans no runner fallback send is expected. The agent can still send directly with themessagetool when a chat route is available. - Delivery target missing/invalid (
channel/to) means outbound was skipped. - For Matrix, copied or legacy jobs with lowercased
delivery.toroom IDs can fail because Matrix room IDs are case-sensitive. Edit the job to the exact!room:serverorroom:!room:servervalue from Matrix. - Channel auth errors (
unauthorized,Forbidden) mean delivery was blocked by credentials. - When the dispatcher records intentional suppression, job state, run history, and finished events include
deliverySuppressionReason(empty,silent,heartbeat, orchannel_transform). This is separate fromlastDeliveryError/deliveryError; required delivery failures also log an error when they happen. - If the isolated run returns only the silent token (
NO_REPLY/no_reply), OpenClaw suppresses direct outbound delivery and the fallback queued-summary path, so nothing is posted back to chat. - If the agent should message the user itself, check that the job has a usable route (
channel: "last"with a previous chat, or an explicit channel/target).
Automations or heartbeat appear to prevent /new-style rollover
- Daily and idle reset freshness is not based on
updatedAt; see Session management. - Automation wakeups, heartbeat runs, exec notifications, and gateway bookkeeping may update the session row for routing/status, but they do not extend
sessionStartedAtorlastInteractionAt. - For legacy rows created before those fields existed, OpenClaw can recover
sessionStartedAtfrom the transcript JSONL session header when the file is still available. Legacy idle rows withoutlastInteractionAtuse that recovered start time as their idle baseline.
Timezone gotchas
- Cron expressions without
--tzuse the gateway host timezone. atschedules without timezone are treated as UTC.- Heartbeat
activeHoursuses configured timezone resolution.
Was this useful?