“Rate Conflict Audit: Find Pricing Errors Before Clients Do”
Autotask PSA Datto RMM Datto Backup Microsoft 365 SmileBack HubSpot IT Glue All reports
AI-GENERATED REPORT
You searched for:

Rate Conflict Audit: Find Pricing Errors Before Clients Do

Built from: Autotask PSA
How this report was made
1
Autotask PSA
Multiple data sources combined
2
Proxuma Power BI
Pre-built MSP semantic model, 50+ measures
3
AI via MCP
Claude or ChatGPT writes DAX queries, executes them, formats output
4
This Report
KPIs, breakdowns, trends, recommendations
Ready in < 15 min

Rate Conflict Audit: Find Pricing Errors Before Clients Do

This report provides a detailed breakdown of rate conflict audit: find pricing errors before clients do for managed service providers.

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

Time saved
Tracking contract dates across hundreds of clients in spreadsheets is error-prone. This report automates it.
Revenue protection
Missed renewals mean lost revenue. This report ensures every expiring contract gets attention.
Negotiation prep
Contract value, history, and service data in one view for informed renewal conversations.
Report categoryContract Management
Data sourceAutotask PSA · Datto RMM · Datto Backup · Microsoft 365 · SmileBack · HubSpot · IT Glue
RefreshReal-time via Power BI
Generation timeUnder 15 minutes
AI requiredClaude, ChatGPT or Copilot
AudienceAccount managers, finance teams
Where to find this in Proxuma
Power BI › Contracts › Rate Conflict Audit: Find Pricing Err...
What you can measure in this report
Summary Metrics
Rate Entry Breakdown
Projects Without Contract Assignment
Billing Hours Health Check
Key Findings
Frequently Asked Questions
Related Reports
Contracts With Rates
Zero-Rate Entries
Contracts With $0 Rate
Unassigned Time Entries
Billable Hours
Proxuma Power BI — Contract Audit Report
Demo Report: This report uses synthetic data representative of a typical MSP environment. Actual figures will vary based on your Autotask configuration and contract structure.
Rate Conflict Audit: Find Pricing Errors Before Clients Do
An AI-generated audit of contract rate entries, zero-rate records, unlinked projects, and billing orphan time entries across 110 active contracts in Autotask.
1.0
Summary Metrics
Top-line numbers from the rate conflict audit across all Autotask contracts
Contracts With Rates
$9,321
Wide variance by type
Zero-Rate Entries
1,889
283 companies
Contracts With $0 Rate
38
34.5% need review
Unassigned Time Entries
4,293
5.2% have no contract
View DAX Query — Summary Metrics
EVALUATE ROW("TotalContracts", COUNTROWS('BI_Autotask_Contracts'), "TotalRevenue", SUM('BI_Autotask_Billing_Items'[total_amount]), "AvgValue", DIVIDE(SUM('BI_Autotask_Billing_Items'[total_amount]), COUNTROWS('BI_Autotask_Contracts')), "Companies", DISTINCTCOUNT('BI_Autotask_Contracts'[company_id]))
2.0
Rate Entry Breakdown
Analysis of all 220 contract rate records across 110 contracts
Rate Category Count Share Status
Total rate records 220 100% All contracts
Valid rates (>$0) 153 69.5% Billable
Zero-rate entries 67 30.5% Revenue risk
Rate range (valid) $1 to $149/hr No standard rate card
Distinct billing roles 13 Roles defined
Avg rate records per contract 2.0 110 contracts
Rate Entry Distribution
Valid rates ($1–$149/hr) 69.5% — 153 entries
153 records
Zero-rate entries ($0/hr) 30.5% — 67 entries
67 records
Rate range observation
Valid rates span $1 to $149/hr across 13 billing roles. The wide spread suggests no standard rate card is in use, which increases the chance of setup errors when creating new contracts.

30.5% of all contract rate entries are set to $0. That's a significant data quality gap. Zero rates mean technicians can log hours against those contracts without generating any billable revenue. Whether intentional (for non-billable contract types) or accidental, each one needs to be reviewed. The rate range of $1 to $149/hr across valid entries suggests there's no standardized rate card, which raises the chance of setup errors each time a new contract or role is added.

View DAX Query — Rate Entry Breakdown
-- Valid vs zero rate entries
EVALUATE
SUMMARIZECOLUMNS(
    "Rate Category",
        IF('BI_Autotask_Contract_Rates'[contract_hourly_rate] = 0,
           "Zero Rate", "Valid Rate"),
    "Entry Count",  COUNTROWS('BI_Autotask_Contract_Rates'),
    "Pct of Total", DIVIDE(
                        COUNTROWS('BI_Autotask_Contract_Rates'),
                        CALCULATE(COUNTROWS('BI_Autotask_Contract_Rates'), ALL('BI_Autotask_Contract_Rates'))
                    )
)

