The monitoring your Laravel app actually needs
Not just "did it ping back." Crontinel reads Laravel internals to give you answers other tools can't.
Horizon internals — not just "is it running?"
Crontinel reads Horizon's Redis keys directly. Not an HTTP ping. Actual supervisor states, actual queue depths, actual failed job rates per minute.
- ✓ Supervisor status per supervisor (not just "Horizon is running")
- ✓ Paused detection
- ✓ Failed jobs per minute with configurable threshold
- ✓ Alerts when any supervisor goes down
| Queue | Depth | Failed | Health |
|---|---|---|---|
| default | 5 | 0 | ok |
| emails | 1,204 | 3 | alert |
| notifications | 12 | 0 | ok |
Queue depth, before it becomes a customer complaint
Set per-queue thresholds for depth, failed count, and oldest job age. Get alerted before the backlog becomes a problem.
- ✓ Depth threshold per queue
- ✓ Failed count threshold
- ✓ Oldest job age (wait time) alert
- ✓ Works with Redis and database queue drivers
Cron run history: every execution, every exit code
Hooks into Laravel's scheduler via built-in events. Every scheduled command run is recorded automatically. No wrapping needed.
- ✓ Exit code per run
- ✓ Execution duration
- ✓ "Late" detection when job doesn't run on schedule
- ✓ Historical chart per command
| Command | Last run | Status |
|---|---|---|
| inspire | 6h ago | ok |
| send-invoices | 5d ago | ok |
| cleanup-old-logs | 23h ago | ⚠ late |
Alerts that go where you work
Fires when something breaks. Resolves automatically when it recovers. No noise.
Frequently asked questions
Does Crontinel work without Laravel Horizon?
Yes. Queue monitoring and cron tracking are fully independent of Horizon. If you use the database queue driver, Crontinel monitors queue depths and failed jobs from your database tables. Cron tracking works via Laravel's scheduler events regardless of which queue driver you use. Horizon monitoring is an additional layer for apps that run it.
How does Crontinel monitor Horizon internals?
Crontinel reads Horizon's Redis keys directly, the same data source the Horizon dashboard uses. This means it sees actual supervisor states, actual pause status, and actual failed-jobs-per-minute rates, not just whether an HTTP health endpoint returned 200. This approach catches scenarios where Horizon reports "running" at the top level while an individual supervisor handling a critical queue has silently crashed.
What queue drivers does Crontinel support?
Crontinel supports the Redis and database queue drivers. Redis is the recommended driver for production Horizon setups, and Crontinel reads queue depths and failed counts directly from Redis. For apps using the database driver, Crontinel queries the jobs and failed_jobs tables. SQS and other drivers are not currently supported.
Does cron tracking require code changes to my scheduled commands?
No. Crontinel hooks into Laravel's built-in scheduler events (ScheduledTaskStarting, ScheduledTaskFinished, ScheduledTaskFailed) automatically after installation. Every command defined in your schedule() method is tracked with its exit code and duration. No wrapping, no per-command changes needed.
How are alerts deduplicated?
Crontinel applies a 5-minute cooldown per alert condition. If a queue depth stays above its threshold, you receive one alert, not one per polling cycle. The alert resolves automatically when the condition clears, at which point you receive a recovery notification. This prevents alert fatigue during extended incidents while still giving you clear start and end signals.
Is the OSS package free forever?
Yes. The core Crontinel package is MIT licensed and will remain free forever. You can self-host the full monitoring dashboard, configure Slack or email alerts, and track unlimited cron runs and queue depths with no subscription required. The paid SaaS tier adds multi-app dashboards, longer history retention, and team access for engineering organizations that want managed infrastructure.