← Back to Blog

The Hidden Revenue Leak: Why MSPs Underbill Thousands Every Quarter

By ClientCommit Team

The money you're losing isn't from bad deals. It's from services you deliver but never invoice.


There was a post on Reddit a few months back that stopped me cold.

A small MSP owner, managing around 400 seats, ran a manual billing audit. One evening, just going line by line through spreadsheets. He found he'd underbilled roughly 5,000 euros over the previous three to four months. Services delivered, costs absorbed, invoices never sent.

But the part that really got me was this: he'd been running cloud backups for some clients since 2023 and had never billed them. Not once. The service was running, he was paying the vendor, and the revenue line was zero.

His summary was painfully honest: "Too many lists. Too much manual tracking. Billing not always matching reality."

He's not an outlier. He's the norm.


What is revenue leakage? Revenue leakage is the gap between what a service company delivers under contract and what it actually invoices. It typically results from unbilled services, missed billing triggers, and contract terms that never get translated into invoicing workflows.


Where the money actually goes

Revenue leakage in a service company isn't dramatic. Nobody embezzles it. No client negotiates it away. It just quietly evaporates because the link between "what we promised in the contract" and "what shows up on the invoice" breaks down.

I've seen this happen in three consistent patterns.

1. Services delivered but never billed

This is the cloud backup scenario. You add a service during onboarding, the tech sets it up, and nobody tells billing. Or billing knows, but the line item never makes it into the recurring invoice template.

It happens more than anyone admits. Another MSP owner posted about acquiring a small shop and discovering, months into integration, that multiple clients had been systematically underbilled on per-user counts. Not maliciously. Just because nobody reconciled the active user list against the invoice after the initial setup.

It's almost always the same story: the person who provisions the service is not the person who sends the invoice. And nothing connects the two.

2. Contract changes that don't reach billing

Client upgrades from 15 to 22 Microsoft 365 licenses. The tech adds them in the admin portal. The monthly invoice still says 15.

Or the client's contract includes a rate adjustment clause that kicks in at renewal. The renewal passes. Nobody updates the rate. You're now delivering services at last year's price while your vendor costs went up.

One MSP owner described outsourcing his billing because he simply couldn't keep up with reconciliation across clients. He was losing "significant revenue" from this exact gap, and the accountants he'd tried to train glazed over when it came to understanding what each line item actually represented.

3. Scope creep you absorb instead of billing

This one is emotional, not just operational.

A post that resonated with a lot of MSP owners described a company that had let scope creep run for years because the founders saw client relationships as partnerships. They did work outside the contract because it felt like the right thing to do. It was never malicious. It was generous. And it was quietly destroying their margins.

The poster put it well: "Growth doesn't pair well with scope creep." The longer you let it run, the harder it is to claw back, because now the client considers that free work as part of the baseline.

I've talked to MSP owners who tracked this after reading their contracts carefully. One found four distinct services being delivered to a client that weren't in the agreement at all. Not small things. Scheduled reporting, after-hours monitoring, and a monthly compliance check that had somehow become "just part of what we do."

That work had value. It just never appeared on an invoice.


Why this is a contract problem, not a billing problem

Most people treat revenue leakage as a billing ops issue. Fix the invoicing process, reconcile more often, hire someone to audit the numbers quarterly.

That helps. But it's treating symptoms.

The root cause is simpler than it sounds. Your contract says "monthly cloud backup for all endpoints at $X per device." That's a billing obligation with a clear trigger: the number of active endpoints, checked monthly, invoiced at the agreed rate.

But nobody actually does that check. The obligation lives in the PDF of the signed contract. Not in the billing system. Not in the PSA. Not anywhere that someone sees on the first of each month and thinks, "I need to reconcile this before invoicing."

Think about what a typical contract actually commits you to bill for:

Obligation TypeExampleTypical Billing TriggerWho Usually Tracks It
Per-user licensingM365, security toolsUser count changesNobody, until audit
Managed services retainerMonthly flat feeContract start dateUsually fine
Variable servicesBackup, archivingDevice/data volume changesThe tech, maybe
Project workMigrations, deploymentsMilestone completionPM, if you have one
Rate adjustmentsAnnual price increase clauseContract anniversaryThe contract itself, unread
Add-on servicesAfter-hours support, complianceUsage or delivery eventScattered or missing

The retainer gets billed correctly because it's simple. Everything else is a risk. And the riskiest items are the ones that change: variable services, user counts, add-ons that get provisioned mid-contract.

