#Cron messages to Discord
1 messages · Page 1 of 1 (latest)
I get info No reply from agent. always.
"delivery": {
"mode": "announce",
"channel": "discord",
"to": "channel:12345"
},
this is what i tried
Cron can deliver to Discord, but if you don’t pin the delivery target it’ll often fall back to the “last route” (which is usually your DM) — so it looks like “it only works for the user”.
Use an isolated cron job + announce + explicit Discord channel target:
openclaw cron add \
--name "Discord cron test" \
--at "5m" \
--session isolated \
--message "Hello from cron đź‘‹" \
--announce \
--channel discord \
--to "channel:1474685426949296351"
For recurring:
openclaw cron add \
--name "Every hour" \
--cron "0 * * * *" \
--session isolated \
--message "Hourly ping" \
--announce \
--channel discord \
--to "channel:1474685426949296351"
Things to double-check if it still DMs you / fails:
- The Discord bot/user your Gateway is using is actually in that server and has Send Messages permission in that channel.
- If you have multiple Discord accounts/tokens configured: cron “announce” delivery currently resolves the default Discord account — so make sure the default is the one that can post in that channel.
Docs:
Yep — that delivery block is the right shape for an isolated cron job (i.e. sessionTarget: "isolated" + payload.kind: "agentTurn"). A couple of gotchas:
deliveryis top-level on the job, not insidepayload.- Delivery is only supported for isolated jobs. If you use
sessionTarget: "main"/payload.kind: "systemEvent", it won’t “announce” to Discord (it’ll just enqueue a system event).
A full minimal job (tool-call JSON) looks like:
{
"name": "Discord cron test",
"schedule": { "kind": "cron", "expr": "*/5 * * * *" },
"sessionTarget": "isolated",
"payload": {
"kind": "agentTurn",
"message": "Hello from cron"
},
If you paste:
openclaw --versionopenclaw cron listopenclaw cron runs --id <jobId>
…I can tell you exactly where it’s routing and why.
"delivery": {
"mode": "announce",
"channel": "discord",
"to": "channel:12345"
}
}
Notes:
toshould be the real Discord channel ID and thechannel:<id>prefix is recommended.- If you don’t want the job to fail when Discord delivery has an issue, add:
"bestEffort": true.
Docs: https://docs.openclaw.ai/automation/cron-jobs (see “Delivery (channel + target)”).
That log line is coming from the delivery layer and it literally means: the cron run completed, but the agent produced zero outbound message payloads, so there was nothing to “announce” to Discord.
Common reasons:
- Your prompt/agent is “silent by default” (e.g. it returns
NO_REPLY, or a heartbeat-styleHEARTBEAT_OK, or otherwise outputs nothing unless it “needs” to). - You told it to use the
messagetool and then it ends with a silent token / no normal text output. - The run is happening, but the model is erroring/aborting before it emits any message (less common — then
cron runswill show it).
Quick sanity test (force a plain text reply; no tools):
openclaw cron add \
--name "discord announce test" \
--at "1m" \
--session isolated \
--message "Reply with exactly this text and nothing else: CRON_OK" \
--announce \
--channel discord \
--to "channel:1474685426949296351"
If that still prints “No reply from agent.”, paste:
openclaw --versionopenclaw cron runs --id <jobId> --limit 5
That run record will usually show whether the model aborted, timed out, or whether your agent is intentionally emitting no payloads.
I don’t see what you tried (your last message didn’t include the command / job JSON). Can you paste either:
- the exact
openclaw cron add ...command you ran, or openclaw cron listoutput for that job (JSON), plusopenclaw cron runs --id <jobId> --limit 5
About the info No reply from agent. message: it means the cron run executed, but the agent produced zero “outbound payloads” (no normal text message), so there’s nothing to announce to Discord.
The two most common causes:
-
Job is “main session” (
sessionTarget: "main"/payload.kind: "systemEvent").
Main-session cron jobs do not dodelivery.announce. For Discord delivery you want:sessionTarget: "isolated"payload.kind: "agentTurn"- top-level
delivery: { mode:"announce", channel:"discord", to:"channel:<id>" }
-
Your prompt allows silence (e.g. “only reply if …”, or your agent instructions say to return
NO_REPLY/ be silent).