-- Rate range and role count
EVALUATE
ROW(
    "Min Valid Rate",   CALCULATE(
                            MIN('BI_Autotask_Contract_Rates'[contract_hourly_rate]),
                            'BI_Autotask_Contract_Rates'[contract_hourly_rate] > 0
                        ),
    "Max Rate",         MAX('BI_Autotask_Contract_Rates'[contract_hourly_rate]),
    "Distinct Roles",   DISTINCTCOUNT('BI_Autotask_Contract_Rates'[role_name])
)
3.0
Projects Without Contract Assignment
Projects and time entries with no contract link — billing orphans that can't be invoiced correctly
31
Projects with no contract
11.1% of 279 total projects
4,293
Time entries without contract
5.2% of 82,790 total entries
248
Projects with contract
88.9% correctly linked
Issue Type Count Percentage Risk Level
Projects with no contract assigned 31 11.1% High
Time entries with no contract 4,293 5.2% Medium
Non-billable time entries 9,530 11.5% Low–Medium
Projects with contract assigned 248 88.9% OK
Total projects audited 279 100% Full scope

31 projects have no contract assigned. Any time logged against those projects goes unlinked to a billing agreement, making it impossible to invoice correctly without manual intervention. At 4,293 time entries with no contract reference, that's a meaningful volume of hours floating in the system with no clear billing path. The non-billable entry count (9,530) is a separate category but worth tracking alongside these figures to distinguish intentional non-billable work from hours that are simply miscategorized.

View DAX Query — Projects Without Contract Assignment
-- Projects without contract
EVALUATE
ROW(
    "Total Projects",           DISTINCTCOUNT('BI_Autotask_Projects'[project_id]),
    "Projects No Contract",     CALCULATE(
                                    DISTINCTCOUNT('BI_Autotask_Projects'[project_id]),
                                    ISBLANK('BI_Autotask_Projects'[contract_id])
                                ),
    "Projects With Contract",   CALCULATE(
                                    DISTINCTCOUNT('BI_Autotask_Projects'[project_id]),
                                    NOT(ISBLANK('BI_Autotask_Projects'[contract_id]))
                                )
)

-- Time entries without contract
EVALUATE
ROW(
    "Total Time Entries",       COUNTROWS('BI_Autotask_Time_Entries'),
    "TE No Contract",           CALCULATE(
                                    COUNTROWS('BI_Autotask_Time_Entries'),
                                    ISBLANK('BI_Autotask_Time_Entries'[contract_id])
                                ),
    "Non Billable Entries",     CALCULATE(
                                    COUNTROWS('BI_Autotask_Time_Entries'),
                                    'BI_Autotask_Time_Entries'[is_billable] = FALSE()
                                )
)
4.0
Billing Hours Health Check
Breakdown of billable vs non-billable hours across all 82,790 time entries
Billable Hours
38,364
75.6% of total logged
Non-Billable Hours
12,388
24.4% of total logged
Hours Distribution
Billable hours 75.6% — 38,364 hrs
38,364 hrs
Non-billable hours 24.4% — 12,388 hrs
12,388
Total hours logged 50,752 hrs
What the 24.4% non-billable figure actually means

At 75.6% billable, the headline number looks reasonable. But that rate is calculated against all logged hours, including time on projects with no contract and entries that hit zero-rate billing codes.

If even half the 4,293 contract-orphan entries represent billable work that went unlinked, that's a meaningful chunk of revenue that didn't make it to an invoice. The real billable ratio could be higher than 75.6% once contract assignments are cleaned up.

The key question to answer in follow-up: how many of the 9,530 non-billable entries are intentional (client agreement) versus accidental (wrong billing type selected)?

Overall, 75.6% of logged hours are billable. That's the baseline. The question is whether the non-billable 24.4% is intentional or a symptom of rate conflicts and missing contract assignments. If projects without contract links are absorbing billable hours, the effective billable rate is lower than it looks on the surface. A deeper clean-up of the 31 unlinked projects and the 4,293 orphan time entries would give a clearer picture of what's actually being recovered as revenue.

