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
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
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 Consultant | Domo / Tableau | This System | |
|---|---|---|---|
| Setup cost | $10,000-30,000 | $5,000-15,000 | $0 |
| Monthly cost | $3,000-8,000 | $300-2,000 | ~$5 |
| Custom integrations | Yes (slow) | Limited | Yes (any API) |
| AI analysis per section | No | No | Yes |
| Time to first version | 4-12 weeks | 2-6 weeks | 1 week |
Excludes Claude API usage for nightly analysis (a few dollars per month).
Tech Stack
What It Took
The dashboard itself is the easy part. The work is in three places that nobody talks about:
- 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.
- 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.
- 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 CallFree, 30 minutes. No pitch deck.