Revenue and margin analysis across 7 billing sub-types, covering 122,884 billing items and 17.6M in total revenue. Data sourced from Autotask PSA via Proxuma Power BI.
Revenue and margin analysis across 7 billing sub-types, covering 122,884 billing items and 17.6M in total revenue. Data sourced from Autotask PSA via Proxuma Power BI.
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 owners, finance leads, and operations managers tracking profitability
How often: Monthly for financial reviews, quarterly for strategic planning, on-demand for pricing decisions
Revenue and margin analysis across 7 billing sub-types, covering 122,884 billing items and 17.6M in total revenue. Data sourced from Autotask PSA via Proxuma Power BI.
The segmented bar below shows how total revenue splits across billing sub-types. Recurring service dominates at 54.4% of revenue, followed by milestone/fixed price at 21.8%. Materials and ad-hoc charges fill the middle, while time entries and expenses sit at the bottom.
EVALUATE
ADDCOLUMNS(
SUMMARIZECOLUMNS(
'BI_Autotask_Billing_Items'[sub_type],
"Revenue", SUM('BI_Autotask_Billing_Items'[total_amount]),
"Cost", SUM('BI_Autotask_Billing_Items'[our_cost]),
"ItemCount", COUNTROWS('BI_Autotask_Billing_Items')
),
"Margin", DIVIDE([Revenue] - [Cost], [Revenue], 0)
)
ORDER BY [Revenue] DESC
The horizontal bars below show each sub-type's margin side by side. The contrast is stark: milestone and project cost billing show 100% margin (no cost recorded in PSA), recurring service sits at a healthy 58%, and then there is a sharp drop. Materials barely clear 6%, and labour runs deeply negative.
our_cost value. The actual delivery cost is tracked through time entries and expenses on the parent project. So milestone revenue shows as pure profit in this view, while the cost appears under the labour and expense sub-types. This is a data model artifact, not actual 100% margin.
High volume does not mean high profit. Time entry/labour has the most billing items by far (69,321), yet generates the lowest revenue and the worst margin. Recurring service hits the sweet spot: large volume (42,607 items), strong revenue (9.6M), and healthy margin (58%).
| Sub-Type | Items | Revenue | Cost | Profit | Margin |
|---|---|---|---|---|---|
| Recurring Service | 42,607 | €9,577,503 | €4,025,063 | €5,552,440 | 58.0% |
| Milestone/Fixed Price | 2,047 | €3,845,490 | €0 | €3,845,490 | 100% |
| Materials/Products | 4,597 | €2,644,523 | €2,483,170 | €161,353 | 6.1% |
| Ad-hoc Charges | 3,943 | €917,546 | €453,912 | €463,634 | 50.5% |
| Time Entry/Labour | 69,321 | €273,878 | €1,207,179 | -€933,301 | -341% |
| Expense | 182 | €225,026 | €173,409 | €51,617 | 22.9% |
| Project Cost | 187 | €94,305 | €0 | €94,305 | 100% |
EVALUATE
SUMMARIZECOLUMNS(
'BI_Autotask_Tickets'[ticket_type_name],
"TicketCount", [Tickets - Count - Created],
"AvgHrs", [Tickets - Avg Hours Per Ticket]
)
ORDER BY [TicketCount] DESC
This is the number that should get attention in every MSP finance meeting. Time entries bill 273,878 in revenue but cost 1,207,179 to deliver. That is a net loss of 933,301 on labour alone.
Most of this cost is invisible in standard P&L reporting because it gets absorbed into the overall margin. Recurring service revenue at 9.6M provides enough buffer to cover the labour shortfall, but that means your managed service contracts are quietly subsidizing unbilled project work and break-fix labour.
Where the hours go: The ticket data shows 69,321 time entries across all ticket types. Incidents (break-fix) average 0.54 hours each, but with 27,664 tickets that adds up fast. Service requests average 0.78 hours across 12,653 tickets. Change requests (project work) average a full hour per ticket across 7,247 tickets. Only a fraction of these hours get billed as standalone line items.
The real question is not "why is labour losing money" but "how much of this labour cost is already covered by recurring service fees?" If your managed contracts include unlimited support, the labour cost is expected. If they do not, you have a billing gap.
EVALUATE
TOPN(15,
SUMMARIZECOLUMNS(
'BI_Autotask_Companies'[company_name],
"Revenue", [Revenue - Total],
"Cost", [Cost - Total],
"Profit", [Profit - total],
"Margin", [Profit - total - percentage]
),
[Revenue], DESC
)
ORDER BY [Revenue] DESC
Time entry billing loses 933K annually. At -341% margin, every euro billed as labour actually costs 4.41 to deliver. This is the single largest drag on profitability, and it is hidden by the strength of recurring revenue.
With 2.6M in revenue and 2.5M in cost, materials/products barely break even. On a line-by-line basis, many items likely sell at a loss after accounting for procurement, shipping, and handling time. A 6% margin leaves zero room for returns or write-offs.
At 58% margin on 9.6M revenue, recurring service generates 5.6M in gross profit. This single category funds the entire operation and absorbs the losses from labour and thin-margin materials. Protecting and growing this revenue stream is the highest-priority business decision.
Audit unbilled time entries. Pull a report of all time entries that have no associated billing item. Identify which ones should have been billed and which ones fall under managed service agreements. The gap between 1.2M in cost and 274K in revenue suggests a significant portion of work is either unbilled or under-billed.
Increase materials markup. A 6.1% margin on 2.6M in product sales is not sustainable after accounting for overhead. Review your markup percentages and compare them to industry benchmarks (most MSPs target 15-25% on hardware). Even a 5-point increase in margin would add 132K in annual profit.
Separate project labour from managed labour. The current data lumps all time entries together. Create separate billing sub-types or use Autotask work type classifications to distinguish managed service hours (included in contract) from project hours (should be billed). This gives you visibility into whether managed contracts are properly priced.
Review per-client profitability. Use the third DAX query to identify clients where labour cost exceeds the managed service fee. These accounts need contract renegotiation or scope adjustment. A client paying 5K/month in recurring fees but consuming 8K/month in labour is slowly eroding your business.
This report was generated by an AI agent connected to Proxuma Power BI through the MCP (Model Context Protocol) server. The AI wrote three DAX queries against the BI_Autotask_Billing_Items and BI_Autotask_Tickets tables, executed them, and formatted the results into this document.
Data source: Autotask PSA, synced to Power BI through the Proxuma connector. The billing items dataset contains 122,884 records across 7 sub-types. Revenue is based on total_amount, cost on our_cost, and margin is calculated as (Revenue - Cost) / Revenue.
Scope: All billing sub-types, all clients, full dataset. No date filters were applied. Ticket data (67,521 tickets) provides context for volume and average hours but is not directly joined to billing items in this analysis.
Limitations: Milestone and project cost sub-types show 0 cost because Autotask records their delivery cost through separate time entry and expense items on the parent project. The true margin for project work requires cross-referencing billing items with project time entries, which is outside the scope of this report.
Autotask does not record a cost against milestone or fixed-price billing items. The cost of delivery is tracked through time entries and expenses on the parent project. So the margin you see here reflects the billing item only, not the true project margin. To get the real number, you need to compare milestone revenue against the sum of all time and expense entries on the same project.
Yes, but with context. The -341% means that for every euro billed as a time entry, the actual cost is 4.41. This happens because most labour hours are either included in managed service contracts (so they are covered by recurring fees, not billed separately) or they go unbilled entirely. The number is accurate for the sub-type, but it does not mean the business is losing money overall. Recurring service margins cover the gap.
Focus on two areas. First, check whether your managed service contracts are priced to cover the actual labour cost. If a client is consuming more hours than the contract covers, you need a rate adjustment or scope limitation. Second, review materials markup. A 6% margin is too thin for hardware resale. Target 15-25% and verify that procurement costs are entered accurately in Autotask.
Yes. Copy any query from the toggles above and paste it into DAX Studio or the Power BI Desktop performance analyzer. The queries reference standard Proxuma data model tables and measures that exist in every Proxuma Power BI deployment. If you use a different data model, you may need to adjust the table and column names.
Sub-types refer to billing item categories in the BI_Autotask_Billing_Items table: how revenue is classified (recurring, milestone, materials, etc.). Ticket types refer to the BI_Autotask_Tickets table: how work is classified (incident, service request, change request, etc.). A single ticket can generate multiple billing items across different sub-types.
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