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:
- Click Add monitor and give it a name.
- Define the schedule either as a cron expression (e.g.
0 2 * * *) or a simple frequency in minutes. - Set a timezone and how many missed runs to tolerate before alerting.
- 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.