OpenClawSupport

Deep dive · Apr 25, 2026

OpenClaw Cron vs Heartbeat: When to Use Each Without Creating Noise

Practical OpenClaw scheduling guide: when heartbeat should batch recurring checks, when cron should own exact reminders, and how to avoid notification noise.

OpenClaw Cron vs Heartbeat: When to Use Each Without Creating Noise

If timing precision matters, use cron. If batching and ambient operator logic matter, use heartbeat.

That is the short answer.

The longer answer is that OpenClaw cron and heartbeat are not two interchangeable ways to "make the agent do things later." They solve different scheduling problems, and most confusion comes from flattening them into one fuzzy category.

This page is the decision-support lane. If you already know the job belongs in heartbeat and just need the file-level pattern, open OpenClaw HEARTBEAT.md Example. If you need the broader time-layer model first, read The OpenClaw Heartbeat.

What this page covers

  • what heartbeat is actually for
  • what cron is actually for
  • the decision rule that separates them
  • practical examples
  • where notification noise really comes from

What this note is based on

  • real OpenClaw operator usage
  • a live HEARTBEAT.md pattern
  • the broader heartbeat subsystem note

This page is a decision memo, not a generic automation essay.

Jump to

The comparison in one screen

System Best for Timing style Noise risk if misused
Heartbeat ambient recurring checks, batching, quiet "only if changed" logic low-precision, periodic noisy if you stuff exact reminders or giant task lists into it
Cron exact reminders, one-shot future tasks, isolated scheduled runs precise, explicit noisy if you schedule every soft check as a separate event

Use heartbeat when

  • multiple checks can batch together
  • you want silence unless something changed
  • timing can drift a little
  • the job is ambient, recurring, and lightweight

Use cron when

  • the task should fire at a specific time
  • you need a one-off reminder
  • the run should be isolated from the main conversational lane
  • exact timing matters more than batching

Smell test:

  • "At 9:00 tomorrow, remind me..." -> cron
  • "Every so often, check whether..." -> heartbeat

What heartbeat is actually for

Heartbeat is the ambient-awareness layer.

Its job is not "run all automation." Its job is recurring, low-precision operator logic:

  • check whether something important changed
  • batch inbox, calendar, and notifications into one wake
  • surface a message only if a threshold is crossed
  • otherwise preserve silence through HEARTBEAT_OK

That batching behavior matters. It reduces noise because several soft checks can share one wake instead of creating a trail of separate reminders.

Heartbeat becomes awkward when you demand exactness from it. If the task must happen on the dot, heartbeat is already the wrong mental model.

For the subsystem background, read the broader heartbeat note.

What cron is actually for

Cron is the exact-time layer.

Use it for:

  • one-off reminders
  • recurring reminders at a precise time
  • isolated scheduled reports
  • tasks that should run on a strict cadence

Cron is especially clean when the scheduled work should not depend on the main chat lane. A cron job can wake, inject the exact reminder or task, and finish without dragging the whole conversational thread into ambient polling logic.

That makes cron the right answer when "roughly around then" is not good enough.

The real decision rule

Do not ask which one is more powerful. Ask which one preserves operator clarity.

Choose heartbeat if the job is:

  • periodic instead of exact
  • batchable with other checks
  • mostly silent unless something changes
  • best handled as ambient continuity

Choose cron if the job is:

  • tied to a clock time
  • a one-shot future event
  • easier to isolate from the main session
  • clearer as an explicit scheduled commitment

Another useful rule:

  • if the instruction is about conditions, heartbeat usually fits
  • if the instruction is about time, cron usually fits

Three examples that make the difference obvious

1. Morning briefing with inbox + calendar + notifications

Use heartbeat.

Why:

  • the checks are related
  • they can batch together
  • the system should often say nothing
  • exact minute-level timing usually does not matter

This is classic heartbeat territory.

2. "Remind me tomorrow at 9:00 to run the factory tick"

Use cron.

Why:

  • exact timing matters
  • the operator asked for a single future event
  • the job is clearer as a precise schedule than as a periodic poll

This is what cron is for.

3. Weekly isolated status report

Use cron.

Why:

  • the schedule is deliberate
  • the run can be isolated
  • the output should happen on a known cadence

If you force this into heartbeat, you usually end up reimplementing precise schedules badly.

4. "A few times a day, check whether anything urgent arrived"

Use heartbeat.

Why:

  • the question is conditional, not exact-time
  • the system should stay quiet if nothing changed
  • batching reduces spam

How heartbeat and cron work together

A healthy OpenClaw setup usually uses both.

  • heartbeat owns ambient continuity
  • cron owns exact timing

That is not duplication. It is separation of responsibility.

The best systems do not pick one scheduler forever. They keep each mechanism in its lane.

A common good pattern looks like this:

  • heartbeat handles periodic checks, soft awareness, and silence-by-default reporting
  • cron handles exact reminders, exact recurring jobs, and isolated scheduled runs

Once you see that split, the architecture gets much easier to reason about.

Where notification noise actually comes from

Noise does not come from having both tools. It comes from bad ownership.

Heartbeat gets noisy when:

  • you stuff exact reminders into it
  • you make it wake too often for low-value checks
  • you let it send "nothing new" style messages instead of HEARTBEAT_OK
  • you turn the file into a giant to-do archive

Cron gets noisy when:

  • you schedule every soft check as its own event
  • you create lots of reminders for things that could have been batched
  • you use precise schedules where conditional silence would have been better

The anti-noise principle is simple:

  • batch soft recurring checks into heartbeat
  • reserve cron for exact commitments

If you also want the file-level implementation side, read OpenClaw HEARTBEAT.md Example.

Common mistakes

Mistake: using heartbeat for exact reminders

Better choice: cron.

Mistake: using cron for every recurring soft check

Better choice: heartbeat.

Mistake: choosing the "stronger" tool instead of the clearer one

Better choice: pick the tool whose timing model matches the job.

Mistake: mixing social messaging and internal checks carelessly

Better choice: define silence rules, escalation thresholds, and isolated delivery paths clearly.

Mistake: treating both systems as equivalent automation wrappers

Better choice: think in terms of ambient continuity vs exact scheduling.

If you want the broader time-layer explanation, read:

If you want the file/template side, read:

If you want the broader architecture map, read:

If you want the practical setup path, read:

Conclusion

OpenClaw cron vs heartbeat becomes easy once you stop treating both as generic scheduling features.

Use heartbeat for ambient, batchable, silence-by-default logic. Use cron for exact reminders, exact recurring jobs, and isolated scheduled runs.

Heartbeat protects signal. Cron protects timing. A good operator setup uses both without letting either one become sludge.

Next up

Need the broader scheduling layer? Read the heartbeat owner noteNeed the file template? Open the `HEARTBEAT.md` example
Back to Notes

Want the deeper systems behind this note?

See the Vault