Laravel Scheduler Monitoring

Know when Laravel's scheduler stops firing.

PingCron monitors artisan schedule:run and your individual scheduled tasks. If the scheduler stops running or a task silently fails, you get alerted within seconds.

5 monitors free · No credit card · Live in under 60 seconds

Laravel's scheduler depends on one cron entry that's easy to forget.

Laravel's scheduler runs through a single cron entry that fires php artisan schedule:run every minute. If that cron entry stops working — server reboot, deploy script removed it, cron daemon crashed, PHP path changed — every scheduled task in your app silently stops running.

Laravel won't tell you. Your jobs just stop firing. ProcessOrders never runs. SendDailyReports never runs. CleanupExpiredSessions never runs. Your app keeps serving requests like nothing's wrong, but the entire scheduled workload has flatlined.

Most teams find out days later — when a customer asks why they didn't get their weekly summary, or when the database fills up because cleanup stopped running.

Laravel scheduler failure modes:

  • Server rebooted and the cron entry for schedule:run was never restored
  • Deploy overwrote the crontab without re-adding the scheduler line
  • PHP path changed after an upgrade — cron can't find the binary anymore
  • Composer dependencies broke after an update, schedule:run throws on boot
  • Database connection in scheduled context fails (different env from web)
  • A withoutOverlapping() lock got stuck and is silently blocking every run

Setup

Monitor schedule:run with one ping per minute.

Add a curl after schedule:run in your crontab. If Laravel stops running schedules — for any reason — PingCron alerts you.

Before

* * * * * cd /var/www/app && php artisan schedule:run >> /dev/null 2>&1

After

* * * * * cd /var/www/app && php artisan schedule:run >> /dev/null 2>&1 && curl -fsS https://api.pingcron.io/ping/abc123

Set the monitor schedule to '1m' with a 30-second grace period. PingCron expects a ping every minute — if the scheduler stops firing, you'll know within 90 seconds.

Real-world examples

Monitor a specific scheduled task with thenPing()

// app/Console/Kernel.php
$schedule->command('reports:daily')
    ->dailyAt('09:00')
    ->thenPing('https://api.pingcron.io/ping/abc123');

Monitor with start/finish/failure pings

$schedule->command('emails:send')
    ->everyFiveMinutes()
    ->pingBefore('https://api.pingcron.io/ping/abc123/start')
    ->thenPing('https://api.pingcron.io/ping/abc123')
    ->pingOnFailure('https://api.pingcron.io/ping/abc123/fail');

Inside a Laravel job

use Illuminate\Support\Facades\Http;

public function handle()
{
    // your job logic
    Http::get('https://api.pingcron.io/ping/abc123');
}

What Laravel scheduled tasks should you monitor?

Anything in app/Console/Kernel.php that has to run.

schedule:run heartbeat

The single cron entry that powers everything else.

Daily reports

reports:generate, customer summaries, internal digests.

Billing commands

subscriptions:bill, invoices:send, payments:retry.

Database maintenance

horizon:purge, queue:prune, custom DB cleanups.

Cache + session cleanup

cache:prune-stale-tags, session:gc, telescope:prune.

Sync jobs

CRM sync, Stripe webhook backfills, search indexing.

Backup commands

spatie/laravel-backup, custom export commands.

Notification dispatchers

Daily digests, reminder emails, scheduled SMS.

How it works

Three minutes from clone to first alert.

01

Create a Laravel scheduler monitor

Set the interval to every minute with a 30s grace period.

02

Add the ping to your schedule:run cron line

Append && curl ... to your existing schedule:run entry.

03

Optionally monitor individual tasks

Use Laravel's built-in thenPing(), pingBefore(), and pingOnFailure() helpers for granular task monitoring.

04

Get alerted on any scheduler failure

Email, Slack, Discord, or webhook the moment a check-in is missed.

Alerts where you'll actually see them.

Configure as many channels as you want per monitor.

Email

HTML alerts with monitor details and direct links.

Slack

Post to any Slack channel via incoming webhook.

Discord

Native Discord webhook integration.

Custom webhooks

POST alerts to any endpoint with full payload.

FAQ

Add one curl call to the cron entry that runs php artisan schedule:run. PingCron expects a ping every minute. If schedule:run stops firing for any reason — server reboot, deploy issue, broken cron — you get alerted within seconds.
Because the entire scheduler depends on a single cron entry. If that entry breaks, every scheduled task in your app stops running silently. There's no Laravel-side error, no exception, no log entry — the scheduler just isn't being invoked. Without external monitoring you find out days later when a downstream effect breaks.
Yes. Laravel has built-in helpers for this: ->thenPing('url') sends a ping after the task completes, ->pingBefore('url') sends one before it starts, and ->pingOnFailure('url') sends one if the task throws. Use these on critical tasks like billing or backup commands so you know when a specific task fails — not just when the entire scheduler dies.
Yes. PingCron is a plain HTTP endpoint — anything that can run schedule:run can also run curl. It works identically on Forge, Vapor, Laravel Cloud, AWS EC2, DigitalOcean droplets, shared hosting, or your own VPS.
Different problem. PingCron monitors scheduled (time-based) jobs — the ones that should run at specific intervals. For queue workers (always-running processes), you want a process monitor like supervisor or Horizon's built-in dashboard. For Horizon's nightly horizon:snapshot or queue:prune commands, those run via the scheduler and PingCron handles them perfectly.
thenPing() runs after the artisan command completes successfully. Pinging from inside the command's handle() method gives you more control — you can ping at specific points, send a fail ping in a try/catch block, or include start/end timing. Use thenPing() for simple cases and inline pings when you need richer logic.
Yes. The free plan includes 5 monitors, email/Slack/Discord alerts, and 7 days of history. No credit card required. Plenty for monitoring schedule:run plus 4 critical scheduled tasks.

Related monitoring guides

Stop assuming Laravel scheduler is running.

One ping per minute confirms every scheduled task in your app is firing.

Start monitoring free

5 monitors free · No credit card · Live in under 60 seconds