Monitoring for PHP & Laravel

By WatchCron Team

Laravel's scheduler runs on a single cron entry, and that's the problem

Every Laravel app funnels its entire schedule through one line in crontab: * * * * * cd /path && php artisan schedule:run. If that line gets dropped during a server migration, or the cron daemon stops after an OS update, every scheduled task in your application goes silent at once. No exception, no log entry, no Slack message. The nightly database backup, the hourly invoice sync, the queue pruning job that keeps your Redis memory in check — all of them stop, and nothing tells you until the damage is visible.

WatchCron catches that silence. Each scheduled task pings a unique URL when it finishes, and if the expected ping doesn't arrive within the grace window, you get an alert on Slack, Telegram, email, or whatever channel you use. The setup takes one chained method call in your routes/console.php.

One method call per task, and monitoring is live

Laravel's scheduler has built-in support for pinging URLs after a task runs. Once you create a check in WatchCron, you get a ping URL. Add it to your schedule definition:

Schedule::command('invoices:sync-stripe')
    ->hourly()
    ->thenPing('https://ping.watchcron.com/p/your-check-uuid');

That's the entire integration. When invoices:sync-stripe finishes, Laravel sends a GET request to the URL. WatchCron registers the ping, resets the timer, and waits for the next one. If the next expected ping doesn't arrive within the grace period you configured — five minutes is a reasonable default for hourly tasks — the alert fires.

If you want to distinguish between a task that ran and succeeded versus one that ran and failed, use pingOnSuccess and pingOnFailure instead:

Schedule::command('backups:run')
    ->dailyAt('03:00')
    ->pingOnSuccess('https://ping.watchcron.com/p/your-check-uuid');

This way, the ping only fires when the artisan command exits with code 0. A backup script that fails mid-upload won't mask the problem by pinging anyway.

Your cron expression, not just an interval

Laravel's ->cron('0 3 * * 1-5') method accepts full cron syntax, and so does WatchCron. When you set up a check, you can enter the same expression your scheduler uses. The dashboard shows the next five scheduled runs so you can confirm the check and the task agree on when things should happen. If they drift apart — say you change the schedule in code but forget to update the monitor — the grace period catches it.

For tasks using Laravel's fluent methods like ->hourly() or ->dailyAt('03:00'), WatchCron also supports simple interval mode. Pick whichever matches how you think about that task's schedule.

Monitor the infrastructure your PHP app depends on

Scheduled tasks are usually the first thing to go wrong quietly, but they're not the only thing. A PHP application typically depends on a MySQL or PostgreSQL database, a Redis instance for cache and queues, and a web server answering HTTPS requests with a valid certificate. WatchCron covers all of those from one dashboard:

  • HTTP uptime checks hit your application endpoint every 1-10 minutes and track response codes and response times. If your Laravel app starts returning 500s after a deployment, you know before users report it.
  • Your app won't function if MySQL on port 3306 or Redis on 6379 becomes unreachable. TCP port checks catch that, and port monitors are unlimited on every plan — they don't count against your check limit.
  • SSL certificate monitoring alerts before your certificate expires. If you're using Let's Encrypt with auto-renewal, this catches the cases where renewal fails silently — a common problem on domains where DNS or webroot validation breaks after an infrastructure change.

If your app sends transactional email, blocklist monitoring checks whether your sending IP or domain has landed on a spam list. Better to find out from an alert than from a support ticket about missing password reset emails.

Alerts that fit a PHP developer's workflow

Every alert includes a one-click acknowledge link. Click it from Slack or email, and repeat notifications pause for 24 hours — no need to log into a dashboard while you're already SSH'd into the server diagnosing the issue. If you need alerts to reach on-call engineers, the Pro plan adds SMS, and Business adds voice calls with PagerDuty and OpsGenie integration.

For teams running multiple Laravel projects (a main app, an admin panel, a queue worker service), WatchCron's project-based structure keeps checks and alerts separate. The Stripe webhook reconciler failing in production shouldn't page the person responsible for the staging environment.

Pricing that works for a single Laravel app or a fleet

The free plan gives you 20 checks with email and webhook alerts. For a typical Laravel project — a couple of cron jobs, uptime, SSL, and a few port checks — that's enough without paying anything. Slack and Telegram alerts start at $7/month on Starter (or $5/month billed yearly).

If you manage client projects or run several apps, the Pro plan covers 250 checks and 10 team members. Port and domain monitors stay unlimited across every plan. There's an API for creating checks programmatically — useful if you provision environments with Forge or Terraform and want monitoring created alongside the infrastructure.

Start monitoring your Laravel app

<p>Add a <code>thenPing()</code> call to your scheduled task and get alerted when it stops running. 20 checks free, no credit card.</p>

Create Free Account

Frequently Asked Questions

No. Laravel's built-in thenPing() and pingOnSuccess() methods handle the integration. Your task pings a URL when it finishes — no package to install or maintain.

The HTTP request is non-blocking in Laravel's scheduler. If the ping endpoint is unreachable, the request times out silently without affecting your task's execution.

Yes. Forge and Vapor both run the standard schedule:run cron entry. Add thenPing() to each task in your code, deploy, and monitoring is active. No server-level configuration needed beyond the crontab entry Forge already creates.

Create a separate check for each task with its own ping URL and schedule. WatchCron tracks each one independently, so a daily backup and a five-minute queue check get their own grace periods and alert rules.

Start monitoring in under 2 minutes

Free plan includes 20 checks. No credit card required.

See Plans & Pricing