Skip to main content

Cron job monitoring

Monitor scheduled jobs, recurring scripts, and background automations with dead man's switch check-ins, Laravel scheduler integration, and cron alert rules.

Cron monitors alert you when a scheduled job doesn't run, not just when it fails while running. They work like a dead man's switch: DownCTL expects a check-in from your job on its normal cadence, and if that ping does not arrive inside the allowed window, the monitor becomes overdue.

From a site's Cron monitors tab:

  1. Click Add monitor and give it a name.
  2. Define the schedule either as a cron expression (e.g. 0 2 * * *) or a simple frequency in minutes.
  3. Set a timezone and how many missed runs to tolerate before alerting.
  4. Save — DownCTL generates a unique ping URL for the monitor.

Have your job call that URL when it runs. If a ping doesn't arrive within the expected window, the monitor is marked overdue and can trigger a cron job failing alert rule.

Treat the ping token as a credential — there's no auth header on these endpoints, so anyone with the URL can ping the monitor. Keep it in .env or a config value pulled from the environment (as in the Laravel example below), not hardcoded directly in a script or committed to a public repo.

Laravel: if you have bluecapapps/downctl-laravel installed (see error tracking), chain ->cronMonitor() onto a scheduled task instead of calling the ping URL yourself:

use Illuminate\Support\Facades\Schedule;

Schedule::command('reports:daily')
    ->dailyAt('06:00')
    ->cronMonitor(config('downctl.monitors.reports_daily'));

This pings /started, /finished (with measured runtime), or /failed automatically depending on how the command exits. Run php artisan downctl:crons:sync to list every monitored task and confirm its ping URL.

Plain PHP: bluecapapps/downctl-php provides the same lifecycle without the scheduler integration:

$downctl->pingCronStarted('your-ping-token');

try {
    runImport();
    $downctl->pingCronFinished('your-ping-token', ['runtime' => 12.4]);
} catch (\Throwable $e) {
    $downctl->pingCronFailed('your-ping-token', ['failure_message' => $e->getMessage()]);
}

Anything else: call the ping URL directly — see the API reference for the full set of /started, /finished, and /failed variants, plus accepted metadata.

You can also create or update cron monitors in bulk from code instead of the UI — see cron monitor sync in the API reference.

For the broader marketing overview, see cron job monitoring.

Ready to be first
to know?

Add your first site in 30 seconds. Start your free trial today.

14-day free trial · No credit card required · Cancel anytime