Docs / Reports & analytics / Reading the reports page

Reading the reports page

The 4 KPI cards, 3 charts, and top-client table. What each number means and how to use it.

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.

Was this article helpful?

Contact support