The Monthly Report Nobody Wanted to Build

The Monthly Report Nobody Wanted to Build

It's the last week of the month. Someone on the operations team opens the PSA tool, pulls up the list of active prepaid agreements, and starts the ritual. Agreement by agreement, they check how many block hours each client purchased, how many were consumed, how many remain. They copy the numbers into a spreadsheet. They format it. They generate a PDF. They look up the right contacts for each client. They compose an email, attach the PDF, and send it.

Then they do it again. And again. For every single client.

By the time they've worked through the entire list — a hundred-plus reports — days have passed. The data they pulled at the start is already stale. And next month, they'll do it all over again.

A managed services provider brought this problem to us. Not because it was technically complex. Because it was relentlessly tedious, and the people doing it had better things to do with their time.

The Gap Between Data and Delivery

Here's the thing that made this interesting. The data already existed. The PSA tool had everything — agreements, hours, time entries, contacts. It was all sitting right there behind an API. The problem wasn't access to information. The problem was the twenty manual steps between "the data exists" and "the client receives a polished report."

Pull the data. Reconcile it. Format it. Brand it. PDF it. Find the recipients. Email it. Track who got what. Follow up on bounces. Repeat monthly.

According to Kaseya's 2025 Global MSP Benchmark Report, 95% of MSPs say integrating their core tools — RMM, PSA, documentation — is essential. But essential doesn't mean it's happening. The same report found that 15% of MSPs are still wasting time just switching between disconnected tools, and 27% aren't using their existing software to its full potential. The data is there. The plumbing between "data exists" and "client sees it" is what's missing.

That plumbing is exactly what we built.

The System We Built

We designed a full-stack reporting platform that automates the entire lifecycle: sync the data from the PSA, generate reports, review them, approve them, produce branded PDFs, and email them to the right people. One workflow, start to finish.

The backend runs on FastAPI with Python, talking to a PostgreSQL database via async SQLAlchemy. It syncs directly with the PSA's REST API to pull active prepaid agreements, monthly usage data, and time entries. No manual data extraction. No spreadsheets. The system reaches into the PSA, grabs what it needs, and builds the reports automatically.

The frontend is a Next.js dashboard built in TypeScript. Staff log in and see every report for the current month — filterable by status, account manager, utilisation band, and more. They can drill into any report, review the time entries, edit individual line items if something needs adjusting, and approve reports individually or in bulk.

Once a report is approved, the system generates a branded PDF using ReportLab — company logo, summary tables, time entry breakdowns, custom fonts and colours. The PDF gets stored in the database, ready to send. Staff preview the email, confirm the recipients (pulled automatically from PSA contacts), and hit send. The system handles delivery through an SMTP API, supports BCC, and tracks send history per recipient.

The entire flow that used to take days now takes a review session and a few clicks.

Alerts That Think Ahead

One of the more valuable features wasn't about reports at all — it was about what happens between reports.

We built a four-tier utilisation alert system. Staff configure percentage thresholds — say 50%, 75%, 90%, and 100% — and the system monitors usage against those bands continuously. When a client's hours cross a threshold, the system automatically sends an alert to the account manager. No waiting until month-end to discover a client burned through their hours two weeks ago.

The alert system runs on a scheduler, processing all active agreements daily. It includes suppression logic — staff can suppress alerts for specific agreements with a reason and optional expiry, so they're not drowning in noise for accounts they're already managing. There's also a reset buffer to prevent alert spam when clients replenish their hours.

It's a small feature on paper. In practice, it's the difference between reactive account management and proactive client conversations.

The AI Layer

We also embedded an AI assistant directly into the dashboard. Staff can ask natural-language questions about report data — utilisation trends, comparisons across months, anomalies in time entries — and get conversational analysis back.

This wasn't about replacing human judgement. It was about surfacing insights that would otherwise require someone to manually cross-reference multiple reports and spreadsheets. When you're managing a hundred-plus client agreements, the patterns that matter are the ones hiding in the aggregate data. The AI makes those patterns accessible without the legwork.

Kaseya's 2025 benchmark data shows that 30% of MSPs say AI is helping them eliminate repetitive tasks, and 20% report it gives them more time for strategy. What we found building this is that the real value isn't in eliminating the task itself — it's in making the data useful to people who previously only interacted with it through manual processes.

Audit Trail and Admin Control

Every action in the system gets logged — who approved what, when reports were regenerated, which time entries were edited, what the values were before and after. Full audit trail with filtering and pagination.

We built a role-based access system on top of this. Regular authenticated users can work with reports. Admins get access to email settings, alert configuration, and send history. Super admins manage users and global settings. The roles live in the database, not in the auth tokens, which kept the permission model flexible and easy to extend.

There's also a changelog system with per-user "seen" tracking. When the platform gets updated, staff see an indicator showing what's new. Small touch, but it keeps the team aligned on what the tool can do as it evolves.

By the Numbers

The business impact comes down to two operational roles this system replaces or reduces:

  • A reporting analyst who would otherwise spend days each month pulling PSA data, building spreadsheet reports, generating PDFs, and managing the distribution process. Average Australian salary: around $90,000/year (SEEK, 2026).
  • An operations coordinator (partial) who would otherwise handle recipient management, email follow-ups, and manual tracking of what was sent to whom. We estimate roughly half this role's time is recovered. Average Australian salary: around $75,000/year (SEEK/Hays, 2026), so approximately $37,500 in savings.

That's approximately $140,000 in annual operational savings — recurring costs the business no longer carries for these functions. Plus roughly $12,500/month in time that senior staff reclaim from report review and approval, which previously required manual data verification.

The build — a FastAPI backend with 9 API route modules, a Next.js frontend with 12+ pages and 30+ components, PostgreSQL with 9 tables, Docker deployment, and CI/CD pipelines — would have taken a traditional development team roughly 480 hours to deliver.

The Pattern Worth Noticing

Every MSP has this problem in some form. The data lives in the PSA. The clients need to see it. And in between, there's a person — usually an expensive, skilled person — doing work that a system should be doing for them.

The 39% of MSP technicians working consecutive 50+ hour weeks (Kaseya, 2025) aren't burning out because the work is hard. They're burning out because too much of it is mechanical. Pull data, format data, send data. Repeat.

The fix isn't always a massive transformation. Sometimes it's just closing the loop between where the data lives and where it needs to go — and letting people focus on the parts that actually require a human brain.

    Float Infinity Logo

    Powered by Float Infinity

    Privacy PolicyTerms of Service© 2025 Float Infinity