# 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](/docs/laravel/) 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](/guides/monitor-laravel-scheduler/) shows each cause and how to check it by hand, and [Laravel cron job setup](/guides/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:run` runs 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](/docs/alerts/#alert-channels) (Slack, Discord, Microsoft Teams, webhooks). Ask an agent "Which scheduled tasks are failing or missed their last run?" over the [MCP server](/docs/mcp/).

## Set it up

```bash
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](/docs/laravel/) and the [Schedule health docs](/docs/cron-health/).

## 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 `curl` from 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](https://healthchecks.io/pricing/), [docs](https://healthchecks.io/docs/), verified on 2026-11-10).
- Tasks with `runInBackground` only 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](/#pricing).

## Related

- Jobs on the queue fail differently: [why Laravel queued jobs fail](/guides/laravel-failed-jobs/).
- Errors, requests and jobs from the same package: [Laravel error tracking](/features/error-tracking/).
- How other Laravel tools handle the scheduler: [Laravel monitoring tools compared](/compare/laravel-monitoring-tools/).

[Start free](https://app.lampwick.dev/signup) and connect your Laravel app.
