You set up HEARTBEAT.md, your agent is running, and everything looks fine. But the heartbeat just silently skips. No error message, no reply, nothing. The good news: OpenClaw logs a skip reason every time it decides not to fire a heartbeat, and each reason points to a different problem with a different fix. The work is in reading the reason and knowing what it means.
This guide covers the reasons you will actually see, what each one means, and the exact fix for it, including the corrections that trip people up in older guides.
How to see the skip reason
Start by tailing the gateway logs while a heartbeat interval passes:
The reason after the equals sign is what you look up below. If you are not sure a skip happened at all, the heartbeat command group shows the last event directly: openclaw system heartbeat last reports the most recent heartbeat run and its outcome without waiting for the next tick.
Skip reason: quiet-hours
The heartbeat fired outside your configured active-hours window. OpenClaw will not run heartbeats late at night, because interrupting you is worse than skipping a check. A real config shows the shape of the window:
Look for the activeHours block. Any heartbeat attempt outside it is dropped with this reason. To widen or remove the window, edit the start and end times (or drop the block entirely for round-the-clock ticks), then restart the gateway. The window is checked in its configured timezone, so set that field deliberately rather than assuming your local zone.
Skip reason: empty-heartbeat-file
HEARTBEAT.md exists but contains only blank lines, comments, Markdown headings, or empty checklist stubs. OpenClaw treats that scaffolding as empty and skips the run to save API calls. The fix is to add at least one real instruction. A single concrete line, like “Check for unread email and summarize what needs a reply,” is enough to make the file count as populated.
Two details matter here. First, a file that is missing entirely is not a skip: the heartbeat still runs and the model decides what to do. Second, the comments-only file is a deliberate off switch used by many setups, so if you see this reason and want the agent quiet, that is the state working as intended.
Skip reason: no-tasks-due
HEARTBEAT.md is running in task mode, where each task carries its own interval, and none of those intervals have elapsed yet. One detail decides whether this surprises you: due timestamps only advance after a real completed run. Skipped heartbeats do not count toward the interval, so if the heartbeat has been skipping for another reason and you just fixed it, the clock starts now, not from when you first set the task up.
Skip reason: alerts-disabled
All three visibility flags, showOk, showAlerts, and useIndicator, are disabled at once. With nothing enabled, OpenClaw has nowhere to deliver the result and skips the run entirely. The flags live in the channel heartbeat config, not in the old locations some guides point at:
# Example: alert on findings, stay quiet otherwise channels: defaults: heartbeat: showOk: false showAlerts: true useIndicator: true
For most setups showAlerts: true is the right default: it sends a message only when something actually needs attention instead of pinging every cycle. If only alert delivery is disabled, OpenClaw can still run the heartbeat and update task timestamps while suppressing the outward alert, so a fully silent channel does not have to mean a fully skipped heartbeat.
Skip reason: requests-in-flight
The main chat lane is busy: you are mid-conversation, a subagent is running, a tool call is in progress, or the cron lane is active. OpenClaw defers the heartbeat wake rather than interrupting whatever is happening, and cron lanes always defer heartbeats so the two never stack on a local host. This is intentional. There is nothing to fix. Once the main session goes idle, the next scheduled heartbeat fires normally. If you see this reason constantly, your agent is handling long-running work and the heartbeat cannot find a quiet window, which is a signal about the workload, not the heartbeat config.
Skip reason: dm-blocked and delivery targets
Heartbeat deliveries allow direct message targets by default, but a config can suppress them: when directPolicy is set to block, the run is skipped with reason=dm-blocked instead of sending to a DM target. If delivery resolves to a channel account that was renamed or removed, the heartbeat can also fail to find its destination. Check the resolved target against your live accounts with openclaw status, and set directPolicy: "allow" or point the target at an existing account.
One habit prevents most of the confusion around silent heartbeats: check the reason before changing anything. The natural instinct is to poke at HEARTBEAT.md or restart the gateway, but a skip with reason=requests-in-flight needs no change at all, and a skip with reason=quiet-hours at 11pm is the system working as designed. Read the log line, match it to the list above, and you fix the actual cause instead of the nearest symptom.
Testing without waiting for the next tick
Whatever reason you are chasing, you do not need to wait for the schedule to test a fix. OpenClaw can wake a heartbeat on demand:
Run the wake, read the result, and the log will show either a clean run or the next skip reason in line. The diagram stacks all six reasons on one page for quick reference:

If you have just enabled heartbeats and see a skip immediately, the most likely sequence is quiet-hours or empty-heartbeat-file, both of which are configuration states rather than failures. Give the setup one full active-hours cycle before assuming something is broken, and use the manual wake to confirm the fix the moment you make it.
Related fixes
If the heartbeat never fires at all, rather than skipping, the heartbeat-not-triggering guide covers the config and log checks. For what to put in the file, HEARTBEAT.md explained covers check design, and the ten automatic checks is the companion list. The workspace-file series lives under The Complete OpenClaw Guide.
Not Ready to Self-Host? Try ClawTrust
Building agents locally is powerful, but managing infrastructure, security, and scaling takes effort. ClawTrust provides managed OpenClaw hosting: your agents run securely in the cloud with automatic scaling, no DevOps overhead, and 24/7 monitoring.
This post contains affiliate links. If you buy through them, I may earn a small commission at no extra cost to you.


The quiet-hours one got me for two days. I had no idea there was a default window. Would have been nice if the docs mentioned it more prominently but this article cleared it up instantly.
Same. I was convinced something was broken with my install. Turns out I just set it up late at night and every test I ran landed outside the active window. Classic.
Is there a way to temporarily bypass quiet-hours for testing without permanently changing the config? I want to test the heartbeat fires correctly but do not want to touch my active production settings.
Thanks for reading, Yuki Tanaka. On HEARTBEAT md Keeps Skipping s, I would start with the basics and then tighten things up once you see how it behaves in practice. If you are already testing it, the main thing is to keep the setup simple enough to debug quickly.
Bookmarked this. The empty-heartbeat-file reason is so easy to miss and this is the first place I have seen it documented clearly. Thanks.
Thanks for reading, Hana Dvorak. On HEARTBEAT md Keeps Skipping s, I would start with the basics and then tighten things up once you see how it behaves in practice. If you are already testing it, the main thing is to keep the setup simple enough to debug quickly.