How to monitor Cloudflare Workers Cron jobs

A scheduled Worker can fail independently of normal HTTP traffic. Monitor the scheduled promise that owns the work.

Report success and failure

Create a check and set PING_URL to its private URL. Replace the example command with your actual task. These examples preserve command failure and do not let a failed reporting request turn a successful job into a failure.

// Modern Node.js / Workers fetch. Supply runJob with your actual work.
async function monitored(runJob, pingUrl) {
  if (!pingUrl) throw new Error('Set PING_URL');
  const rid = crypto.randomUUID();
  const ping = async status => {
    for (let n = 0; n < 4; n++) {
      try {
        const res = await fetch(`${pingUrl}/${status}?rid=${rid}`, {
          signal: AbortSignal.timeout(10000)
        });
        if (res.ok) return;
      } catch {}
    }
    console.error('Heartbeat delivery failed');
  };
  await ping('start');
  await new Promise(resolve => setTimeout(resolve, 1100));
  try { await runJob(); }
  catch (error) { await ping('1'); throw error; }
  await ping('0');
}

Connect it to Cloudflare Workers Cron

Use the wrapper with an env.PING_URL secret binding instead of process.env.

export default {
  scheduled(event, env, ctx) {
    ctx.waitUntil(monitored(() => runJob(env), env.PING_URL));
  }
};

These are integration fragments for an existing project, not a full application. Set the URL in the job’s environment, keep credentials private and ensure the runtime has the dependencies shown.

Things to watch

Cron Triggers use UTC. Put work in ctx.waitUntil and await every request; do not leave floating promises.

The shell examples wait one second between start and work to respect the per-check rate guard. For very short tasks, completion-only pings avoid that delay. A killed process may never send a failure ping; the completion deadline catches the missing run instead.

Test the setup

  1. Run a successful task and confirm the check turns up.
  2. Force a nonzero exit or exception and verify the check turns down.
  3. Stop the scheduler after one success and wait for the expected run plus grace.

Set the schedule to your task’s completion cadence, allowing for runtime and queue delay. Use the cron helper to review your calendar schedule.

Questions about Cloudflare Workers Cron

Where should the heartbeat run?
Inside the completed task, after the important work. A scheduled Worker can fail independently of normal HTTP traffic. Monitor the scheduled promise that owns the work.
Which grace period should I use?
Allow for job runtime and scheduler startup delay. CronPulse evaluates deadlines once a minute, so alerts generally follow within about 1–2 minutes after grace ends.
Does this test the result of my work?
No. A success ping proves your command reached the reporting step. Validate output and, for backups, test restoration. Missing completion pings catch stopped or killed jobs.

Platform reference: official Cloudflare Workers Cron documentation. Adapt fragments to your installed version.

Give your next job a heartbeat.

20 checks free. No card. Built in Ireland.

Create your first check ↗