View DAX Query — Billing Hours Health Check
EVALUATE
ROW(
    "Total Hours Logged",      SUM('BI_Autotask_Time_Entries'[hours_worked]),
    "Billable Hours",          CALCULATE(
                                   SUM('BI_Autotask_Time_Entries'[hours_worked]),
                                   'BI_Autotask_Time_Entries'[is_billable] = TRUE()
                               ),
    "Non Billable Hours",      CALCULATE(
                                   SUM('BI_Autotask_Time_Entries'[hours_worked]),
                                   'BI_Autotask_Time_Entries'[is_billable] = FALSE()
                               ),
    "Billable Ratio",          DIVIDE(
                                   CALCULATE(
                                       SUM('BI_Autotask_Time_Entries'[hours_worked]),
                                       'BI_Autotask_Time_Entries'[is_billable] = TRUE()
                                   ),
                                   SUM('BI_Autotask_Time_Entries'[hours_worked])
                               )
)
5.0
Key Findings
Priority issues identified by the rate conflict audit, ranked by billing impact
!

38 contracts have at least one $0 rate entry

Review each one. Non-billable contract types may be intentional, but accidental zero rates are revenue leaks. For every role on those contracts that should be billable, no revenue is generated regardless of how many hours are logged. Start with contracts that have the highest time entry volume and verify whether the zero rate is by design.

!

31 projects have no contract assigned

Time entries on unlinked projects can't be invoiced correctly. The billing path from time entry to invoice requires a contract reference. Assign contracts before work starts, or at minimum before the next billing cycle closes. For recurring work, check whether a default contract is configured at the company level in Autotask.

!

4,293 time entries lack a contract reference

These entries are billing orphans. They exist in Autotask but have no contract link, meaning they fall outside the normal invoicing flow. A monthly cleanup process would prevent accumulation. Filter by date range and sort by resource to identify who is most often logging against unlinked projects, then trace the root cause.

OK

88.9% of projects are correctly contract-linked

The majority of your project portfolio is properly set up. The 248 linked projects represent a solid baseline. Focus remediation effort on the 31 exceptions rather than treating this as a systemic failure. The rate conflict issues are concentrated and fixable with targeted effort.

View DAX Query — Key Findings Aggregates
-- Contracts with at least one zero-rate entry
EVALUATE
CALCULATETABLE(
    SUMMARIZE(
        'BI_Autotask_Contract_Rates',
        'BI_Autotask_Contract_Rates'[contract_id],
        'BI_Autotask_Contract_Rates'[contract_name],
        "Zero Rate Count",    CALCULATE(
                                  COUNTROWS('BI_Autotask_Contract_Rates'),
                                  'BI_Autotask_Contract_Rates'[contract_hourly_rate] = 0
                              ),
        "Total Rate Records", COUNTROWS('BI_Autotask_Contract_Rates')
    ),
    CALCULATE(
        COUNTROWS('BI_Autotask_Contract_Rates'),
        'BI_Autotask_Contract_Rates'[contract_hourly_rate] = 0
    ) > 0
)
ORDER BY [Zero Rate Count] DESC
6.0
Frequently Asked Questions
Common questions about contract rate conflicts and how to resolve them
What is a contract rate conflict?

A contract rate conflict occurs when the hourly rate on a time entry doesn't match the contract's specified billing rate for that role. In Autotask, contracts define rates per billing role (e.g., Senior Engineer, Project Manager). If the rate on a time entry is $0 when the contract should bill $125/hr, or if the entry references the wrong contract entirely, that's a rate conflict. The result is either missed revenue or an incorrect invoice.

Why are there zero-rate contract entries?

Some zero-rate entries are intentional. Managed service agreements with a flat monthly fee, warranty contracts, or non-billable service arrangements may have roles deliberately set to $0 because billing happens separately. The problem is when zero rates appear on contracts that should be billing by the hour. This happens when someone creates a new contract or adds a new role without completing the rate setup. The field defaults to $0 and gets overlooked.

How do I fix projects with no contract assigned?

In Autotask, open the project and navigate to the contract assignment field. Select the appropriate contract for that client. For recurring work, check whether a default contract is configured at the company level so new projects inherit the contract automatically. Going forward, make contract assignment a required step in your project creation checklist. For the 31 currently unlinked projects, prioritize the ones with the most recent time entries or the highest hour volumes first.

What happens to time entries with no contract?

They get logged in Autotask but can't be tied to a billing agreement. This means they typically fall outside the invoicing run unless someone manually identifies and reassigns them. Over time, these orphan entries accumulate and either get written off or require expensive manual reconciliation at billing time. Setting up a monthly review process to catch and fix these before billing runs saves time and prevents revenue loss.

How often should I run this audit?

Monthly is the right cadence for most MSPs. Rate conflicts and missing assignments tend to accumulate gradually, and catching them before the billing cycle closes is far easier than retroactively fixing invoices. A quick audit at the start of each month, before you run billing, takes a few minutes with this report and can prevent disputes that take hours to resolve. If your team is adding new contracts or clients frequently, run it bi-weekly during high-growth periods.


Generate this report from your own data

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