Finding and fixing unbilled time at an MSP
Where billable hours go missing between the ticket and the invoice, the four places to look each month, and the habits that stop it happening again.
Updated October 22, 2026
Every MSP that bills for time outside its agreements loses some of it. Not through a single big mistake, but through small gaps between the moment work happens and the moment it reaches an invoice: a timer never started, an entry never approved, an approved entry that missed the billing run.
Unbilled time is billable work that has been done but not invoiced. Some of it is simply this month’s work, waiting for the next run. The part worth chasing is the time that has been waiting longer than it should.
Where billable time goes missing
- Never recorded. Quick phone fixes, a chat message answered between tickets, the after-hours call taken from a phone. If logging time means opening a laptop, it does not get logged.
- Recorded as non-billable. A technician is not sure whether the work is covered by the agreement, so they mark it non-billable to be safe.
- Stuck waiting for approval. Entries sit in a submitted state because whoever approves them was busy, and the billing run only picks up approved time.
- Approved but never invoiced. The entry is approved, but it belongs to a client with no agreement, an ended agreement, or a billing setting that skips it.
A monthly check that takes twenty minutes
Before each billing run, look at four lists:
- Approved billable time older than 30 days and not invoiced. This is money already earned. Find out why each entry was skipped and invoice it.
- Time waiting more than two weeks for approval. Approve it, or send it back with a reason.
- Work for clients with no active agreement. Tickets opened for a client whose agreement ended, or who never had one, usually mean either an invoice or a renewal is missing.
- Non-billable time by technician. If one technician marks far more time non-billable than the rest, it is often a training question about what the agreements cover.
Habits that stop it happening
- Make the timer easy to reach. The same timer on the desktop, the web and the phone, attached to the ticket, so starting it costs one tap.
- Decide billable by agreement, not by technician. If the agreement says what is covered, the system can apply it and technicians can stop guessing.
- Approve weekly. A short weekly approval is easier than a month-end pile, and mistakes are fresher.
- Watch prepaid blocks. When a client’s block of hours runs out, work should start billing as overage automatically rather than quietly continuing for free.
Measuring it
Two numbers are worth tracking month to month: the value of approved time older than 30 days that has not been invoiced (it should trend towards zero), and the share of logged time that is billable, per technician and per client. The second number is also the start of knowing which clients are profitable.
How Opcrunch handles it
In Opcrunch, time is logged against the ticket from the web, the phone app or the desktop timer. Agreements apply their rates, included hours and prepaid blocks as the time is recorded, and approved time flows onto the invoice. The unbilled time report totals what is waiting by client, and the revenue check lists approved billable time over 30 days old that has not been invoiced, time waiting more than 14 days for approval, and work for clients whose agreement has ended or who have none.