A profitability analysis of 1,889 contracts in Autotask PSA, ranking each by revenue, cost, and margin. Total portfolio revenue stands at $17.6M with an overall margin of 53.0%, but some contracts are silently destroying that number.
A profitability analysis of 1,889 contracts in Autotask PSA, ranking each by revenue, cost, and margin. Total portfolio revenue stands at $17.6M with an overall margin of 53.0%, but some contracts are silently destroying that number.
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 profitability analysis of 1,889 contracts in Autotask PSA, ranking each by revenue, cost, and margin. Total portfolio revenue stands at $17.6M with an overall margin of 53.0%, but some contracts are silently destroying that number.
Top-level financial metrics across all 1,889 contracts in the Autotask billing data.
BI_Autotask_Billing_Items[total_amount], cost from BI_Autotask_Billing_Items[our_cost], and contract counts from BI_Autotask_Contracts. Profit and margin are calculated fields. All client and contract names are anonymized. You can expand the DAX toggles in sections 2, 3, and 5 to see the exact queries.
The ten highest-revenue contracts ranked by total billing, with cost, profit, and margin for each.
| Contracts | Types | Revenue | Hours |
|---|---|---|---|
| 1889 | 4 | 17606769 | 50752 |
EVALUATE ROW("TotalContracts", COUNTROWS(BI_Autotask_Contracts), "UniqueTypes", DISTINCTCOUNT(BI_Autotask_Contracts[contract_type_name]), "TotalRevenue", SUM(BI_Autotask_Billing_Items[total_amount]), "TotalHours", SUM(BI_Autotask_Time_Entries[hours_worked]))
Horizontal bar chart showing profit margins for the top 10 contracts by revenue. Green bars indicate healthy margins, amber indicates thin margins, and red indicates losses.
EVALUATE
TOPN(10,
ADDCOLUMNS(
SUMMARIZE('BI_Autotask_Billing_Items', 'BI_Autotask_Billing_Items'[contract_id]),
"Revenue", CALCULATE(SUM('BI_Autotask_Billing_Items'[total_amount])),
"Cost", CALCULATE(SUM('BI_Autotask_Billing_Items'[our_cost]))
),
[Revenue] - [Cost], ASC
)
ORDER BY [Revenue] - [Cost] ASC
The ten contracts with the deepest losses. These contracts cost more to deliver than they bring in, and together they represent a significant drag on the portfolio.
| Contract | Revenue | Cost | Loss | Margin |
|---|---|---|---|---|
| Contract K | $233,588 | $383,764 | -$150,177 | -64.3% |
| Contract L | $898 | $79,872 | -$78,974 | -8,793% |
| Contract M | $2,496 | $80,671 | -$78,175 | -3,133% |
| Contract N | $1,590 | $40,634 | -$39,044 | -2,455% |
| Contract O | $4,245 | $38,623 | -$34,378 | -810% |
| Contract P | $116 | $16,716 | -$16,600 | -14,308% |
| (No contract) | $17,876 | $33,487 | -$15,611 | -87% |
| Contract Q | $18,744 | $29,660 | -$10,916 | -58% |
| Contract R | $42,773 | $50,138 | -$7,366 | -17% |
| Contract S | $3,022 | $10,230 | -$7,208 | -239% |
Contract P stands out with a margin of -14,308%. It billed just $116 while accumulating $16,716 in costs. This is almost certainly a misconfigured contract or a billing gap where time entries were logged against the wrong agreement. Contracts L and M show a similar pattern: revenue under $2,500 paired with costs near $80K. These are not thin-margin contracts. They are cost centers with a billing label attached.
A portfolio-level view of how revenue and cost split across the contract base. The donut shows the profit share, and the comparison bars break down individual contracts.
EVALUATE
ROW(
"TotalRevenue", [Revenue - Total],
"TotalCost", [Cost - Total],
"TotalProfit", [Profit - total],
"TotalContracts", COUNTROWS('BI_Autotask_Contracts')
)
Contracts grouped into four margin tiers. This view shows where most of your contracts land and how concentrated the risk is at each level.
| Tier | Margin Range | Example Contracts | Status |
|---|---|---|---|
| High Profit | > 60% | Contract A, B, D, E, I | Strong |
| Moderate | 30% - 60% | Contract C, G | Acceptable |
| Thin Margin | 0% - 30% | Contract F, H | Watch |
| Loss-Making | < 0% | Contract J, K, L, M, N, O, P, Q, R, S | Action needed |
The top tier (above 60% margin) contains five of the ten largest contracts. These are healthy agreements where revenue significantly exceeds cost. The moderate tier sits in a comfortable range but could erode quickly if scope creep goes unchecked.
The thin-margin tier is the most dangerous for MSPs. Contracts F and H look profitable on paper, but one bad month of unplanned work could push them into negative territory. The loss-making tier already contains at least 10 contracts that actively lose money. Several of them (L, M, P) have margins worse than -1,000%, which almost always points to a billing configuration error rather than an actual service delivery problem.
The bottom 10 contracts have combined losses exceeding $438K. Contracts L, M, and P show extreme negative margins (-3,133% to -14,308%), which strongly suggests billing items are not attached to these agreements or the contract rate is set to zero. Every dollar of cost logged against these contracts comes straight out of your profit. A 30-minute audit of the billing configuration for each one could recover tens of thousands of dollars.
At a 13.2% margin, Contract F is the thinnest of the high-revenue contracts. It generates more revenue than Contracts G, H, or I, but retains less profit than any of them. This is typically caused by excessive time entries against a fixed-price agreement, or a contract rate that has not been adjusted to match the current cost structure. Review the labor hours logged against this contract and compare them to the agreed scope.
Contract A is a standout performer with a 77.5% margin on $1.64M in revenue. It accounts for roughly 13.6% of total portfolio profit by itself. Protecting this contract should be a priority: ensure SLA performance stays high, schedule regular QBR meetings, and use it as a reference case for sales. If Contract A churned, the entire portfolio margin would drop noticeably.
1. Audit every loss-making contract within this week. Start with Contracts L, M, and P. Open each contract in Autotask, check the billing setup, and verify that time entries are linked to the correct billing items. Margins worse than -1,000% are almost always configuration errors. Fix the billing and you recover the revenue retroactively or stop the bleed going forward.
2. Review the scope and rate for Contract F. A $417K contract running at 13.2% margin needs attention. Compare actual hours worked against the contracted scope. If technicians are logging more time than the agreement covers, either renegotiate the rate or tighten the scope boundaries. A 10-point margin improvement on this contract alone would add $42K to the bottom line.
3. Protect Contract A with proactive account management. This single contract generates $1.27M in profit. Schedule a QBR, run a satisfaction check, and make sure the client has no unresolved complaints. Losing this contract would require five to six new agreements at average margins to replace the profit.
4. Investigate the "(No contract)" line. There are $17.9K in billing items and $33.5K in costs not attached to any contract. These orphaned entries either belong to an existing contract (miscategorized) or represent unbilled work. Assign them to the correct agreements to get accurate per-contract profitability.
5. Set a margin floor for new contracts. Based on this data, any contract below 30% margin should trigger a review before renewal. Build a quarterly profitability check into your operations cadence so loss-making contracts never run unnoticed for a full year.
Revenue comes from the BI_Autotask_Billing_Items table (field: total_amount) and cost comes from the same table (field: our_cost). The AI groups these by contract_id and calculates profit as revenue minus cost. Margin is profit divided by revenue, expressed as a percentage.
Extreme negative margins happen when a contract has very low revenue (sometimes just a few hundred dollars) paired with significant cost. This usually means the contract is not configured to bill for the work being performed, or time entries are being logged against the wrong agreement. The fix is a billing audit, not a service delivery change.
Most MSP industry benchmarks target 50-70% gross margin on managed services contracts. Below 30% typically signals scope creep or under-pricing. Above 70% is excellent and usually indicates a well-scoped agreement with efficient delivery. The overall portfolio margin in this report (53%) sits right in the healthy range.
These are billing items and cost entries in Autotask that are not linked to any contract. They show up as orphaned records in the data model. The revenue and cost are real, but without a contract association, they cannot be attributed to a specific agreement. Assign them to the correct contracts for accurate reporting.
Quarterly is a good cadence for most MSPs. Run it before QBR preparation so you can discuss profitability with your team and flag any contracts that need rate adjustments at renewal. If you spot a sudden margin drop, run it monthly until the situation stabilizes.
Yes. Connect Proxuma Power BI to your Autotask PSA instance, 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 live data, and produces a report like this one in under fifteen minutes.
The our_cost field in Autotask billing items represents the internal cost recorded against each billing line. This typically includes labor cost based on the resource's internal rate. It does not include overhead, software licenses, or other indirect costs. For a fully loaded cost analysis, you would need to layer in additional cost data from your finance system.
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