#Cron is not working
1 messages · Page 1 of 1 (latest)
The good news is your cron did run. OK + HEARTBEAT_OK means the scheduler/agent side worked, so this looks like a delivery problem, not a cron-execution problem.
First, can you paste these?
openclaw --version
openclaw status --all
openclaw cron list
openclaw message send --channel telegram --target "<same target you used in cron>" --message "cron test"
A few likely causes here:
- the cron job has
announceon, but the savedchannel/totarget is missing or invalid - the Telegram target is wrong (
tomust be the actual Telegram chat id, not the bot id) - the bot can’t post to that Telegram destination
- the job was created on an older version and needs normalization
Also, if this is an older cron job, run:
openclaw doctor --fix
That one is specifically recommended for legacy cron delivery fields.
One more important detail: the ID in your screenshot looks like a run id, not necessarily the job id. To inspect the job properly:
openclaw cron list
openclaw cron runs --id <job-id> --limit 50
For Telegram delivery, target format should be:
- DM: your numeric Telegram chat/user id
- group/channel: numeric chat id, usually like
-100... - forum topic:
-100...:topic:<topicId>
Docs:
- https://docs.openclaw.ai/start/faq
- https://docs.openclaw.ai/automation/cron-jobs
- https://docs.openclaw.ai/channels/telegram
Paste those outputs and I’ll help narrow it down fast.
Let's do it step by step, one step at a time to fix the cron and setup
Yep, let’s do it one step at a time.
Step 1: please run this and paste the output:
openclaw --version
Version mismatch causes a weird amount of cron/delivery issues, so I want to rule that out first.
OpenClaw version: OpenClaw 2026.4.20 (115f05d)
OS: Windows 11
Installed on: WSL2 Ubuntu Linux
Nice, that version is recent, so we can stop blaming an old build.
Step 2: test Telegram delivery outside cron with the exact same target you used in the cron job:
openclaw message send --channel telegram --target "<same target>" --message "cron test"
Then tell me 2 things:
- did the Telegram message arrive?
- what output did the command print?
That will tell us immediately whether the problem is Telegram delivery or cron delivery config.
No message
openclaw message send --channel telegram --target "<same target>" --message "cron test" 🦞 OpenClaw 2026.4.20 (115f05d) — I'm not AI-powered, I'm AI-possessed. Big difference. │ ◇ Error: Unknown target "<same target>" for Telegram. Hint: <chatId>
Ah, yep, that error is expected, you pasted my placeholder literally 😅
Step 2 again: run it with your real Telegram target, ideally your DM chat ID first:
openclaw message send --channel telegram --target 123456789 --message "cron test"
Use:
123456789for a DM-1001234567890for a group/channel-1001234567890:topic:42for a forum topic
Then paste:
- the exact command you ran, with the real target
- the output
- whether the message arrived
If you are not sure what target you used in cron, paste the cron To value first and I’ll tell you if it looks right.
7900865099
This is my Telegram ID. Fill the command
Run this exactly:
openclaw message send --channel telegram --target 7900865099 --message "cron test"
Then paste:
- the command output
- whether the message arrived in Telegram
Got the message
``
openclaw message send --channel telegram --target 7900865099 --message "cron test" 🦞 OpenClaw 2026.4.20 (115f05d) — Type the command with confidence—nature will provide the stack trace if needed. │ ◇ ✅ Sent via Telegram. Message ID: 40
Perfect, that narrows it down a lot.
Your Telegram setup works. The problem is now almost certainly the saved cron delivery target/config.
Step 3: run this and paste the output:
openclaw cron list
I want the job ID for the failing cron, then I’ll give you the exact openclaw cron edit ... command to point it at 7900865099.
Nice, that confirms Telegram delivery is healthy. So we’re definitely in cron config territory now.
Next step: please run this and paste the output:
openclaw cron list
I need the job ID of the failing cron so I can give you the exact fix command.
I added a cron so It can show on the list
openclaw cron list 🦞 OpenClaw 2026.4.20 (115f05d) — Somewhere between 'hello world' and 'oh god what have I built.' │ ◇ ID Name Schedule Next Last Status Target Delivery Agent ID Model 1d5c2712-57ca-43c6-834a-f8742986ddf2 Night greetings at 2026-04-21 23:18Z in 4m - idle isolated announce -> telegram:7900865099 (explicit) - -
Nice, this one looks configured correctly:
- delivery:
announce -> telegram:7900865099 - target: explicit
- session: isolated
Step 4: manually trigger it now:
openclaw cron run 1d5c2712-57ca-43c6-834a-f8742986ddf2
Then tell me:
- what the command printed
- whether the Telegram message arrived
If it arrives, the old cron was probably just saved with bad delivery settings.
Alright, seems like the telegram is workin now. I'm testing it now on Discord. Ill send the output and the update
Perfect, that’s a good sign.
If the fresh cron delivers on Telegram and Discord, then the original problem was most likely the old cron’s saved delivery config, not your channel setup.
Send the output when you’ve got it, and we’ll confirm the fix from there.
Discord channel and Telegram cron is working, but DM is not working up. It shows error. My USer ID: 1302991150763999302
Yep, I think we found the Discord DM issue.
For Discord DMs, the target must be:
user:1302991150763999302
Not just the bare numeric ID. On Discord, bare numeric IDs are treated as channels.
Next step: test a direct Discord DM with the correct target format:
openclaw message send --channel discord --target user:1302991150763999302 --message "discord DM test"
Then tell me:
- what output it prints
- whether the DM arrives
If that works, we’ll use the same user:... format in the cron target.
Got the DM. Ill add now with user format and see
Nice, that should be the fix.
For future reference:
- Discord DM →
user:<id> - Discord channel →
channel:<id> - Telegram → plain chat id like
7900865099
Try the cron with user:1302991150763999302, and if it works you’re done. Send me the result and I’ll confirm.
It also worked when I clicked on her profile and copied the channel id
Yep, that also makes sense.
On Discord, a DM can be addressed either as:
user:<your-user-id>channel:<dm-channel-id>
So if copying the DM channel id from the profile flow worked, that’s valid too.
The root issue was just this:
- bare Discord numeric IDs are ambiguous
- for cron targets, use
user:<id>orchannel:<id> - for Telegram, use the plain chat id
So you should be good now 🎉
If this fixed it, please right-click the solution message → Apps → ✅ Mark Solution.
That helps Answer Overflow index it for the next person.
announce (discord -> user:1302991150763999302)
It didn't send. Ill add the crone again and send the cron list
Hold off on recreating it for a second, I want to catch the failing job while it’s still there.
Next step: run this and paste the Discord DM cron row:
openclaw cron list
If you see more than one cron, paste the one that says it delivers to Discord DM.
After that, I’ll give you the exact next command to inspect the failure reason.
None is still right now. Cause all was onetime run with "at" cron
The output:
openclaw cron list 🦞 OpenClaw 2026.4.20 (115f05d) — I'm not magic—I'm just extremely persistent with retries and coping strategies. │ ◇ No cron jobs. ```
This one after I added a cron so itll show in the list:
openclaw cron list 🦞 OpenClaw 2026.4.20 (115f05d) — It's not "failing," it's "discovering new ways to configure the same thing wrong." │ ◇ ID Name Schedule Next Last Status Target Delivery Agent ID Model 6d34f7de-e920-47a4-a937-4707f5bb9bf5 Night Greetings at 2026-04-21 23:51Z in 7m - idle isolated announce -> discord:channel:1302991150763999302 (explicit)
There it is, we found it.
Your cron is currently targeting:
discord:channel:1302991150763999302
That means OpenClaw is treating your user ID as a channel target, not a DM user target.
Fix this exact job with:
openclaw cron edit 6d34f7de-e920-47a4-a937-4707f5bb9bf5 --announce --channel discord --to "user:1302991150763999302"
Run that, then paste the output. After that we’ll do one final test.
Alright, my PC closed before. Ill run the cron list again and share it here
Yep, send the new openclaw cron list output.
Also, one important note: cron only runs while the Gateway is actually running, so if the PC/WSL box was closed asleep/off, the one-shot job would not fire during that time.
Paste the list and we’ll pick it up from there.
openclaw cron list 🦞 OpenClaw 2026.4.20 (115f05d) — Built by lobsters, for humans. Don't question the hierarchy. │ ◇ ID Name Schedule Next Last Status Target Delivery Agent ID Model ef4aa198-6edc-4a59-bc9c-01ba921004a9 Morning Greeting (Dis... at 2026-04-22 00:35Z in 7m - idle isolated announce -> discord:channel:1302991150763999302 (explicit)
Yep, same issue again, it’s still saved as:
discord:channel:1302991150763999302
So the To field was entered as a channel target again. For a Discord DM, it must be:
user:1302991150763999302
Run this exact fix:
openclaw cron edit ef4aa198-6edc-4a59-bc9c-01ba921004a9 --announce --channel discord --to "user:1302991150763999302"
Then run:
openclaw cron list
and paste the output so I can confirm it saved correctly this time.
openclaw cron list 🦞 OpenClaw 2026.4.20 (115f05d) — If you're lost, run doctor; if you're brave, run prod; if you're wise, run tests. │ ◇ ID Name Schedule Next Last Status Target Delivery Agent ID Model ef4aa198-6edc-4a59-bc9c-01ba921004a9 Morning Greeting (Dis... at 2026-04-22 00:35Z in 5m - idle isolated announce -> discord:channel:1302991150763999302 (explicit)
Still showing channel
If the list still shows discord:channel:..., then the edit did not stick.
So the next thing I need is the exact output of the edit command itself.
Please run this exact command and paste its output:
openclaw cron edit ef4aa198-6edc-4a59-bc9c-01ba921004a9 --announce --channel discord --to user:1302991150763999302
Two possibilities now:
- the edit command is failing and we’ll see why
- it says success, but still rewrites to
channel:which would smell like a real bug
Paste the edit output first, then we’ll know which one it is.
This time I added new cron and added
user id: 1302991150763999302
Now the output
c3e89617-4aef-4866-84c4-cb1f6325caa8 Morning Greeting (Dis... at 2026-04-22 00:40Z in 9m - idle isolated announce -> discord:user id:1302991150763999302 (explicit) - -
Fixed?
Close, but not fixed yet.
Right now it says:
discord:user id:1302991150763999302
It must be exactly:
user:1302991150763999302
No space, no id.
Fix this exact job:
openclaw cron edit c3e89617-4aef-4866-84c4-cb1f6325caa8 --announce --channel discord --to user:1302991150763999302
Then run:
openclaw cron list
and paste the row. I want to see it show:
announce -> discord:user:1302991150763999302
openclaw cron list
Yep, run:
openclaw cron list
Then paste the output row for that Discord DM cron here. I need to see whether it now says:
announce -> discord:user:1302991150763999302
Now both are showing channel:
ef4aa198-6edc-4a59-bc9c-01ba921004a9 Morning Greeting (Dis... at 2026-04-22 00:35Z in 1m - idle isolated announce -> discord:channel:1302991150763999302 (explicit) - - c3e89617-4aef-4866-84c4-cb1f6325caa8 Morning Greeting (Dis... at 2026-04-22 00:40Z in 6m - idle isolated announce -> discord:channel:1302991150763999302 (explicit) - -
Okay, I’m pretty sure this is the workaround path now.
Cron keeps saving your Discord DM target as a channel anyway, so using your user ID there is the wrong thing for this code path.
Use the actual Discord DM channel ID instead, the one you said worked when you copied it from the profile flow.
So the cron target should be:
channel:<your-working-discord-dm-channel-id>
Next step: paste that working DM channel ID here, and I’ll give you the exact openclaw cron edit ... command.
If this workaround is needed, it also smells like a real bug in Discord cron target handling.
Here's the channel ID:
1495627881609429032
I clicked my Bot profile and coped it
Perfect. Use that DM channel ID as the cron target.
Run this exact command for the newer Discord DM cron:
openclaw cron edit c3e89617-4aef-4866-84c4-cb1f6325caa8 --announce --channel discord --to channel:1495627881609429032
Then run:
openclaw cron list
and paste the row. I want to see it show:
announce -> discord:channel:1495627881609429032
If I turn on my PC, then do I need to open Ubuntu terminal and type: openclaw or It'll auto load with bootup?
Short version:
- If you installed the daemon/service with
openclaw onboard --install-daemonoropenclaw gateway install, you should not need to keep a terminal open. - If you did not install the daemon, then yes, you need to start it manually, not just
openclaw, but the gateway command. - On WSL2, cron only works while the WSL Ubuntu + Gateway are actually running. If the PC sleeps/shuts down, cron stops.
The quickest check is:
openclaw gateway status
If it is not installed as a service, install it with:
openclaw gateway install
Docs:
If you paste openclaw gateway status, I can tell you whether yours is set to auto-start or not.
How do I know if my Web UI is public and can anyone access it or just me and secured?
How do I know if my Web UI is public and can anyone access it or just me and secured?
Good question.
Usually, if you’re opening the UI at http://127.0.0.1:18789 or http://localhost:18789, it is not public. That is local-only.
What decides exposure is mainly:
gateway.bindloopback= local machine onlylan,tailnet, orcustom= reachable beyond localhost
gateway.auth.modetoken,password, ortrusted-proxy= protectednone= not protected, risky if non-loopback
So the simple rule is:
- loopback + token/password = just you, reasonably secured
- lan/tailnet/custom + token/password = reachable remotely, but protected
- anything non-loopback + auth none = unsafe/public-ish
If you want, paste this:
openclaw gateway status
and I’ll tell you exactly whether your setup is local-only or exposed.
Docs:
Yep, this one is not public.
The important lines are:
Gateway: bind=loopback (127.0.0.1)Probe note: Loopback-only gateway; only local clients can connect.Listening: 127.0.0.1:18789
So your Web UI is currently:
- local-only
- not open to the public internet
- reachable only from the same machine/WSL side
Also, your gateway service is installed and enabled:
Service: systemd (enabled)
So that part looks healthy too.
If you ever want remote access later, use Tailscale Serve or an SSH tunnel, not bind=lan. Docs: https://docs.openclaw.ai/web
Alright, so whenever i turn on my PC, the Bot will auto be active?
Almost, but with one important WSL2 caveat:
- Yes, your OpenClaw gateway is installed as a systemd service, so it should auto-start when your Ubuntu/WSL environment starts.
- No, that does not always mean immediately at Windows boot. WSL itself has to be running first.
So the practical version is:
- PC on + WSL running → bot should be active
- PC asleep/off → bot is not active
- Windows booted, but WSL never started yet → bot may not be active yet
The quick check after boot is:
openclaw gateway status
If you want truly reliable cron without worrying about sleep/WSL startup, an always-on box like a VPS/Raspberry Pi is the cleaner setup.
Alright, thanks a lot. I'll close the thread now.
Glad we got you unstuck 🎉
If this fixed it, please right-click the solution message → Apps → ✅ Mark Solution.
That helps Answer Overflow index it for the next person.
If anything weird comes back, open a fresh thread and we’ll dig in.