The problem
Anyone running queued jobs in Laravel knows the drill. During development, Telescope gives you full visibility. But in production? Queue activity is a black box. When a job fails, you SSH into the server, run artisan commands, dig through logs, and hope for the best.
Queuewatch exists because we got tired of that workflow. We wanted real-time visibility into what our queues were doing, without touching the server.
Phase 1: The open-source package
We started by building an open-source Laravel package, available on GitHub. It extends the php artisan queue command with advanced filtering and diagnostics you can run directly in your terminal.
What the package does
The queue:failed command outputs failed jobs as a table or JSON (via the --json flag). The real power is in the filters:
- Filter by queue name to isolate specific queues
- Filter by connection (Redis, SQS, database)
- Filter by time range (
--after=yesterday --before=today) - Filter by job class (
--class=SendEmail) - Combine all filters in a single query
- Output as table or JSON for scripting
Example JSON output:
{
"failed_jobs": [
{
"id": "1234",
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"connection": "redis",
"queue": "emails",
"payload": {
"displayName": "App\\Jobs\\SendEmail",
"job": "Illuminate\\Queue\\CallQueuedHandler@call",
"data": {}
},
"exception": "Connection timeout...",
"failed_at": "2025-11-21 10:30:00"
}
],
"count": 1
}The idea: when Sentry fires an alert, you should be able to pinpoint the failed job and its cause in seconds, not minutes.
Phase 2: From CLI to SaaS
The CLI package was great for manual investigation. But production needs outgrew it quickly. We needed automatic alerts the moment a job fails. We needed the ability to mute known non-critical failures, to retry jobs without SSH, and to get a bird's-eye view across multiple apps at once.
That's how Queuewatch as a SaaS product came to be. Think of it as Sentry, but purpose-built for queued jobs.
What we shipped
Three deliverables: the SaaS application (dashboard, billing, team management, alerting), the Laravel package (drop-in integration for any existing Laravel app), and the marketing website (landing page, docs, blog).
The dashboard
Dark-first UI built with React 19 and Inertia.js, designed around the principle of signal over noise. The main screen shows total failures, unresolved count, resolution rate, and average time to resolve. Trend charts (built with Recharts) cover whatever time window you select. Failed jobs flow in with a clear status workflow: new, acknowledged, resolved, retried. You can assign failures to team members and track resolution notes. Everything updates in real time via Laravel Reverb WebSockets.
When a job fails, the failure appears instantly on the dashboard and a notification is sent to the configured channels. No delay, no polling. You see it the moment it happens.
Alerting
You configure rules per project. Alert when a job fails more than n times, mute jobs from a specific queue, route notifications to Slack, Discord, email, or a custom webhook. Alert latency from failure to notification: under 50ms.
Incident assignment
When a failure comes in, someone on the team needs to own it. Queuewatch lets you assign incidents directly to team members from the dashboard. No more "who's looking at this?" in Slack. The assignee gets notified, the failure is tracked, and when it's resolved you see who fixed it and when.
Multi-app support
One Queuewatch account can monitor as many Laravel apps as you need. Each app gets its own project with a dedicated API key, its own alerting rules, configurable environments (production, staging), and its own team.
Billing
Team-based billing through Stripe, powered by Laravel Cashier. Plans with tiered feature limits, fully managed from inside the dashboard.
How Queuewatch is different
Tools like Laravel Pulse, Nightwatch, and Horizon include some level of queue visibility. The difference: they're built for general application performance monitoring (request times, queries, memory) and treat queues as one feature among many.
Queuewatch does one thing. It monitors queued jobs, and it does it deeply. That means finer-grained filters, smarter alerts, a UI designed solely for this workflow, retry-via-webhook without SSH, failure assignment, resolution tracking, and tighter integration with Laravel's queue system than any general-purpose tool offers.
Tech stack
Backend: Laravel 12, PHP 8.3, MySQL, Redis for caching and sessions, Laravel Reverb for real-time WebSocket updates.
Frontend: React 19 with TypeScript, Inertia.js v2 (server-driven SPA), Tailwind CSS v4, Radix UI and Headless UI for components, Recharts for data visualization, React Compiler for automatic render optimization.
Services: Stripe (billing), Resend (transactional email), Sentry (error tracking), Filament v4 (internal admin panel).
Tooling: Vite 7, Pest for testing, Laravel Pint for code style, zero-downtime deploys.
Results
Failure alerts hit the developer's inbox (or Slack, or Discord) in under 50ms. Platform uptime sits at 99.99%. We went from first wireframe to launched product in 6 weeks. The open-source package plugs into any existing Laravel app with zero code changes, just install and configure.


