Configuration — automations and media template variables
Automation config under cron plus the media model template variable surface
Scheduled automation keys under cron.*, plus the media model template variable surface.
For the full key index and the other top-level config domains, see Configuration reference.
Automations (cron)
{
cron: {
enabled: true,
triggers: {
enabled: true,
},
webhookToken: "replace-with-dedicated-token", // optional bearer token for outbound webhook auth
webhookSsrfPolicy: {
allowedHostnames: ["127.0.0.1"], // optional exact exception for a trusted receiver
},
sessionRetention: "24h", // duration string ("0h" disables) or false
},
}enabled: execute stored automation jobs (default:true). Setfalseto pause all automation execution without deleting jobs.skipMissedJobs: skip missed recurring (cron/every) slots at startup and advance to the next future occurrence (default:false). One-shot (at) catch-up is unchanged.triggers.enabled: run event-driven automation triggers (default:true). Setfalseto disable condition triggers, script payloads, and stream schedules.sessionRetention: how long to keep completed isolated automation run sessions before pruning SQLite session rows. Also controls cleanup of archived deleted automation transcripts. Default:24h; setfalseor a zero duration such as"0h"to disable (negative durations are invalid).- Terminal run history is retained for 7 days (
lostrows for 24 hours), with the newest 2000 rows per job and history class enforced as an additional ceiling. webhookToken: bearer token used for automation webhook POST delivery (delivery.mode = "webhook"), if omitted no auth header is sent.webhookSsrfPolicy: shared outbound SSRF policy for primary, completion, failure-destination, and failure-alert webhooks. Private/internal targets are blocked when omitted. Prefer exactallowedHostnames; usedangerouslyAllowPrivateNetwork: trueonly for trusted private-network receivers. The narrow fake-IP proxy flags areallowRfc2544BenchmarkRangeandallowIpv6UniqueLocalRange.webhookSsrfPolicy.blockedHostnames: denies exact hosts and wildcard subdomains before DNS and all allow rules.*.example.comexcludes the apex; addexample.comseparately to block it. Empty or unset adds no denials.
The cron block is strict; cron.enabled, cron.skipMissedJobs, cron.triggers, cron.webhookToken,
cron.webhookSsrfPolicy, cron.sessionRetention, and cron.failureAlert are the only accepted keys. The
retired cron.webhook fallback URL is gone: runtime delivery uses per-job
delivery.mode = "webhook" plus delivery.to, or delivery.completionDestination
when preserving announce delivery. openclaw doctor --fix strips a leftover
cron.webhook from existing config files.
cron.failureAlert
{
cron: {
failureAlert: {
enabled: false,
after: 2,
cooldownMs: 3600000,
includeSkipped: false,
mode: "announce",
channel: "last",
to: "channel:C1234567890",
accountId: "main",
},
},
}cron.failureAlert owns the global alert policy and its default destination. Jobs
with an existing failure route are covered by default after 2 consecutive
execution failures with a 1-hour cooldown; a cron.failureAlert object explicitly
activates/tunes the policy even when no route existed. The retired
cron.failureDestination block is merged into it by
openclaw doctor --fix.
enabled: explicitly enable or disable the global policy.falsedisables inherited notifications unless a job has its ownfailureAlertobject;trueexplicitly enables globally. Omitting it preserves route-backed defaults.after: consecutive failures before an alert fires (positive integer, min:1; default:2).cooldownMs: minimum milliseconds between repeated alerts for the same job (non-negative integer; default:3600000).includeSkipped: count consecutive skipped runs toward the alert threshold (default:false). Skipped runs are tracked separately and do not affect execution-error backoff.mode: delivery mode -"announce"sends via a channel message;"webhook"posts to the target into. Defaults to"announce"when enough target data exists.channel: channel override for announce delivery."last"reuses the last known delivery channel.to: explicit announce target or webhook URL. Required for webhook mode.accountId: optional account or channel id to scope alert delivery.- Route precedence is per-job
failureAlertroute fields, then per-jobdelivery.failureDestinationlayered over these global destination fields, then the primary announce target. - Per-job
failureAlert: falsedisables execution and required-delivery failure alerts for that job; the auto-disable safety notification remains active. Any per-jobfailureAlertobject explicitly enables and tunes that job. delivery.bestEffort: truesuppresses inherited/default execution alerts; an explicit per-jobfailureAlertremains authoritative.- Required completion-delivery failure (
status: "ok",completionStatus: "failed") does not increment execution backoff and may notify immediately only through a resolved alternate failure destination, not the failed primary route. delivery.failureDestinationis only supported forsessionTarget="isolated"jobs unless the job's primarydelivery.modeis"webhook".
See Automations. Cron records isolated automation run history.
Media model template variables
Template placeholders expanded in tools.media.models[].args:
| Variable | Description |
|---|---|
{{Body}} | Full inbound message body |
{{RawBody}} | Raw body (no history/sender wrappers) |
{{BodyStripped}} | Body with group mentions stripped |
{{From}} | Sender identifier |
{{To}} | Destination identifier |
{{MessageSid}} | Channel message id |
{{SessionId}} | Current session UUID |
{{IsNewSession}} | "true" when new session created |
{{AttachmentUrl}} | Current attachment URL or provider reference |
{{AttachmentPath}} | Current attachment local path |
{{AttachmentContentType}} | Current attachment MIME content type |
{{AttachmentDir}} | Directory containing AttachmentPath |
{{AttachmentIndex}} | Zero-based source fact index |
{{Transcript}} | Audio transcript |
{{Prompt}} | Resolved media prompt for CLI entries |
{{MaxChars}} | Resolved max output chars for CLI entries |
{{ChatType}} | "direct" or "group" |
{{GroupSubject}} | Group subject (best effort) |
{{GroupMembers}} | Group members preview (best effort) |
{{SenderName}} | Sender display name (best effort) |
{{SenderE164}} | Sender phone number (best effort) |
{{Provider}} | Provider hint (whatsapp, telegram, discord, etc.) |
The legacy {{MediaPath}}, {{MediaUrl}}, {{MediaType}}, and {{MediaDir}}
names remain available during the plugin SDK compatibility window but are
deprecated. New configuration should use the Attachment* variables.