Cron job monitoring for the Laravel scheduler
Lampwick learns each Laravel scheduled task's cron from its runs and alerts when a task misses a run, starts failing or runs too long. No heartbeat URLs.
Schedule health tells you when a scheduled task in your Laravel app missed its run, started failing or ran longer than you allow. The Laravel package reports every run with its cron expression and timezone, so Lampwick works out when each task should run next by itself. There are no heartbeat URLs to create, and a new task is tracked after its first run.
Why scheduled tasks fail quietly
A cron job that doesn't run sends no error. The schedule:run entry disappears from the crontab after a server move, the app stays in maintenance mode after a deploy, a task hangs and withoutOverlapping skips every run after it. Laravel's ScheduledTaskFailed event catches failures, but a task that never starts fires no event at all. The guide monitor the Laravel scheduler shows each cause and how to check it by hand, and Laravel cron job setup covers the crontab entry itself.
What you get
| Alert | When |
|---|---|
| Missed: TASK | No run within the grace period after the expected time. One alert, then nothing until it runs again. |
| Running again: TASK | It runs again after a missed-run alert. |
| Failed: TASK | A task starts failing; at most once per hour per task, not on every failed run. |
| Slow: TASK | A run takes longer than the limit you set for that task, from 5 to 480 minutes. |
| Scheduler not running | No task ran while at least 2 missed. One alert for the project instead of one per task. |
- The schedule in words. Each task shows its cron as text ("every 5 minutes"), Last run, Next run and a status: On time, Late, Missed or Failing.
- A grace period that fits the task. At least 5 minutes, longer for long intervals and slow tasks, plus the other tasks due at the same minute, since
schedule:runruns them one after another. - Timezones and daylight saving the way Laravel's scheduler handles them, and sub-minute tasks ("every 30 seconds").
- Renamed or rescheduled tasks are replaced without an alert; removed tasks are forgotten after 7 days.
- Alerts by push, e-mail and alert channels (Slack, Discord, Microsoft Teams, webhooks). Ask an agent "Which scheduled tasks are failing or missed their last run?" over the MCP server.
Set it up
composer require lampwick/laravel
echo LAMPWICK_TOKEN=YOUR_PROJECT_TOKEN >> .env
php artisan lampwick:agent
YOUR_PROJECT_TOKEN is on the project's Settings page. Keep LAMPWICK_SCHEDULED_TASK_SAMPLE_RATE at 1 (the default): missed-run alerts need every run. Once the scheduler has run, open Schedule health. Full steps: connect a Laravel app and the Schedule health docs.
What it doesn't do
- It needs the Laravel package today. Schedule health reads the runs the package reports. There is no ping URL you can
curlfrom a shell script, a system crontab outside Laravel, or a job in another language. - If that's what you need, a heartbeat service fits better. Healthchecks.io, for example, gives each job a ping URL and has a free plan for 20 jobs (pricing, docs, verified on 2026-11-10).
- Tasks with
runInBackgroundonly report their start, so they get no duration alert. - At most 500 tasks per project.
What it costs
Schedule health is part of every plan, Free included; scheduled task runs count as events. Free has 500k events a month, Pro (€29) 5M, Team (€79) 25M, Business (€199) 100M, per team. See pricing.
Related
- Jobs on the queue fail differently: why Laravel queued jobs fail.
- Errors, requests and jobs from the same package: Laravel error tracking.
- How other Laravel tools handle the scheduler: Laravel monitoring tools compared.
Start free and connect your Laravel app.