This report provides a detailed breakdown of hours worked vs hours billed: where does the time go? for managed service providers.
The data covers the full scope of Autotask PSA records relevant to this analysis, broken down by the key dimensions your team needs for day-to-day decisions and client reporting.
Who should use this: Operations managers, service delivery leads, and MSP owners managing capacity
How often: Weekly for scheduling, monthly for utilization reviews, quarterly for staffing decisions
A 75.6% billability rate sits below the 80% threshold most profitable MSPs target. Every percentage point below 80% translates to real revenue left on the table. With 50,751 hours logged, moving from 75.6% to 80% would recover roughly 2,200 additional billable hours without adding headcount.
EVALUATE
ROW(
"Total Hours", [Total],
"Billable Hours", [Billable],
"Non Billable Hours", [Non-Billable],
"Billable Pct", [Billable % (vs Logged)],
"Company Hours Worked", [Company - Hours Worked],
"Company Hours Billed", [Company - Hours Billed]
)
| Metric | Value | % |
|---|---|---|
| Total Hours Worked | 50,752 | 100% |
| Billable Hours | 38,364 | 75.6% |
| Non-Billable Hours | 12,388 | 24.4% |
| Resources | 77 | — |
EVALUATE ROW("TotalHours", SUM('BI_Autotask_Time_Entries'[hours_worked]), "BillableHours", SUM('BI_Autotask_Time_Entries'[Billable Hours]), "NonBillable", SUM('BI_Autotask_Time_Entries'[Non billable Hours]), "HoursToBill", SUM('BI_Autotask_Time_Entries'[hours_to_bill]), "Resources", DISTINCTCOUNT('BI_Autotask_Time_Entries'[resource_name]))
Little Group and Craig-Huynh together account for 1,242 non-billable hours. At $125/hour that's $155,250 in unrecovered labor from two clients. If those contracts are fixed-price, you need to check whether the scope has drifted. If they're T&M, the time-entry process might have gaps.
Rivers, Rogers and Mitchell shows 1,661 hours with zero billed. This typically indicates an internal entity or a client with a contract type where billing is handled through a different mechanism than time entries. Worth confirming this is intentional.
EVALUATE
TOPN(15,
FILTER(
SUMMARIZE(
'BI_Autotask_Time_Entries',
'BI_Autotask_Time_Entries'[company_name],
"Worked", SUM('BI_Autotask_Time_Entries'[hours_worked]),
"Billed", SUM('BI_Autotask_Time_Entries'[Billable Hours]),
"Non Billable", SUM('BI_Autotask_Time_Entries'[Non billable Hours])
),
NOT ISBLANK('BI_Autotask_Time_Entries'[company_name])
&& [Non Billable] > 0
),
[Non Billable], DESC
)
This is your largest non-billable account by percentage. Review whether the contract scope has expanded without a rate adjustment. For managed service contracts, check if out-of-scope work is being logged correctly. A 17.5% non-billable rate on 3,791 hours is a pricing conversation waiting to happen.
Burke, Armstrong and Morgan (16.5%), Little Group (17.5%), and Rivers Rogers Mitchell (100%) all exceed the 15% threshold. Before renegotiating contracts, verify that technicians are coding work correctly. A time-entry training session often recovers 3-5% of non-billable hours without any contract change.
Both clients sit below 1% non-billable. Whether this is due to contract structure, engineer discipline, or account management practice, these accounts show what's possible. Use them as the reference point when diagnosing why other clients show higher rates.
Hours worked are all hours a technician logs in time entries, regardless of billing status. Hours billed are the subset marked as billable and actually invoiced to the client. The difference includes time marked non-billable, time that wasn't coded correctly, and work done outside the contract scope that no one remembered to add to the invoice.
Most well-run MSPs target 78-85% client billability for service desk and field teams. Internal work, training, and team administration naturally eat into that percentage. If your rate drops below 75%, it usually points to contract structures that don't reflect the actual work being done, or time-entry habits that need attention.
This almost always means the client is internal (your own company) or that billing is handled through a contract mechanism separate from time entries, such as a block-hour contract or a fixed monthly fee invoiced directly. Check the contract type in Autotask. If it's genuinely a client that should be billed, the time entries are likely coded to a non-billable work type.
Yes. Swap the SUMMARIZE dimension from company_name to resource_name in the DAX query above. The Proxuma Power BI report library includes a dedicated technician billability report that tracks individual billable percentages, capacity utilization, and daily averages week by week.
Start with time-entry auditing. Pull the non-billable time entries for your top three offenders and look at the work type codes. Often, 30-40% of non-billable time is miscoded and can be reclassified. After that, review your contract coverage lists. If your technicians regularly do work that isn't in the contract scope, you either need scope addendums or a rate card for out-of-scope requests.
Connect Proxuma Power BI to your PSA, RMM, and M365 environment, use an MCP-compatible AI to ask questions, and generate custom reports - in minutes, not days.
See more reports Get started