OpenClawSkills
GitHub
Automatización • 5 min de lectura

Cron Jobs

Jobs cron del programador del Gateway + wake.

Nota

''¿Cron vs Heartbeat?'' Ver ''Cron vs Heartbeat'' para una guía de cuándo usar cada uno.

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.

Tutorial.step

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:&lt;jobId&gt;'</code>', opcionalmente entregando output.

- Wake es first-class: los jobs pueden solicitar "wake now" vs "next heartbeat".

Tutorial.step

Inicio rápido (accionable)

Crea un recordatorio único, verifica que existe, y ejecútalo inmediatamente:

Bash
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:

Bash
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"
Tutorial.step

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.

Tutorial.step

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.

Tutorial.step

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 = &quot;at&quot;'</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 = &quot;every&quot;'</code>' o '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'schedule.kind = &quot;cron&quot;'</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: &quot;main&quot;'</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: &quot;isolated&quot;'</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:&lt;jobId&gt;'</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 = &quot;systemEvent&quot;'</code>'

- Sesión aislada → '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'payload.kind = &quot;agentTurn&quot;'</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.

Tutorial.step

Conceptos

#

Tutorial.step

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>'.

#

Tutorial.step

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.

#

Tutorial.step

Ejecución Main vs Isolated

##

Tutorial.step

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 = &quot;systemEvent&quot;'</code>'.

- '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'wakeMode: &quot;next-heartbeat&quot;'</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: &quot;now&quot;'</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

Tutorial.step

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:&lt;jobId&gt;'</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:&lt;jobId&gt; &lt;job name&gt;]'</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: &quot;now&quot;'</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.

#

Tutorial.step

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).

#

Tutorial.step

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

#

Tutorial.step

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:&lt;id&gt;'</code>', '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'user:&lt;id&gt;'</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).

##

Tutorial.step

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>'

Tutorial.step

JSON schema for tool calls

ReferenceAutomationCronJobsPage step 16: P1

ReferenceAutomationCronJobsPage step 16: P2

ReferenceAutomationCronJobsPage step 16: Content

Tutorial.step

Ejemplos

Recordatorio único:

Json
{
  "name": "Reminder",
  "schedule": { "kind": "at", "atMs": 1738262400000 },
  "sessionTarget": "main",
  "wakeMode": "now",
  "payload": { "kind": "systemEvent", "text": "Reminder text" },
  "deleteAfterRun": true
}

Trabajo de entrega aislado repetitivo:

Json
{
  "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">'&quot;main&quot;'</code>' o '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'&quot;isolated&quot;'</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">'&quot;next-heartbeat&quot;'</code>' cuando se omite.

#

Tutorial.step

parámetros de cron.update

Json
{
  "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.

#

Tutorial.step

parámetros de cron.run y cron.remove

Json
{ "jobId": "job-123", "mode": "force" }
Json
{ "jobId": "job-123" }
Tutorial.step

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/&lt;jobId&gt;.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>'.

Tutorial.step

Configuración

Json5
{
  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)

Tutorial.step

Inicio rápido CLI

Recordatorio único (ISO UTC, auto-eliminar después del éxito):

Bash
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):

Bash
openclaw cron add   --name "Calendar check"   --at "20m"   --session main   --system-event "Next heartbeat: check calendar."   --wake now

Trabajo aislado repetitivo (enviar a WhatsApp):

Bash
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):

Bash
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

Bash
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

Bash
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

Bash
openclaw cron run <jobId> --force

ReferenceAutomationCronJobsPage.step22.p8

Bash
openclaw cron edit <jobId>   --message "Updated prompt"   --model "opus"   --thinking low

ReferenceAutomationCronJobsPage.step22.p9

Bash
openclaw cron runs --id <jobId> --limit 50

ReferenceAutomationCronJobsPage.step22.p10

Bash
openclaw system event --mode now --text "Next heartbeat: check battery."
Tutorial.step

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>'.

Tutorial.step

Troubleshooting

#

Tutorial.step

"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.

#

Tutorial.step

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:&lt;id&gt;'</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.