Cron Jobs
Jobs cron del programador del Gateway + wake.
Nota
Cron es el programador integrado del gateway. Mantiene jobs, despierta al agente
en el momento correcto, y puede opcionalmente enviar output de vuelta al chat.
Si quieres _"ejecutar esto cada mañana"_ o _"avisar al agente en 20 minutos"_,
cron es el mecanismo.
En resumen; TL;DR
- Cron corre <strong>dentro del gateway</strong> (no dentro del modelo).
- Los jobs persisten bajo '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'~/.openclaw/cron/'</code>', así que los reinicios no pierden horarios.
- Dos modos de ejecución:
- <strong>Sesión principal</strong>: encola un evento de sistema, luego corre en el próximo heartbeat.
- '<strong>'Aislado'</strong>': corre un turno de agente dedicado en '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'cron:<jobId>'</code>', opcionalmente entregando output.
- Wake es first-class: los jobs pueden solicitar "wake now" vs "next heartbeat".
Inicio rápido (accionable)
Crea un recordatorio único, verifica que existe, y ejecútalo inmediatamente:
openclaw cron add --name "Reminder" --at "2026-02-01T16:00:00Z" --session main --system-event "Reminder: check the cron docs draft" --wake now --delete-after-run openclaw cron list openclaw cron run <job-id> --force openclaw cron runs --id <job-id>
Programa un job aislado repetitivo con entrega:
openclaw cron add --name "Morning brief" --cron "0 7 * * *" --tz "America/Los_Angeles" --session isolated --message "Summarize overnight updates." --deliver --channel slack --to "channel:C1234567890"
Equivalentes de llamada de herramienta (gateway cron tools)
Ver '<a href="/automation/cron-jobs#json-schema-for-tool-calls" className="text-emerald-400 hover:text-emerald-300 transition-colors">'JSON schema para llamadas de herramienta'</a>' para la forma JSON canónica y ejemplos.
Dónde se almacenan los jobs cron
Por defecto, los jobs cron persisten en el host del gateway en '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'~/.openclaw/cron/jobs.json'</code>'.
El gateway carga el archivo en memoria y lo escribe de vuelta en cambios, así que la edición manual
solo es segura cuando el gateway está detenido. Prefiere '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'openclaw cron add/edit'</code>' o APIs
de llamada de herramienta cron para cambios.
Resumen amigable para principiantes
Piensa en un job cron como: <strong>cuándo</strong> ejecutar + <strong>qué</strong> hacer.
1. <strong>Elige un horario</strong>
- Recordatorio único → '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'schedule.kind = "at"'</code>' (CLI: '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'--at'</code>')
- Job repetitivo → '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'schedule.kind = "every"'</code>' o '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'schedule.kind = "cron"'</code>'
- Si tu timestamp ISO omite zona horaria, se trata como <strong>UTC</strong>.
2. <strong>Elige dónde ejecutar</strong>
- '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'sessionTarget: "main"'</code>' → corre en contexto principal durante el próximo heartbeat.
- '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'sessionTarget: "isolated"'</code>' → corre un turno de agente dedicado en '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'cron:<jobId>'</code>'.
3. <strong>Elige un payload</strong>
- Sesión principal → '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'payload.kind = "systemEvent"'</code>'
- Sesión aislada → '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'payload.kind = "agentTurn"'</code>'
Opcional: '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'deleteAfterRun: true'</code>' remueve un job único exitoso del almacenamiento.
Conceptos
#
Jobs
Un job cron es un registro almacenado de:
- un <strong>horario</strong> (cuándo ejecutar),
- un <strong>payload</strong> (qué debe hacer),
entrega <strong>opcional</strong> (dónde debe enviarse el output).
- vinculación '<strong>'opcional de agente'</strong>' ('<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'agentId'</code>'): ejecuta el job bajo un agente específico; si
falta o es desconocido, el gateway recurre al agente predeterminado.
Los jobs se identifican por un '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'jobId'</code>' estable (usado por CLI/gateway API).
En llamadas de herramienta de agente, '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'jobId'</code>' es canónico; legacy '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'id'</code>' se acepta por compatibilidad.
Los jobs pueden auto-eliminarse opcionalmente después de una ejecución única exitosa vía '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'deleteAfterRun: true'</code>'.
#
Horarios
Cron soporta tres tipos de horario:
- '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'at'</code>': timestamp único (milisegundos desde epoch). El Gateway acepta ISO 8601 y coerce a UTC.
- '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'every'</code>': intervalo fijo (milisegundos).
- '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'cron'</code>': expresión cron de 5 campos con zona horaria IANA opcional.
Las expresiones cron usan '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'croner'</code>'. Si se omite zona horaria, se usa la zona horaria
local del host del gateway.
#
Ejecución Main vs Isolated
##
Jobs de sesión principal (eventos de sistema)
Los jobs main encolan un evento de sistema y opcionalmente despiertan el runner de heartbeat.
Deben usar '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'payload.kind = "systemEvent"'</code>'.
- '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'wakeMode: "next-heartbeat"'</code>' (predeterminado): el evento espera el próximo heartbeat programado.
- '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'wakeMode: "now"'</code>': el evento dispara una ejecución de heartbeat inmediata.
Esto es mejor cuando quieres un prompt de heartbeat normal + contexto de sesión principal.
ReferenceAutomationCronJobsPage.step10.p6
ReferenceAutomationCronJobsPage.step10.content
Jobs aislados (sesiones cron dedicadas)
Los jobs aislados ejecutan un turno de agente dedicado en sesión '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'cron:<jobId>'</code>'.
Comportamientos clave:
- Los prompts se prefijan con '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'[cron:<jobId> <job name>]'</code>' para trazabilidad.
- Cada ejecución inicia un <strong>nuevo ID de sesión</strong> (sin arrastre de conversación previa).
- El resumen se publica en la sesión principal (prefijo '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'Cron'</code>', configurable).
- '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'wakeMode: "now"'</code>' dispara heartbeat inmediatamente después de publicar el resumen.
- Si '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'payload.deliver: true'</code>', el output se entrega al canal; de lo contrario permanece interno.
Usa jobs aislados para tareas ruidosas, frecuentes, o "quehaceres en segundo plano" que no deberían
spamear tu historial de chat principal.
#
Formas de payload (qué se ejecuta)
Dos tipos de payload son soportados:
- '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'systemEvent'</code>': solo sesión principal, enrutado vía prompt de heartbeat.
- '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'agentTurn'</code>': solo sesión aislada, ejecuta un turno de agente dedicado.
Campos comunes de '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'agentTurn'</code>':
- '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'message'</code>': prompt de texto requerido.
- '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'model'</code>' / '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'thinking'</code>': anulaciones opcionales (ver abajo).
- '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'timeoutSeconds'</code>': anulación de timeout opcional.
- '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'deliver'</code>': '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'true'</code>' envía output al objetivo de canal.
- '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'channel'</code>': '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'last'</code>' o canal específico.
- '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'to'</code>': objetivo específico de canal (teléfono/chat/channel ID).
- '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'bestEffortDeliver'</code>': evitar fallo de job en fallo de entrega.
Opciones de aislamiento (solo para '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'session=isolated'</code>'):
- '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'postToMainPrefix'</code>' (CLI: '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'--post-prefix'</code>'): prefijo para evento de sistema en main.
- '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'postToMainMode'</code>': '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'summary'</code>' (predeterminado) o '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'full'</code>'.
- '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'postToMainMaxChars'</code>': máx caracteres cuando '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'postToMainMode=full'</code>' (predeterminado 8000).
#
Anulaciones de modelo y thinking
Los jobs aislados ('<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'agentTurn'</code>') pueden anular modelo y nivel de thinking:
- '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'model'</code>': string proveedor/modelo (ej., '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'anthropic/claude-sonnet-4-20250514'</code>') o alias (ej., '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'opus'</code>')
- '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'thinking'</code>': nivel de thinking ('<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'off'</code>', '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'minimal'</code>', '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'low'</code>', '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'medium'</code>', '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'high'</code>', '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'xhigh'</code>'; solo modelos GPT-5.2 + Codex)
Nota: También puedes establecer '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'model'</code>' en un job de sesión principal, pero cambia el modelo de sesión
principal compartido. Recomendamos anulaciones de modelo solo para jobs aislados para evitar
cambios de contexto inesperados.
Prioridad de resolución:
1. Anulación de payload de job (más alta)
2. Defaults específicos de hook (ej., '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'hooks.gmail.model'</code>')
3. Defaults de config de agente
#
Entrega (canal + objetivo)
- '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'channel'</code>': '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'whatsapp'</code>' / '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'telegram'</code>' / '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'discord'</code>' / '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'slack'</code>' / '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'mattermost'</code>' (plugin) / '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'signal'</code>' / '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'imessage'</code>' / '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'last'</code>'
- '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'to'</code>': objetivo de destinatario específico del canal
Si se omite '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'channel'</code>' o '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'to'</code>', cron puede recurrir a la "última ruta" de la sesión principal
(donde el agente respondió por última vez).
Notas de entrega:
- Si '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'to'</code>' está establecido, cron entrega automáticamente la salida final del agente incluso si se omite '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'deliver'</code>'.
- Usa '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'deliver: true'</code>' cuando quieres entrega de última ruta sin un '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'to'</code>' explícito.
- Usa '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'deliver: false'</code>' para mantener la salida interna incluso si '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'to'</code>' está presente.
Recordatorios de formato de objetivo:
- Los objetivos Slack/Discord/Mattermost (plugin) deben usar prefijos explícitos (ej., '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'channel:<id>'</code>', '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'user:<id>'</code>') para evitar ambigüedad.
- Los temas de Telegram deben usar formato '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">':topic:'</code>' (ver abajo).
##
Objetivos de entrega de Telegram (temas/hilos de foro)
Telegram soporta temas de foro vía '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'message_thread_id'</code>'. Para entrega cron, puedes codificar
el tema/hilo en el campo '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'to'</code>':
- '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'-1001234567890'</code>' (solo ID de chat)
- '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'-1001234567890:topic:123'</code>' (preferido: marcador de tema explícito)
- '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'-1001234567890:123'</code>' (abreviatura: sufijo numérico)
Los objetivos con prefijo como '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'telegram:...'</code>' / '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'telegram:group:...'</code>' también son aceptados:
- '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'telegram:group:-1001234567890:topic:123'</code>'
JSON schema for tool calls
ReferenceAutomationCronJobsPage step 16: P1
ReferenceAutomationCronJobsPage step 16: P2
ReferenceAutomationCronJobsPage step 16: Content
Ejemplos
Recordatorio único:
{
"name": "Reminder",
"schedule": { "kind": "at", "atMs": 1738262400000 },
"sessionTarget": "main",
"wakeMode": "now",
"payload": { "kind": "systemEvent", "text": "Reminder text" },
"deleteAfterRun": true
}Trabajo de entrega aislado repetitivo:
{
"name": "Morning brief",
"schedule": { "kind": "cron", "expr": "0 7 * * *", "tz": "America/Los_Angeles" },
"sessionTarget": "isolated",
"wakeMode": "next-heartbeat",
"payload": {
"kind": "agentTurn",
"message": "Summarize overnight updates.",
"deliver": true,
"channel": "slack",
"to": "channel:C1234567890",
"bestEffortDeliver": true
},
"isolation": { "postToMainPrefix": "Cron", "postToMainMode": "summary" }
}Notas:
- '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'schedule.kind'</code>': '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'at'</code>' ('<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'atMs'</code>'), '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'every'</code>' ('<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'everyMs'</code>') o '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'cron'</code>' ('<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'expr'</code>', opcional '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'tz'</code>').
- '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'atMs'</code>' y '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'everyMs'</code>' son epoch milisegundos.
- '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'sessionTarget'</code>' debe ser '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'"main"'</code>' o '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'"isolated"'</code>' y debe coincidir con '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'payload.kind'</code>'.
- Campos opcionales: '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'agentId'</code>', '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'description'</code>', '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'enabled'</code>', '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'deleteAfterRun'</code>', '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'isolation'</code>'.
- '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'wakeMode'</code>' predetermina a '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'"next-heartbeat"'</code>' cuando se omite.
#
parámetros de cron.update
{
"jobId": "job-123",
"patch": {
"enabled": false,
"schedule": { "kind": "every", "everyMs": 3600000 }
}
}Notas:
- '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'jobId'</code>' es canónico; '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'id'</code>' es aceptado por compatibilidad.
- Usa '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'agentId: null'</code>' en patch para limpiar el binding de agente.
#
parámetros de cron.run y cron.remove
{ "jobId": "job-123", "mode": "force" }{ "jobId": "job-123" }Almacenamiento e historial
- Almacenamiento de trabajos: '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'~/.openclaw/cron/jobs.json'</code>' (JSON gestionado por gateway).
- Historial de ejecuciones: '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'~/.openclaw/cron/runs/<jobId>.jsonl'</code>' (JSONL, auto-recortado).
- Anular ruta de almacenamiento en config: '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'cron.store'</code>'.
Configuración
{
cron: {
enabled: true, // default true
store: "~/.openclaw/cron/jobs.json",
maxConcurrentRuns: 1, // default 1
},
}Deshabilitar cron completamente:
- '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'cron.enabled: false'</code>' (config)
- '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'OPENCLAW_SKIP_CRON=1'</code>' (entorno)
Inicio rápido CLI
Recordatorio único (ISO UTC, auto-eliminar después del éxito):
openclaw cron add --name "Send reminder" --at "2026-01-12T18:00:00Z" --session main --system-event "Reminder: submit expense report." --wake now --delete-after-run
Recordatorio único (sesión principal, wake inmediato):
openclaw cron add --name "Calendar check" --at "20m" --session main --system-event "Next heartbeat: check calendar." --wake now
Trabajo aislado repetitivo (enviar a WhatsApp):
openclaw cron add --name "Morning status" --cron "0 7 * * *" --tz "America/Los_Angeles" --session isolated --message "Summarize inbox + calendar for today." --deliver --channel whatsapp --to "+15551234567"
Trabajo aislado repetitivo (enviar a tema de Telegram):
openclaw cron add --name "Nightly summary (topic)" --cron "0 22 * * *" --tz "America/Los_Angeles" --session isolated --message "Summarize today; send to the nightly topic." --deliver --channel telegram --to "-1001234567890:topic:123"
ReferenceAutomationCronJobsPage.step22.p5
openclaw cron add --name "Deep analysis" --cron "0 6 * * 1" --tz "America/Los_Angeles" --session isolated --message "Weekly deep analysis of project progress." --model "opus" --thinking high --deliver --channel whatsapp --to "+15551234567"
ReferenceAutomationCronJobsPage.step22.p6
openclaw cron add --name "Ops sweep" --cron "0 6 * * *" --session isolated --message "Check ops queue" --agent ops openclaw cron edit <jobId> --agent ops openclaw cron edit <jobId> --clear-agent
ReferenceAutomationCronJobsPage.step22.p7
openclaw cron run <jobId> --force
ReferenceAutomationCronJobsPage.step22.p8
openclaw cron edit <jobId> --message "Updated prompt" --model "opus" --thinking low
ReferenceAutomationCronJobsPage.step22.p9
openclaw cron runs --id <jobId> --limit 50
ReferenceAutomationCronJobsPage.step22.p10
openclaw system event --mode now --text "Next heartbeat: check battery."
Gateway API
- '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'cron.list'</code>', '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'cron.status'</code>', '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'cron.add'</code>', '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'cron.update'</code>', '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'cron.remove'</code>'
- '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'cron.run'</code>' (force or due), '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'cron.runs'</code>'
Para eventos de sistema inmediatos sin un trabajo, usa '<a href="/cli/system" className="text-emerald-400 hover:text-emerald-300 transition-colors">''<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'openclaw system event'</code>''</a>'.
Troubleshooting
#
"Nothing runs"
- Check if cron is enabled: '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'cron.enabled'</code>' and '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'OPENCLAW_SKIP_CRON'</code>'.
- Check that gateway is running continuously (cron runs inside the gateway process).
- For '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'cron'</code>' schedules: confirm timezone ('<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'--tz'</code>') matches host timezone.
#
Telegram sends to wrong place
- For forum topics, use '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'-100…:topic:<id>'</code>' to be explicit and unambiguous.
- If you see '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'telegram:...'</code>' prefixes in logs or stored "last route" targets, this is normal;
cron delivery accepts them and still parses topic IDs correctly.