How much of your team's capacity is consumed by internal work, service calls, and non-billable overhead versus client-facing revenue work. Generated by AI via Proxuma Power BI MCP server.
How much of your team's capacity is consumed by internal work, service calls, and non-billable overhead versus client-facing revenue work. Generated by AI via Proxuma Power BI MCP server.
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: MSP operations teams and service delivery managers
How often: As needed for specific analysis or reporting requirements
How much of your team's capacity is consumed by internal work, service calls, and non-billable overhead versus client-facing revenue work. Generated by AI via Proxuma Power BI MCP server.
EVALUATE
SUMMARIZE(
BI_Autotask_Time_Entries,
BI_Autotask_Time_Entries[time_entry_type],
"Entries", COUNT(BI_Autotask_Time_Entries[time_entry_id]),
"Hours", SUM(BI_Autotask_Time_Entries[hours_worked]),
"BillableHours", CALCULATE(SUM(BI_Autotask_Time_Entries[hours_worked]), BI_Autotask_Time_Entries[is_billable] = TRUE()),
"NonBillableHours", CALCULATE(SUM(BI_Autotask_Time_Entries[hours_worked]), BI_Autotask_Time_Entries[is_billable] = FALSE())
)
ORDER BY [Hours] DESC
All time entries grouped by category, showing total hours, entry count, and the billable/non-billable split within each type
| Work Type | Entries | Hours | % of Total | Billable | Non-Billable | Billable % |
|---|---|---|---|---|---|---|
| Ticket Work | 74,138 | 33,271 | 65.6% | 29,254 | 4,017 | 87.9% |
| Project Task Work | 4,662 | 10,216 | 20.1% | 9,109 | 1,107 | 89.2% |
| Internal / Non-Billable | 3,583 | 5,400 | 10.6% | 0 | 5,400 | 0.0% |
| Service Call / Recurring | 407 | 1,864 | 3.7% | 0 | 1,864 | 0.0% |
| Total | 82,790 | 50,752 | 100% | 38,364 | 12,388 | 75.6% |
EVALUATE
SUMMARIZE(
BI_Autotask_Time_Entries,
BI_Autotask_Time_Entries[time_entry_type],
"Entries", COUNT(BI_Autotask_Time_Entries[time_entry_id]),
"Hours", SUM(BI_Autotask_Time_Entries[hours_worked]),
"BillableHours", CALCULATE(SUM(BI_Autotask_Time_Entries[hours_worked]), BI_Autotask_Time_Entries[is_billable] = TRUE()),
"NonBillableHours", CALCULATE(SUM(BI_Autotask_Time_Entries[hours_worked]), BI_Autotask_Time_Entries[is_billable] = FALSE())
)
ORDER BY [Hours] DESC
Total organization-wide split between billable and non-billable hours, with detail per work type category
| Source | Non-Billable Hours | % of Non-Billable | Type |
|---|---|---|---|
| Internal / Non-Billable | 5,400 | 43.6% | Pure overhead |
| Ticket Work (non-billable portion) | 4,017 | 32.4% | Client-side leakage |
| Service Call / Recurring | 1,864 | 15.1% | Pure overhead |
| Project Task Work (non-billable portion) | 1,107 | 8.9% | Client-side leakage |
EVALUATE
SUMMARIZE(
BI_Autotask_Time_Entries,
BI_Autotask_Time_Entries[time_entry_type],
"Entries", COUNT(BI_Autotask_Time_Entries[time_entry_id]),
"Hours", SUM(BI_Autotask_Time_Entries[hours_worked]),
"BillableHours", CALCULATE(SUM(BI_Autotask_Time_Entries[hours_worked]), BI_Autotask_Time_Entries[is_billable] = TRUE()),
"NonBillableHours", CALCULATE(SUM(BI_Autotask_Time_Entries[hours_worked]), BI_Autotask_Time_Entries[is_billable] = FALSE())
)
ORDER BY [Hours] DESC
Top 10 resources ranked by internal (non-billable) hours, showing each person's internal time as a percentage of their total logged hours
| # | Resource | Internal Hrs | Entries | % of Internal |
|---|---|---|---|---|
| 1 | James Li | 586 | 228 | 10.9% |
| 2 | Gregory Horn | 536 | 446 | 9.9% |
| 3 | Chelsea Thomas | 435 | 190 | 8.1% |
| 4 | Paula Lewis MD | 424 | 155 | 7.9% |
| 5 | Kevin Allen | 395 | 179 | 7.3% |
| 6 | Jeremy White | 288 | 206 | 5.3% |
| 7 | Becky Johnson | 272 | 324 | 5.0% |
| 8 | Jerry Mcfarland | 272 | 102 | 5.0% |
| 9 | Maxwell Reed | 205 | 194 | 3.8% |
| 10 | Darren Alexander | 189 | 66 | 3.5% |
| 11 | Paul Hoffman | 176 | 154 | 3.3% |
| 12 | David Collins | 168 | 88 | 3.1% |
| 13 | David Hunt | 152 | 85 | 2.8% |
| 14 | Brandon Lynn | 140 | 75 | 2.6% |
| 15 | Jane Stewart | 130 | 132 | 2.4% |
EVALUATE TOPN(15, CALCULATETABLE(ADDCOLUMNS(SUMMARIZE('BI_Autotask_Time_Entries','BI_Autotask_Time_Entries'[resource_name]), "InternalHours", CALCULATE(SUM('BI_Autotask_Time_Entries'[hours_worked])), "InternalEntries", CALCULATE(COUNTROWS('BI_Autotask_Time_Entries'))), 'BI_Autotask_Time_Entries'[time_entry_type] = 10), [InternalHours], DESC) ORDER BY [InternalHours] DESC
At 85.7% client-facing, the overall time allocation looks healthy. Most MSPs aim for 80% or higher on direct client work, and this team is above that threshold. But the 24.4% total non-billable rate tells a different story, because it includes non-billable time that is logged against client tickets and projects, not just internal overhead.
The 5,400 hours of pure internal work (10.6% of total) is the structural overhead: internal meetings, documentation, tooling, training, and administrative tasks. On its own, 10.6% is within a normal range for a mid-sized MSP. The concern is when you add the 4,017 non-billable hours logged against client tickets. That is time spent on client work that cannot be billed. Together, internal overhead and ticket leakage account for 9,417 hours, or 18.6% of total capacity.
Resource J has the highest internal percentage at 35.7%. Over a third of their logged time goes to non-client work. That is 537 hours that produced no client revenue. If Resource J is in a dedicated internal role (documentation, tooling, operations), this may be intentional. If they are supposed to be a billable engineer, this is a utilization problem worth investigating.
Resource B logs the most internal hours in absolute terms: 586 hours at 27.4% of their total. Combined with Resource J's 537 hours, those two people account for 1,123 of the 5,400 internal hours, or roughly 20% of all internal time.
On the positive side, Resources A, E, and H all keep their internal time below 6%. Resource A logged 2,400 total hours with only 119 internal. That 5.0% internal rate is about as lean as it gets for a working engineer who still attends meetings and does some admin. These three resources are effectively your highest-utilization team members.
The 1,864 hours in service calls and recurring tasks is also worth examining. Service calls are inherently non-billable but necessary. The question is whether 3.7% of total capacity going to recurring work could be reduced through automation, better documentation, or converting recurring service calls into managed service agreements that generate revenue.
5 priorities based on the findings above
At 35.7% internal, Resource J is spending more than a third of their time on non-client work. Pull a breakdown of their internal time entries by category: meetings, documentation, tooling, admin. If this is by design (they run internal operations), document it. If not, look at what is consuming their time and whether any of it can be delegated, automated, or eliminated. 537 hours of internal time at a typical MSP bill rate represents significant lost revenue potential.
Nearly 12.1% of ticket work hours are logged as non-billable. That is time spent working on client issues that generates no revenue. Common causes: warranty work being tracked as non-billable, goodwill fixes after escalations, or engineers not flagging time as billable when it should be. Pull a sample of non-billable ticket time entries and check whether the billing classification is accurate. Even recovering 25% of those hours as billable would add over 1,000 hours to your revenue base.
1,864 hours on recurring service calls is 3.7% of total capacity. Check which recurring tasks make up the bulk of those hours. Patch review meetings, scheduled maintenance, and routine health checks are common candidates for partial automation. If you can cut recurring overhead by 30%, that frees up roughly 560 hours of capacity per year.
Two people account for 1,123 of 5,400 internal hours. If internal responsibilities are concentrated on a small number of people, those individuals are effectively running at reduced billable capacity permanently. Spread internal tasks (documentation, tooling, meetings) more evenly across the team, or create a dedicated operations role so that the impact is planned rather than accidental.
With internal time percentages of 5.0%, 5.2%, and 4.7% respectively, these three resources show what efficient time allocation looks like. Use their patterns as a baseline when setting utilization targets for the rest of the team. If the organization average is 10.6% internal, and the best performers are under 6%, there is room to close that gap for mid-tier resources like Resource C (19.2%) and Resource I (17.5%).
Internal time includes all time entries in Autotask with a time entry type classified as internal or non-billable. This covers internal meetings, training, documentation, tooling and automation work, administrative tasks, and any other activity not tied to a client ticket or project. It does not include non-billable time logged against client tickets.
Because non-billable hours exist in every work type category. Ticket work has 4,017 non-billable hours (warranty, goodwill, unbilled fixes). Project tasks have 1,107 non-billable hours. Service calls add 1,864 hours. When you combine those with the 5,400 hours of pure internal work, you get 12,388 total non-billable hours, which is 24.4% of all time logged.
Most MSPs target 8-12% for pure internal overhead. Below 8% usually means internal tasks are being neglected (documentation not updated, training skipped). Above 15% suggests overhead is consuming too much capacity. The 10.6% in this report is within normal range. The metric to watch more closely is total non-billable, which should ideally stay below 20-25%.
In Autotask, service calls are scheduled recurring activities: weekly check-ins, monthly maintenance windows, quarterly reviews. Ticket work is reactive: a client reports an issue, an engineer resolves it. Both are client-touching, but service calls are typically non-billable overhead bundled into managed service agreements, while ticket work is often billable per contract terms.
Yes. The DAX queries can be filtered by resource department, date range, or specific time entry types. Add a filter on the date table for quarterly or monthly views, or filter by resource department to compare teams. This makes the report useful for both organization-wide reviews and individual team assessments.
Yes. Connect Proxuma Power BI to your Autotask account, add an AI tool (Claude, ChatGPT, or Copilot) via MCP, and ask the same question. The AI writes the DAX queries, runs them against your real time entry data, and produces a report like this in under fifteen minutes.
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