Finance reports + KPIs — what to look at every Friday
M15 Reports module ships finance-relevant reports out of the box. Plus three dashboard panels (cashflow forecast, AR aging, pipeline conversion) for at-a-glance partner view. Here's the catalogue + which KPIs matter.
The 4 finance reports
Per-client total billed (Σ tax-invoice grand_total) · paid · outstanding · advance held. Sortable by any column. CSV/PDF export.
Per-invoice 4-bucket aging. Days past due. Last-contact date. Promised payment date. Filter by client/bucket/manager.
Per-payment list with allocations. Filter by date range / client / method. Reconciles to bank statement totals.
Quote pipeline: sent · accepted · rejected · expired. Acceptance % by fee bracket. Avg days lead-to-quote.
Dashboard panels (not reports — live KPIs)
1 · 13-week cashflow forecast
Chart.js stacked bar covering next 13 weeks (Sunday-anchored):
- Committed band (navy) — outstanding balance_due on sent/partially_paid/overdue tax invoices, bucketed by due_date
- Expected band (teal) — sent/revised quotes weighted at 50% probability
- Overdue invoices collapse to week 0 (the past)
- Hover tooltip shows component invoices/quotes
Visible to partner + accountant + super_admin only. Hidden if no upcoming activity.
2 · AR Aging tile
Total firm-wide AR + 4-bucket breakdown (current / 1-30 / 31-60 / 60+). Click any bucket → drill into AR Aging Detail filtered to that bucket.
3 · Pipeline Conversion (4-tile band)
Last 90 days:
- Lead win rate (won ÷ closed)
- Quote acceptance rate (accepted ÷ closed)
- Avg cycle in open leads/quotes (mean DATEDIFF since creation)
- Stuck count (open items with no activity 14d+)
Click stuck count → deep-link to /leads?stuck=1 with auto-filter applied.
The 7 KPIs every audit-firm partner watches
| KPI | Healthy | Warning | Crisis |
|---|---|---|---|
| Total AR / monthly revenue | < 1.5× monthly | 1.5-3× | > 3× |
| AR in 60+ bucket | < 5% | 5-15% | > 15% |
| Days Sales Outstanding (DSO) | 30-45 days | 45-60 | > 60 |
| Quote acceptance rate | 30-50% | 20-30% / 50-70% | < 20% / > 70% |
| Lead win rate | 30-50% | 20-30% | < 20% |
| Advance held (un-allocated) | < 10% of monthly revenue | 10-30% | > 30% |
| Avg cycle (lead → paid) | 60-90 days | 90-150 | > 150 |
Custom reports
The M15 catalogue is firm-wide; if your firm needs custom reporting (e.g. partner-specific revenue book), add a row to ReportService::catalogue():
code— unique identifierarea— group (Sales / Engagements / Billing / HR)name+descriptioncolumns— list of column headersparams— filter params (date range, integer)- Implementation: a private method returning
{ok, columns, rows, totals}
The runner UI auto-generates filter form + result table + CSV/PDF export from the catalogue entry.
Step-by-step — the Friday-morning routine
Open Dashboard
Glance at: Pipeline Conversion (any stuck items?), AR Aging tile (any new 60+?), 13-week forecast (next 4 weeks healthy?).
Open Reports → AR Aging Detail
Sort by days_overdue descending. Top 5 are this week's collection focus.
Walk each top row
Last contact? Promised date? Status? With the accountant, decide: chase / payment plan / partner letter / write-off.
Update Collection log
For each row, log the action taken. Drives next week's review.
Open Reports → Quote Conversion
Any stuck quotes? Reach out, refresh, or write off.
Open Reports → Revenue by Client
Top 10 clients by revenue. Any concentration risk? Any going down YoY?
Total time: 30 minutes per week. This single hour is the highest-leverage activity for firm cashflow + revenue stability.
Exporting to CSV/PDF
Every report has 2 export buttons: CSV (RFC-4180 with UTF-8 BOM) + PDF (dompdf-rendered branded A4 landscape). Filters from the current view propagate to the export URL. Each export audit-logged at m15.report.export.{csv|pdf}.
Run Reports → Revenue by Client for the current FY. Export to CSV. Open in Excel / Google Sheets. Add a sparkline column showing each client's monthly billed amount. You'll spot trends instantly — clients quietly winding down before they tell you, clients ramping up before you notice on the dashboard.
Don't substitute reports for the dashboard panels — both serve different purposes. Dashboard panels are real-time, partner-facing, summary. Reports are detailed, filterable, exportable. If you only look at reports, you're working last week's data; if you only look at the dashboard, you're missing the long tail of small-client risk. Use both.
First Monday of each month, partner reviews: top 10 clients revenue (Reports → Revenue by Client) · AR > 60 days (Reports → AR Aging Detail filter 60+) · stuck quotes (Pipeline → stuck filter) · cashflow forecast (Dashboard panel). 60 minutes. Drives the firm's monthly leadership conversation.