Home/Proof/Operations Dashboard
Case Study

How I Replaced 4 Logins With One Operations Dashboard

Every morning I was checking Stripe, GoHighLevel, BookingKoala, and Google Ads in separate tabs. Then I built a single dashboard that pulls every number I care about into one screen, with AI-written analysis on every section. Here's how it works and what it cost.

Built for: My own cleaning company
Hosted on: Railway
Hosting cost: ~$5/month

The Problem

I run a cleaning company that serves 200+ customers a month and generates 1,000+ leads a month. The data I needed to make decisions was scattered across four platforms: Stripe for revenue, GoHighLevel for the CRM, BookingKoala for jobs and cleaner payouts, and Google Ads for Local Service Ads spend.

Every morning I was opening four tabs, checking four dashboards, and trying to mentally cross-reference numbers that lived in different formats. I couldn't answer simple questions like "which market is profitable this month?" or "which cleaner is costing me money in refunds?" without 20 minutes of clicking.

I needed one screen, not four.

What I Built

I built a dashboard that pulls data from every system, runs the calculations I care about, and displays everything on one password-protected URL. It runs on Railway, refreshes nightly at 1 AM Eastern, and is accessible from my phone.

The dashboard has 18 sections covering revenue, refunds, churn, lead sources, conversion funnels, area profitability, cleaner quality scoring, manual issue reports, LSA analytics, organic traffic, and rank tracking. Every section has AI-written analysis on top of the raw numbers, so I see "what changed and whether to worry" instead of just a table.

The hard part wasn't the front end. It was building the backend that connects to all the data sources, normalizes the formats, and stores the historical data in a way that survives deploys.

System Architecture

Stripe
Data source
GHL
Data source
BookingKoala
Data source
Google Ads
Data source
BrightLocal
Data source
Catalina BI Server (Python)
24-tool MCP server. Normalizes and caches all data.
SQLite (persistent volume)
Booking log, issues, history
Claude API
Section-level analysis text
Webhooks (Zapier)
Live booking + completion events
Dashboard (Railway)
Password-protected, phone-accessible, always-on

Refreshes nightly at 1 AM ET. Webhook events update the booking log in real time.

The 18 Sections

Every section is built around a question I actually ask. Each one shows raw numbers and an AI-written analysis paragraph that tells me what changed and whether to worry.

  • ·Revenue KPIs (7-day, 30-day, MTD)
  • ·Refund report with reason codes
  • ·Churn detection (inactive customers)
  • ·Lead sources (LSA, Yelp, organic)
  • ·Conversion funnel by source
  • ·Area profitability per market
  • ·Cleaner scoreboard with risk levels
  • ·Manual issue reports
  • ·LSA analytics (real CPL, day/hour patterns)
  • ·GA4 organic traffic chart (6 months)
  • ·Local rank tracker (30 keywords)
  • ·Citation score from BrightLocal
  • ·Marketing spend vs revenue
  • ·Cleaner payouts (from accounting)
  • ·Expense anomaly alerts
  • ·P&L month-to-date
  • ·Booking log (every job)
  • ·Lead type classification

The Numbers

18
Sections on the dashboard
Each with AI analysis
24
Tools in the BI server
Reusable across all systems
4
Logins replaced
Stripe, GHL, BK, Google Ads
$5/mo
Hosting cost
Railway always-on

Cost Comparison

The "build a real BI dashboard" budget for a small business is normally five figures. Here's what this same output would have cost through traditional channels:

BI ConsultantDomo / TableauThis System
Setup cost$10,000-30,000$5,000-15,000$0
Monthly cost$3,000-8,000$300-2,000~$5
Custom integrationsYes (slow)LimitedYes (any API)
AI analysis per sectionNoNoYes
Time to first version4-12 weeks2-6 weeks1 week

Excludes Claude API usage for nightly analysis (a few dollars per month).

Tech Stack

Python + Flask
Dashboard server
Railway
Always-on hosting + persistent volume
SQLite
Booking log, issue tracker, history
Claude API
Section-level analysis text
Stripe API
Revenue, refunds, churn
GHL API
CRM, leads, conversations
BookingKoala webhooks
Job creation + completion
Google Ads API
Real LSA cost-per-lead
Digits OAuth
Cleaner payouts + expenses
BrightLocal API
Citations + rank tracking

What It Took

The dashboard itself is the easy part. The work is in three places that nobody talks about:

  1. 1Trusting the data. I had to audit every metric and strip the ones I couldn't verify. Half my original dashboard came down because the underlying tags were wrong. Trustworthy < pretty.
  2. 2Persistent storage. Webhook data was getting wiped on every Railway deploy because it was stored in the ephemeral container filesystem. Adding a persistent volume took 5 minutes and saved months of data.
  3. 3Forward-only attribution. Instead of trying to backfill years of bad historical tagging, I committed to clean data from day one. Every metric on the dashboard is trustworthy because I draw a line and don't pretend the past was better than it was.

Want a dashboard like this for your business?

If you're checking 3+ tools every morning to figure out how your business is doing, you need this. Let's talk about what your version would look like.

Book a Strategy Call

Free, 30 minutes. No pitch deck.