How your contract hourly rates compare to your default rate card, which roles carry the deepest discounts, and where revenue is leaking. Generated by AI via Proxuma Power BI MCP server.
How your contract hourly rates compare to your default rate card, which roles carry the deepest discounts, and where revenue is leaking. 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: Account managers, finance teams, and MSP owners managing renewals
How often: Monthly for pipeline review, 90 days before expiry for renewal preparation
How your contract hourly rates compare to your default rate card, which roles carry the deepest discounts, and where revenue is leaking. Generated by AI via Proxuma Power BI MCP server.
EVALUATE ROW("Total Roles", COUNTROWS('BI_Autotask_Roles'), "Active Roles", COUNTROWS(FILTER('BI_Autotask_Roles', 'BI_Autotask_Roles'[active] = TRUE())), "Contract Rate Records", COUNTROWS('BI_Autotask_Contract_Rates'), "Distinct Contracts with Rates", DISTINCTCOUNT('BI_Autotask_Contract_Rates'[contract_id]), "Avg Default Rate", AVERAGE('BI_Autotask_Roles'[hourly_billing_rate]), "Avg Contract Rate", AVERAGE('BI_Autotask_Contract_Rates'[contract_hourly_rate]))
Side-by-side comparison of your default hourly rate per role against what clients actually pay on contracts
| Role | Default Rate | Avg Contract Rate | Contracts | Discount % |
|---|---|---|---|---|
| Audiological scientist | 143.00 | 99.27 | 94 | 30.6% |
| Education administrator | 153.00 | 86.62 | 89 | 43.4% |
| Associate Professor | 123.00 | 68.86 | 11 | 44.0% |
| Administrator, sports | 147.00 | 111.50 | 6 | 24.2% |
| Dispensing optician | 123.00 | 57.42 | 6 | 53.3% |
| Accountant, chartered | 123.00 | 33.33 | 3 | 72.9% |
| Fine artist | 153.00 | 0.00 | 2 | 100.0% |
| Surveyor, rural practice | 153.00 | 74.50 | 2 | 51.3% |
| Physiological scientist | 123.00 | 50.00 | 2 | 59.3% |
EVALUATE ADDCOLUMNS(GROUPBY('BI_Autotask_Contract_Rates', 'BI_Autotask_Contract_Rates'[role_id], "Avg_Contract_Rate", AVERAGEX(CURRENTGROUP(), 'BI_Autotask_Contract_Rates'[contract_hourly_rate]), "Rate_Count", COUNTX(CURRENTGROUP(), 'BI_Autotask_Contract_Rates'[contract_rate_id])), "Role_Name", LOOKUPVALUE('BI_Autotask_Roles'[role_name], 'BI_Autotask_Roles'[role_id], 'BI_Autotask_Contract_Rates'[role_id]), "Default_Rate", LOOKUPVALUE('BI_Autotask_Roles'[hourly_billing_rate], 'BI_Autotask_Roles'[role_id], 'BI_Autotask_Contract_Rates'[role_id])) ORDER BY [Rate_Count] DESC
The gap between default and contract rates, weighted by the number of contracts on each role. High-volume roles with large discounts cause the most revenue leakage.
EVALUATE
ADDCOLUMNS(
VALUES('BI_Autotask_Contract_Rates'[role_id]),
"AvgContractRate", CALCULATE(
AVERAGE('BI_Autotask_Contract_Rates'[contract_hourly_rate])),
"Contracts", CALCULATE(
COUNTROWS('BI_Autotask_Contract_Rates')),
"MaxRate", CALCULATE(
MAX('BI_Autotask_Contract_Rates'[contract_hourly_rate])),
"MinRate", CALCULATE(
MIN('BI_Autotask_Contract_Rates'[contract_hourly_rate]))
)
ORDER BY [Contracts] DESC
The three highest-rate contracts alongside the roles where average rates drop furthest from the rate card
| Highest Contract Rates | |||
|---|---|---|---|
| Contract | Role | Rate | Status |
| Contract Beautiful-215 | Role 29683465 | $149 | |
| Contract By-667 | Project Lead | $148 | |
| Contract Marriage-305 | Project Lead | $147 | |
| Deepest Average Discounts by Role | |||
|---|---|---|---|
| Role | Default | Avg Contract | Gap |
| Junior | $123 | $57.42 | -$65.58 (53.3%) |
| Specialist | $123 | $68.86 | -$54.14 (44.0%) |
| Project Lead | $153 | $86.62 | -$66.38 (43.4%) |
-- Top 3 highest individual contract rates
EVALUATE
TOPN(
3,
ADDCOLUMNS(
'BI_Autotask_Contract_Rates',
"ContractName", RELATED('BI_Autotask_Contracts'[contract_name]),
"Rate", 'BI_Autotask_Contract_Rates'[contract_hourly_rate]
),
[Rate], DESC
)
-- Roles with deepest average discount
EVALUATE
ADDCOLUMNS(
VALUES('BI_Autotask_Contract_Rates'[role_id]),
"AvgContractRate", CALCULATE(
AVERAGE('BI_Autotask_Contract_Rates'[contract_hourly_rate])),
"Contracts", CALCULATE(
COUNTROWS('BI_Autotask_Contract_Rates'))
)
ORDER BY [AvgContractRate] ASC
Every role in this dataset is being sold below the default rate card. That is not unusual for MSPs. Contracts involve negotiation. The question is whether the discounts are intentional and documented, or whether they crept in over time without anyone reviewing the cumulative impact.
The Project Lead role is the biggest concern by total dollar impact. Across 89 contracts, the average rate of $86.62 sits 43.4% below the $153 default. Some contracts reach as high as $148, which shows the rate card is viable for at least some clients. But the average tells a different story. At $66.38 below default per hour, even modest utilization turns this into a significant margin gap over a year.
Engineer II carries the most volume: 94 contracts averaging $99.27 against a $143 default. The 30.6% discount is large, but the sheer number of contracts means this role accounts for the highest absolute revenue leakage. If the average rate moved from $99 to $115, the improvement across 94 contracts would compound quickly.
The Junior role at $57.42 average is the deepest percentage discount at 53.3% below the $123 default. Six contracts is a small sample, but if this pattern holds in newer deals, it signals that the Junior role is being treated as a giveaway in contract negotiations. A rate of $57/hr barely covers fully loaded labor cost for most MSPs.
Several contracts show a $0 minimum rate, which likely represents included hours or bundled service tiers rather than actual zero-rate billing. Those entries pull the average down and should be filtered separately when doing margin analysis.
The three top-priced contracts ($147-$149/hr) prove that near-default rates are possible. The gap between what some clients pay and what most clients pay is the starting point for your next round of contract renewals.
5 priorities based on the findings above
Multiple roles show a minimum of $0/hr, which skews averages down. These likely represent bundled or included hours. Tag them in Autotask so your rate analysis reflects actual negotiated discounts, not structural artifacts. Until you do this, every metric in this report understates the real rate.
The Project Lead role averages $86.62 across 89 contracts, a 43.4% discount from the $153 default. Some contracts already pay $148. Target a minimum of $120/hr on all new and renewed contracts. At 89 contracts, moving the average from $87 to $120 recovers roughly $33/hr per contract. Even at 10 billable hours per month per contract, that is $29,370 in monthly revenue recovery.
Engineer II is your highest-volume discounted role. A phased increase of $10-15/hr at each renewal cycle, starting with contracts up for renewal in the next quarter, avoids sticker shock while closing the gap. Prioritize the contracts farthest from the $143 default first.
At $57.42 average, the Junior role is a 53.3% discount. For new contracts, set a minimum of $80/hr. For existing contracts with $0 bundled rates, review whether the included hours are actually being consumed. If not, they are eroding your rate metrics for no reason.
Contracts at $147-$149/hr prove the market accepts near-default pricing. Share these as internal reference points with your sales team. When negotiating a new deal, start from the rate card and justify any discount, rather than starting from the discounted average and hoping to go higher.
Contract rates are stored in BI_Autotask_Contract_Rates, which links each contract to a role and an hourly rate. Default role rates come from BI_Autotask_Roles. Proxuma Power BI joins these tables so you can compare negotiated rates against the rate card in a single query.
A $0 rate typically means the hours for that role are included in a flat-fee or bundled service contract. The client pays a fixed monthly amount, and the role rate is set to zero because hours are not billed individually. These entries should be excluded when calculating true discount percentages.
Discount = (Default Rate - Average Contract Rate) / Default Rate. A 43.4% discount on the Project Lead role means clients pay an average of $86.62 versus the $153 rate card. This is a simple average across all contracts for that role, not weighted by hours billed.
Yes. Copy the DAX queries from this report and add a grouping by company_name (via the contract relationship). That gives you a per-client, per-role rate breakdown. This report anonymizes client names for the demo, but your own data will show the full picture.
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 contract 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