Back to Projects

Real-Time SaaS Monitoring Platform

A multi-tenant uptime monitoring service with five probe types, real-time WebSocket dashboards, 16+ notification channels, escalation chains, public status pages, and multi-currency Stripe billing.

Laravel 12 Astro 5 React 19 TypeScript Tailwind CSS shadcn/ui MySQL Redis Docker Laravel Horizon Laravel Reverb Stripe Cashier Recharts

Overview

A production-grade infrastructure monitoring SaaS that tracks uptime, performance, and availability across HTTP, TCP, DNS, Ping, and Heartbeat probe types. Organisations configure monitors, define alerting rules with escalation chains, and receive notifications through any of sixteen integrated channels — from Slack and PagerDuty to SMS and voice calls.

The platform runs as a fully containerised Docker Compose stack with a Laravel 12 API backend, an Astro 5 frontend with React island components, Horizon queue workers, a Reverb WebSocket server, MySQL, and Redis behind a Caddy reverse proxy.

Monitoring Probes

Five probe types cover the most common monitoring needs:

  • HTTP/HTTPS — full HTTP probes with configurable method, headers, authentication, body content matching, and SSL certificate expiry checking
  • TCP — port connectivity checks for services that don’t speak HTTP
  • DNS — record resolution verification against expected values
  • Ping — ICMP connectivity and latency measurement
  • Heartbeat — cron job and scheduled task monitoring with configurable grace periods — if a heartbeat isn’t received within the expected window, an incident is raised

Monitors support grouping, maintenance windows with cron-like scheduling, and grace periods to prevent false alarms during brief transient failures.

Real-Time Dashboard

Check results are broadcast the instant they complete via Laravel Reverb, the first-party WebSocket server. The Astro frontend subscribes to monitor channels through Laravel Echo, updating dashboard metrics, response time charts, and status indicators without polling.

The frontend uses Astro’s island architecture to server-render page layouts for fast initial loads while hydrating interactive React components — monitor timelines, response time graphs built with Recharts, and real-time status indicators — only where interactivity is needed.

Twenty pages cover the full application surface: authentication flows, monitor management, incident tracking, alerting configuration, team administration, billing, organisation settings, and public status pages.

Alerting and Escalation

The alerting system is built around rules, channels, and escalation chains:

  • Alert rules — trigger on specific events (down, recovered, SSL expiry) with configurable delay periods to prevent notification storms during brief outages, and repeat intervals for ongoing incidents
  • Notification channels — sixteen drivers including Slack (webhook and bot token with thread support), Discord, Microsoft Teams, Telegram, PagerDuty, OpsGenie, Google Chat, Pushover, Mattermost, SMS, voice calls, email, webhooks, and Zapier
  • Escalation chains — multi-step escalation sequences that progress through notification channels when incidents are not acknowledged within defined timeframes
  • Coverage matrix — a visual overview showing which monitors are covered by which alert rules and channels, highlighting gaps in notification coverage

Each notification channel tracks its own health status based on send success rates over the previous twenty-four hours, surfacing degraded or failing integrations before they cause missed alerts.

Incident Management

When a monitor fails, an incident is created and tracked through its lifecycle:

  • Incidents are raised after configured failure thresholds are exceeded
  • Escalation chains advance through steps until the incident is acknowledged
  • Recovery events automatically resolve incidents and send recovery notifications
  • Incident history is retained with full timeline: creation, escalation steps, acknowledgement, and resolution

Multi-Currency Billing

Stripe integration via Laravel Cashier manages subscriptions with multi-currency support:

  • Plan tiers — configurable feature limits per plan (monitor count, check frequency, retention period, notification channels)
  • Multi-currency — pricing stored per currency with Stripe Price IDs mapped to plan tiers, supporting localised checkout
  • Checkout — Stripe Checkout sessions for payment collection with webhook-driven subscription state management
  • Billing portal — self-service plan changes, payment method updates, and invoice history

Background Processing

Laravel Horizon manages three dedicated queue supervisors:

  • Default — general application jobs (one to ten workers, auto-scaling)
  • Checks — monitor probe execution (five workers dedicated to check throughput)
  • Notifications — alert dispatch with retry logic and exponential backoff for failed deliveries

The scheduler dispatches monitor checks on their configured intervals, and evaluates heartbeat monitors for missed check-ins. Horizon’s dashboard provides operational visibility into queue throughput, job failure rates, and worker utilisation.

Infrastructure

The Docker Compose stack runs eight services:

  • Caddy — reverse proxy with automatic HTTPS, routing API traffic to Laravel and everything else to the Astro frontend
  • App — Laravel API serving RESTful endpoints with PHP 8.5
  • Worker — Horizon process managing all three queue supervisors
  • Scheduler — Laravel scheduler dispatching recurring monitor checks
  • Reverb — WebSocket server for real-time event broadcasting
  • Frontend — Astro dev server with React components and Tailwind CSS
  • MySQL 8.4 — primary data store with sixty-two migrations defining the schema
  • Redis — queue backend, cache layer, broadcasting driver, and Reverb scaling adapter

Multi-Tenancy and Teams

Organisations are the tenancy boundary. Users belong to organisations with role-based permissions. Team management, invitation flows, and per-organisation billing are handled through dedicated administration pages. Public status pages can be configured per organisation, displaying monitor group statuses to external users without requiring authentication.