Owner → Reports. One page, no sub-navigation. Cache is refreshed hourly per tenant; append ?refresh=1 to force an immediate recompute.
The 4 KPI cards
- Invoiced this month. Total of all invoices issued this calendar month (not just paid). Gives you top-line revenue velocity.
- Collected this month. Total of payments received this calendar month. Compare to invoiced: the ratio tells you cash flow health.
- Outstanding A/R. Unpaid invoice total across all ages. Click to drill into the aging chart.
- DSO (Days Sales Outstanding). Average days from issue to collection over the last 90 paid invoices. Lower is better. National median for lawn/pool shops is ~22; shops on automated dunning run 11-15.
The 3 charts
- MRR trend (line). Month-over-month recurring revenue, 12 months. Tracks the underlying subscription health regardless of one-off jobs.
- Revenue by service (bar). Last 90 days, top 10 services. Tells you which services are actually making money and which are long-tail.
- AR aging (doughnut). Outstanding A/R broken into current / 1-30 / 31-60 / 61-90 / 90+ day buckets. More concentration in later buckets = collections problem.
The top-clients table
Top 10 clients by revenue in the last 12 months. Click a client to open their detail page. Hover over the trailing sparkline to see monthly pattern.
The top-10 concentration (revenue from your top 10 ÷ total revenue) is a quiet risk metric. Shops where the top 10 is >40% of revenue are concentration-vulnerable — losing one of those clients is a meaningful shock.
The "below the fold" reports
- Labor by employee. Shift + visit minutes × hourly rate per employee over 90 days.
- Gross margin (last 90 days). Revenue − labor cost aggregate, expressed as % margin. See Why your gross margin looks wrong for context.
Reports cache is per-tenant, 1 hour. If you just completed a big visit and the dashboard does not reflect it, use
?refresh=1 in the URL to bust the cache. Do not rely on cache-bust for every view — the cache exists for performance and abusing it slows everyone.