A full breakdown of $8.3M in costs across labor, products, expenses, block hours, and recurring services. Mapped against $17.6M in revenue to show where margin is earned and where it leaks. Generated by AI via Proxuma Power BI MCP server.
A full breakdown of $8.3M in costs across labor, products, expenses, block hours, and recurring services. Mapped against $17.6M in revenue to show where margin is earned and where it leaks. 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 owners, finance leads, and operations managers tracking profitability
How often: Monthly for financial reviews, quarterly for strategic planning, on-demand for pricing decisions
A full breakdown of $8.3M in costs across labor, products, expenses, block hours, and recurring services. Mapped against $17.6M in revenue to show where margin is earned and where it leaks. Generated by AI via Proxuma Power BI MCP server.
EVALUATE ROW("TotalRevenue", [Revenue - Total], "TotalCost", [Cost - Total], "Margin", [Profit - total], "MarginPct", [Profit - total - percentage]*100)
Total costs of $8,272,864 split across five billing categories, from largest to smallest
| Cost Category | Cost | % of Total | Scale |
|---|---|---|---|
| Recurring Service | $4,025,063 | 48.7% | Largest |
| Product / Material | $2,483,170 | 30.0% | Second |
| Labor | $1,207,179 | 14.6% | Third |
| Block Hours | $453,912 | 5.5% | Fourth |
| Expense | $173,409 | 2.1% | Fifth |
EVALUATE
UNION(
ROW("Category", "Labor", "Cost", SUM(BI_Autotask_Billing_Items[internal_cost])),
ROW("Category", "Product/Material", "Cost", CALCULATE(SUM(BI_Autotask_Billing_Items[price]), BI_Autotask_Billing_Items[billing_sub_type] = 7)),
ROW("Category", "Expense", "Cost", CALCULATE(SUM(BI_Autotask_Billing_Items[price]), BI_Autotask_Billing_Items[billing_sub_type] = 8)),
ROW("Category", "Block Hours", "Cost", CALCULATE(SUM(BI_Autotask_Billing_Items[price]), BI_Autotask_Billing_Items[billing_sub_type] = 2)),
ROW("Category", "Recurring Service", "Cost", CALCULATE(SUM(BI_Autotask_Billing_Items[price]), BI_Autotask_Billing_Items[billing_sub_type] = 12))
)
ORDER BY [Cost] DESC
How each contract type contributes to revenue and where costs concentrate. Sorted by revenue, with margin percentage and contract counts.
| Contract Type | Revenue | Cost | Margin | Margin % | Contracts | Active |
|---|---|---|---|---|---|---|
| Recurring Service | $15,724,070 | $7,067,810 | $8,656,260 | 55.0% | 1,207 | 932 |
| Time & Materials | $1,840,111 | $1,163,629 | $676,482 | 36.7% | 504 | 287 |
| Block Hours | $7,502 | $3,628 | $3,874 | 51.6% | 173 | 158 |
| Fixed Price | $17,210 | $0 | $17,210 | 100% | 5 | 0 |
EVALUATE
SUMMARIZE(
BI_Autotask_Contracts,
BI_Autotask_Contracts[contract_type],
"Revenue", SUM(BI_Autotask_Billing_Items[price]),
"Cost", SUM(BI_Autotask_Billing_Items[internal_cost]),
"Contracts", DISTINCTCOUNT(BI_Autotask_Contracts[contract_id])
)
ORDER BY [Revenue] DESC
Revenue and cost split by billing sub-type, showing which charge categories generate the most revenue and where costs concentrate
| Category | Items | Revenue | Cost | Margin | % of Cost |
|---|---|---|---|---|---|
| Recurring Service | 42,607 | $9,577,503 | $4,025,063 | $5,552,440 | 48.2% |
| Product / Material | 4,597 | $2,644,523 | $2,483,170 | $161,353 | 29.7% |
| Labor | 69,321 | $273,878 | $1,207,179 | $-933,301 | 14.5% |
| Block Hours | 3,943 | $917,546 | $453,912 | $463,633 | 5.4% |
| Expense | 182 | $225,026 | $173,409 | $51,616 | 2.1% |
| Misc | 737 | $10,981 | $5,364 | $5,616 | 0.1% |
| Other | 1 | $500 | $500 | $0 | 0.0% |
| Retainer | 2,047 | $3,845,490 | $0 | $3,845,490 | 0.0% |
| Pre-paid | 187 | $94,305 | $0 | $94,305 | 0.0% |
| Adjustment / Credit | 2,129 | $17,017 | $-75,734 | $92,751 | 0.0% |
EVALUATE ADDCOLUMNS(SUMMARIZE('BI_Autotask_Billing_Items','BI_Autotask_Billing_Items'[sub_type]), "Count", CALCULATE(COUNTROWS('BI_Autotask_Billing_Items')), "Revenue", CALCULATE(SUM('BI_Autotask_Billing_Items'[total_amount])), "Cost", CALCULATE(SUM('BI_Autotask_Billing_Items'[our_cost]))) ORDER BY [Cost] DESC
At a portfolio level, 53% margin on $17.6M revenue is a solid position. But the aggregate number hides structural problems in how costs distribute across billing types.
Recurring services are the backbone of the business. They account for 89% of total revenue ($15.7M) and carry a 55% margin. The cost side is predictable: $7.1M in recurring service costs against steady monthly income. This is the contract type you want to grow.
Time and Materials is the weak link. At 36.7% margin, T&M contracts deliver $1.8M in revenue but consume $1.16M in cost. That is 14 percentage points below the portfolio average. With 504 contracts but only 287 active, there is also a long tail of inactive T&M agreements that may still carry administrative overhead.
The billing sub-type data tells an even sharper story. Time Entry charges generate only $274K in revenue against $1.2M in labor cost, creating a negative margin of -340.7%. This does not mean labor is unprofitable by itself: the labor cost is spread across contract types, and much of it supports recurring service delivery. But it does mean that time entries billed directly at the line-item level are severely underpriced.
Product and Material is another area that deserves attention. Revenue of $2.64M against cost of $2.48M leaves only a 6.1% margin. This is pass-through with minimal markup. For an MSP handling procurement, that margin should be closer to 15-20% to justify the effort of quoting, ordering, and provisioning hardware and licenses.
Milestone billing stands out as the most efficient: $3.85M in revenue with zero recorded cost. This is likely project work or one-time charges where labor cost is captured elsewhere. It inflates the apparent margin, but the revenue is real and recurring it is not.
5 priorities based on the findings above
T&M contracts run at 36.7% margin, 16 points below the portfolio average. Pull the top 20 T&M contracts by revenue and compare their hourly billing rate against the internal labor cost rate. If your average internal cost per hour is $85 and you are billing at $115, you have a 26% margin before any overhead. That is not enough for project-based work with scope risk. Raise rates or convert high-volume T&M clients to recurring agreements.
A 6.1% margin on $2.64M in product revenue means you earned $161K for handling procurement. That barely covers the time spent quoting, ordering, receiving, and configuring. Set a minimum 15% markup policy on all hardware and software. For commodity items (cables, peripherals), go higher. If a vendor relationship requires you to sell at cost, negotiate volume discounts or drop the line.
You have 504 T&M contracts but only 287 are active. The remaining 217 may still carry billing configurations, auto-charges, or clutter your PSA. Close or archive inactive contracts to keep your data clean and reduce the chance of billing errors on dormant agreements.
The -340.7% margin on direct time entries is misleading because labor cost is allocated across billing types. Set up a cost allocation model in Power BI that attributes internal labor cost proportionally to the contract type where the work was performed. This gives you a true picture of which contract types actually consume the most engineering hours and whether your pricing reflects it.
Recurring services generate $15.7M in revenue at 55% margin. That is the foundation of the business. Focus sales efforts on converting T&M clients to managed service agreements. Every $100K in T&M revenue converted to recurring at a 55% margin adds $18K in annual gross profit compared to the current T&M margin of 36.7%.
Cost data comes from the internal_cost field in Autotask billing records, which Proxuma Power BI pulls through the Autotask API. Labor cost is based on the internal hourly rate assigned to each resource in Autotask. Product cost comes from the cost field on billing items. Recurring service cost is the vendor cost recorded on recurring service contracts.
Time Entry as a billing sub-type captures direct hourly charges, but the internal_cost field records the full labor cost for all time entries, including those that support recurring contracts. The negative margin does not mean labor is unprofitable. It means the labor cost allocation in Autotask spreads wider than the Time Entry billing sub-type alone. A proper cost allocation model would distribute labor cost across the contract types where work was actually performed.
Industry benchmarks from Service Leadership and ConnectWise put healthy MSP gross margins between 50% and 65% for managed services. Time and materials work typically runs 35-45%. Product resale should target 15-25% margin to justify the operational overhead. A blended margin of 53% across all contract types is solid, but the individual line items matter more than the average.
Milestone billing in Autotask records a flat-fee charge when a project milestone is completed. The internal cost for the labor that went into reaching that milestone is captured in time entries, not on the milestone billing item itself. The $3.85M in milestone revenue has real labor cost behind it, but that cost shows up in the Labor category rather than being attributed directly to the milestone line item.
Yes. Add a date filter to the DAX queries using the billing date column. For example, add CALCULATE with a filter on BI_Autotask_Billing_Items[billing_date] to restrict to a specific quarter or fiscal year. This lets you compare cost structures period over period and spot trends in margin erosion.
Yes. Connect Proxuma Power BI to your Autotask PSA, 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 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