It's not sloppy bookkeeping. It's that nobody reads the contract after it's signed and turns each commercial term into something that actually triggers an invoice.


The compounding problem

Revenue leakage doesn't announce itself. It compounds.

If you're underbilling three clients by $200 per month each, that's $7,200 per year. Not life-threatening. But also not nothing for a small MSP.

Scale that up. An MSP with 30 clients, each with two or three variable services that drift out of sync with billing over time, can easily leak $20,000 to $50,000 annually. I've seen numbers in that range when owners actually sit down and audit.

According to MGI Research, businesses lose between 1% and 5% of revenue to billing leakage. For a $2M MSP, that's $20,000 to $100,000 per year. Not from losing clients. Not from pricing too low. From delivering work and forgetting to charge for it.

The frustrating part is you feel the margin pressure without being able to point at the cause. Revenue looks okay. Client count is growing. But profitability isn't keeping pace. You start thinking costs are too high or pricing is too thin. Sometimes that's true. But often, a meaningful chunk of the gap is just services you're already delivering for free.


What a fix actually looks like

Auditing harder or hiring a billing person helps, but it's compensating for a broken handoff. What actually fixes the problem is making sure every billable obligation in a contract becomes visible to the people responsible for invoicing.

Start with a contract-to-billing reconciliation

Pick your top ten clients. Pull their contracts. For each one, list every service or deliverable that should generate a line item on their invoice. Then compare that list against what you actually billed last quarter.

This is the exercise that turned up the 5,000 euro gap for the MSP owner I mentioned earlier. It's not fun. It takes an afternoon. But most people who do it find at least one service per client that's either unbilled or underbilled.

Build a billable obligation register

For each client, maintain a simple record of:

  • What services are contractually billable
  • What triggers the billing (monthly, per-user, per-device, per-event)
  • What the current unit count or rate is
  • When it was last verified

This doesn't need to be complicated. A shared spreadsheet works if someone actually owns it. The key is that it exists as a separate artifact from the contract, updated when things change, and reviewed before each billing cycle.

Close the provisioning-to-billing loop

When a tech adds licenses, provisions a new backup, or turns on a new service for a client, that change needs to reach whoever sends invoices. Today, in most MSPs, it doesn't.

The simplest version: a shared channel or form where any service change gets logged with the client name, what changed, and the billing impact. Even a Slack channel called #billing-changes would be better than the current state at most shops I've seen.

Set reconciliation triggers on contract events

Rate adjustment clauses, renewal dates, and annual true-ups are the billing events that are easiest to miss and most expensive when you do. If your contract says rates adjust by CPI annually, you need an alert 30 days before that anniversary. Not a calendar reminder that gets dismissed. Something that creates a task someone has to close.


Where tools fit (and where they don't)

PSA platforms handle time-and-materials billing reasonably well. If the tech logs the hours, the invoice can include them. But for recurring services, variable billing, and contract-driven rate changes, PSAs are passive. They bill what you tell them to bill.

Accounting software (QuickBooks, Xero, Zoho Books) sends the invoices. But it has no awareness of what the contract says should be on the invoice. It's downstream of the problem.

Spreadsheets work until someone forgets to update a row. Which happens the moment you're busy, which is when billing accuracy matters most.

None of these tools know what the contract says. They operate downstream of the problem.

We built ClientCommit because of this gap. You upload the contract, and it pulls out every commercial obligation: what should be billed, to whom, on what schedule, and at what rate. Billing triggers, rate adjustment windows, renewal terms, variable service commitments. When a billing event is approaching, your team sees it before the invoice goes out, not after the quarter closes. Your data stays private: AES-256 encryption, anonymized before any AI processing touches it.

Not every MSP has a revenue leakage problem that justifies a new tool. If you're running five clients with straightforward flat-rate agreements, your invoicing probably stays in sync without much effort. But once you're past fifteen or twenty clients, each with slightly different billing models and variable services, the manual approach starts costing real money. We're onboarding founding customers now with hands-on setup and lifetime pricing if you want to take a look.


The uncomfortable math

If you're reading this and thinking "this probably doesn't apply to me," I'd push back gently on that.

Pick three clients. Just three. Pull their contracts and list every service that should generate revenue. Compare it against last month's invoice.

The MSP owner who found the 5,000 euro gap didn't think he had a problem either. He ran the check because he was "starting to lose track." By the time you feel like you're losing track, the leak has already been running for months.

That gap between what you deliver and what you bill? That's your margin.


clientcommit.com