About This Guide: OpenClaw's cron system is the Gateway's built-in scheduler — it persists jobs, wakes agents at the right time, and can deliver output back to your chat. This advanced Q&A covers every single cron command: cron add, cron edit, cron run, cron list, cron runs, cron remove, cron status, and system event. Every flag, delivery mode, timezone config, model override, and edge case is covered.
Cron Architecture Overview
# Cron subsystem lives inside the Gateway process
~/.openclaw/cron/
├── jobs.json # persistent job store
└── runs/
└── <jobId>.jsonl # run history (auto-pruned)
# Two execution styles:
├── Main session # systemEvent payload, runs on heartbeat
└── Isolated session # agentTurn payload, dedicated cron: session
openclaw cron add: Creating Jobs
Q What are the three schedule types and how do I use them?
Type 1: --at (one-shot at specific time)
# Fire once at a specific ISO 8601 time
openclaw cron add \
--name "Reminder" \
--at "2026-02-28T16:00:00Z" \
--session main \
--system-event "Reminder: review monthly report." \
--wake now \
--delete-after-run
# Or: relative time (in 20 minutes)
openclaw cron add --name "Quick" --at "20m" \
--session main --system-event "Check status."
Type 2: --every (fixed interval)
# Run every 30 minutes
openclaw cron add \
--name "Heartbeat check" \
--every 30m \
--session isolated \
--message "Run quick system check." \
--announce
Type 3: --cron (cron expression)
# Run at 7am daily, LA timezone
openclaw cron add \
--name "Morning brief" \
--cron "0 7 * * *" \
--tz "America/Los_Angeles" \
--session isolated \
--message "Summarize overnight updates." \
--announce \
--channel slack \
--to "channel:C1234567890"
Q What's the difference between --session main and --session isolated?
| Mode | How It Runs | Payload Type | Best For |
|---|---|---|---|
| main | Enqueues a system event for the next heartbeat run | systemEvent | Reminders, context-aware tasks using main conversation history |
| isolated | Runs a dedicated agent turn in cron: session (fresh context) |
agentTurn | Background chores, reports, tasks that shouldn't pollute main history |
# Main session: uses systemEvent + heartbeat
openclaw cron add --name "Calendar reminder" \
--at "2026-03-01T09:00:00Z" \
--session main \
--system-event "Reminder: team sync at 10am." \
--wake now
# Isolated: uses agentTurn (fresh context, no history carry-over)
openclaw cron add --name "Nightly report" \
--cron "0 23 * * *" --tz "UTC" \
--session isolated \
--message "Compile daily activity report." \
--announce --channel telegram --to "123456789"
Q How do I add a cron job with model override and thinking level?
Isolated jobs can override the AI model and thinking level. This lets specific cron tasks use more powerful (or faster) models than your default.
# Deep weekly analysis with Opus + high thinking
openclaw cron add \
--name "Weekly deep analysis" \
--cron "0 6 * * 1" \
--tz "America/Los_Angeles" \
--session isolated \
--message "Weekly deep analysis of project progress." \
--model "opus" \
--thinking high \
--announce \
--channel whatsapp \
--to "+15551234567"
# Fast daily check with sonnet (lighter model)
openclaw cron add \
--name "Daily status" \
--cron "0 8 * * *" --tz "UTC" \
--session isolated \
--message "Quick status summary." \
--model "anthropic/claude-sonnet-4-20250514" \
--announce
Model resolution priority: Agent config default → Hook-specific defaults → Job payload override (highest). Thinking mode only works with GPT-5.2+ and Codex models.
Q What is stagger and when should I use --exact?
OpenClaw applies a deterministic stagger window of up to 5 minutes for top-of-hour cron expressions (like 0 * * * *) to prevent load spikes across many gateways. Use --exact to force exact timing.
# Force exact timing (no stagger)
openclaw cron add \
--name "Exact hourly" \
--cron "0 * * * *" --tz "UTC" --exact \
--session isolated \
--message "Exactly on the hour check."
# Custom 30-second stagger window
openclaw cron add \
--name "Minute watcher" \
--cron "0 * * * * *" --tz "UTC" \
--stagger 30s \
--session isolated \
--message "Run minute watcher checks." --announce
# Note: fixed-hour expressions like "0 7 * * *" are always exact
openclaw cron edit: Updating Jobs
Q How do I edit an existing cron job?
Use openclaw cron edit <jobId> with the fields you want to change. You can update the message, model, thinking level, schedule, and agent assignment.
# Update message and model
openclaw cron edit <jobId> \
--message "Updated prompt text" \
--model "opus" \
--thinking low
# Disable a job temporarily
openclaw cron edit <jobId> --enabled false
# Re-enable it
openclaw cron edit <jobId> --enabled true
# Pin to a specific agent
openclaw cron edit <jobId> --agent ops
# Clear agent binding (fall back to default)
openclaw cron edit <jobId> --clear-agent
# Force exact timing (remove stagger)
openclaw cron edit <jobId> --exact
cron run, list, runs & remove Commands
Q How do I manually trigger a cron job?
openclaw cron run <jobId> triggers a job immediately. By default it uses --force mode (always runs). Use --due to only run if the job would normally be due.
# Force-run immediately (default)
openclaw cron run <jobId>
# Run only if the job is currently due
openclaw cron run <jobId> --due
Q How do I list all scheduled cron jobs?
openclaw cron list shows all jobs in your store with their IDs, schedules, enabled status, and last/next run times.
# List all cron jobs
openclaw cron list
# Example output:
ID NAME SCHEDULE ENABLED NEXT RUN
job-abc Morning brief 0 7 * * * true 2026-02-21 07:00
job-def Weekly report 0 6 * * 1 true 2026-02-23 06:00
job-ghi Battery check every 30m false (disabled)
Q How do I view a cron job's run history?
openclaw cron runs shows the execution history for a specific job. Run history is stored as JSONL at ~/.openclaw/cron/runs/<jobId>.jsonl and is auto-pruned.
# Get run history for a specific job
openclaw cron runs --id <jobId>
# Limit to last 50 runs
openclaw cron runs --id <jobId> --limit 50
# Run history stored at:
~/.openclaw/cron/runs/<jobId>.jsonl
Q How do I delete a cron job?
Use openclaw cron remove <jobId>. This permanently deletes the job from the store. For temporary disabling, use cron edit <jobId> --enabled false instead.
# Permanently remove a cron job
openclaw cron remove <jobId>
# Or temporarily disable (reversible)
openclaw cron edit <jobId> --enabled false
Cron Delivery Modes: announce, webhook, none
Q What are the three delivery modes and how do they work?
| Mode | What Happens | Requires |
|---|---|---|
| announce | Delivers output to the specified channel via outbound adapters. Also posts a brief summary to main session. | --channel + --to |
| webhook | POSTs the finished event JSON payload to a webhook URL. No channel delivery, no main-session summary. | --webhook-url |
| none | No delivery. Job runs internally only, no output posted anywhere. | — |
# Announce to WhatsApp
openclaw cron add --name "Morning" --cron "0 7 * * *" --tz "UTC" \
--session isolated --message "Daily brief." \
--announce --channel whatsapp --to "+15551234567"
# Webhook delivery
openclaw cron add --name "Webhook report" --cron "0 18 * * *" --tz "UTC" \
--session isolated --message "Generate EOD report." \
--webhook "https://hooks.example.com/openclaw-report"
# Internal only (no delivery)
openclaw cron add --name "Silent check" --cron "*/15 * * * *" --tz "UTC" \
--session isolated --message "Internal health check." \
--no-announce
Q How do I deliver to a Telegram forum topic?
Telegram supports forum topics via message_thread_id. Encode the topic into the --to field using these formats:
# Preferred: explicit topic marker
--to "-1001234567890:topic:123"
# Shorthand: numeric suffix
--to "-1001234567890:123"
# Full chat only (no topic)
--to "-1001234567890"
# Full example with forum topic delivery
openclaw cron add \
--name "Nightly summary to topic" \
--cron "0 22 * * *" --tz "America/Los_Angeles" \
--session isolated \
--message "Summarize today. Send to nightly topic." \
--announce --channel telegram \
--to "-1001234567890:topic:123"
openclaw system event: Immediate Triggers
Q
What is openclaw system event and when should I use it?
openclaw system event sends an immediate system event to the main agent session without creating a persistent cron job. It's the CLI shortcut for one-off triggers that don't need to repeat.
# Send immediate system event (triggers next heartbeat now)
openclaw system event --mode now --text "Check battery status immediately."
# Queue for next scheduled heartbeat
openclaw system event --mode next-heartbeat --text "Next heartbeat: review inbox."
Use system event when:
- → One-off immediate trigger
- → No repeat schedule needed
- → Quick test without creating a job
- → Manual heartbeat trigger
Use cron add when:
- → Repeating schedule needed
- → Future one-shot (--at)
- → Need delivery to channels
- → Need run history tracking
Multi-Agent Cron & Configuration
Q How do I pin a cron job to a specific agent in multi-agent setups?
Use --agent <name> when creating a job. If the named agent doesn't exist, the gateway falls back to the default agent.
# Pin job to "ops" agent
openclaw cron add --name "Ops sweep" \
--cron "0 6 * * *" --session isolated \
--message "Check ops queue" --agent ops
# Switch agent on existing job
openclaw cron edit <jobId> --agent ops
# Clear agent binding (revert to default)
openclaw cron edit <jobId> --clear-agent
Q How do I disable or limit cron in config?
# Disable cron entirely via env var
OPENCLAW_SKIP_CRON=1 openclaw gateway
# Disable via config
{"cron": {"enabled": false}}
# Full cron config options
{"cron": {
"enabled": true,
"store": "~/.openclaw/cron/jobs.json",
"maxConcurrentRuns": 1,
"webhookToken": "bearer-token-for-webhook-auth"
}}
Cron Troubleshooting
"Nothing runs" / jobs not triggering
- → Check
cron.enabledandOPENCLAW_SKIP_CRON - → Confirm timezone is correct with
--tz - → Gateway must be running continuously (cron runs inside Gateway)
- → Run
openclaw cron listto verify job is enabled
Recurring job keeps delaying after failures
- → OpenClaw applies exponential retry backoff: 30s → 1m → 5m → 15m → 60m
- → Backoff resets after the next successful run
- → Use
openclaw cron run <jobId>to manually trigger and reset
Telegram delivers to wrong place
- → Use explicit
:topic:marker in the--tovalue - → Example:
-100123...:topic:456
Complete Cron Command Reference
# ─── Add Jobs ───
openclaw cron add --name "..." --at "ISO-or-relative" --session main --system-event "..."
openclaw cron add --name "..." --every 30m --session isolated --message "..." --announce
openclaw cron add --name "..." --cron "0 7 * * *" --tz "UTC" --session isolated --message "..."
# ─── Edit Jobs ───
openclaw cron edit <jobId> --message "Updated" --model "opus" --thinking high
openclaw cron edit <jobId> --enabled false
openclaw cron edit <jobId> --agent ops
openclaw cron edit <jobId> --clear-agent
openclaw cron edit <jobId> --exact
# ─── List & Status ───
openclaw cron list
openclaw cron status
# ─── Run Manually ───
openclaw cron run <jobId> # force run
openclaw cron run <jobId> --due # run only if due
# ─── View History ───
openclaw cron runs --id <jobId> --limit 50
# ─── Remove ───
openclaw cron remove <jobId>
# ─── Immediate Trigger ───
openclaw system event --mode now --text "Immediate trigger text."
openclaw system event --mode next-heartbeat --text "Queue for next heartbeat."
Best VPN for 24/7 OpenClaw Cron Jobs
VPN07 — #1 for Always-On Cron Reliability
Cron jobs that deliver to Telegram, Slack, and WhatsApp via webhooks need a stable, fast network. VPN07's 1000Mbps bandwidth across 70+ countries ensures your OpenClaw cron announcements and webhook deliveries go through every time — even scheduled at 3am. 10 years of uptime. Just $1.5/month.
2. Private Internet Access
6.9/10Decent uptime but known for connection drops at peak hours. Risky for cron jobs that must deliver on schedule. Not suitable for mission-critical OpenClaw automation.
3. TunnelBear
6.2/10Fun branding but data caps on free tier and slower paid speeds. Webhook delivery from cron jobs requires a stable, cap-free connection that TunnelBear can't consistently provide.
Related Articles
OpenClaw Agent Commands 2026: Thinking & Sessions Q&A
Every agent flag: thinking levels, deliver, sessions, local mode, JSON output.
Read More → Gateway GuideOpenClaw Gateway Commands 2026: Operator Q&A
Complete gateway commands: start, stop, restart, port config, hot reload.
Read More →Keep Your Cron Jobs Running 24/7 with VPN07
OpenClaw cron jobs run around the clock — your VPN should too. VPN07 delivers 1000Mbps across 70+ countries with 99.9% uptime, so every scheduled announcement, webhook call, and agent run hits on time. 10 years proven. Just $1.5/month with a 30-day money-back guarantee.