Comparing estimated vs actual hours across all project phases to identify budget overruns.
Comparing estimated vs actual hours across all project phases to identify budget overruns.
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: Project managers, operations leads, and MSP owners tracking delivery
How often: Weekly for status updates, milestone dates for escalation, monthly for portfolio review
Comparing estimated vs actual hours across all project phases to identify budget overruns.
EVALUATE
TOPN(50,
ADDCOLUMNS(
VALUES('BI_Autotask_Phases'[phase_id]),
"proxuma_phase_id", CALCULATE(MAX('BI_Autotask_Phases'[proxuma_phase_id])),
"start_date", CALCULATE(MAX('BI_Autotask_Phases'[start_date])),
"end_date", CALCULATE(MAX('BI_Autotask_Phases'[end_date])),
"est_minutes", CALCULATE(MAX('BI_Autotask_Phases'[proxuma_estimated_in_minutes])),
"act_minutes", CALCULATE(MAX('BI_Autotask_Phases'[proxuma_actual_in_minutes]))
),
[act_minutes], DESC
)
All phases where actual hours exceed the estimate by more than 100%. Sorted by variance percentage, highest first.
| Metric | Value |
|---|---|
| Projects | 279 |
| Est Hours | 10,066 |
| Worked Hours | 10,216 |
| Variance | -150 hours |
EVALUATE ROW("TotalProjects", COUNTROWS('BI_Autotask_Projects'), "TotalEstHours", SUM('BI_Autotask_Projects'[estimated_hours]), "TotalWorkedHours", SUM('BI_Autotask_Projects'[worked_hours]), "TotalVariance", SUM('BI_Autotask_Projects'[variance_hours]))
Phases where the team used fewer hours than estimated. Sorted by the largest savings first.
| Phase ID | Estimated (h) | Actual (h) | Variance | Status |
|---|---|---|---|---|
| 52654 | 536.3 | 238.0 | -55.6% | Under budget |
| 35475 | 1,586.7 | 1,205.0 | -24.1% | Under budget |
| 85073 | 338.8 | 269.0 | -20.6% | Under budget |
| 71189 | 628.0 | 608.0 | -3.2% | On track |
| 32084 | 206.9 | 208.0 | +0.5% | On track |
EVALUATE
TOPN(50,
ADDCOLUMNS(
VALUES('BI_Autotask_Phases'[phase_id]),
"proxuma_phase_id", CALCULATE(MAX('BI_Autotask_Phases'[proxuma_phase_id])),
"start_date", CALCULATE(MAX('BI_Autotask_Phases'[start_date])),
"end_date", CALCULATE(MAX('BI_Autotask_Phases'[end_date])),
"est_minutes", CALCULATE(MAX('BI_Autotask_Phases'[proxuma_estimated_in_minutes])),
"act_minutes", CALCULATE(MAX('BI_Autotask_Phases'[proxuma_actual_in_minutes]))
),
[act_minutes], DESC
)
How all 50 phases break down by budget performance category
EVALUATE
TOPN(50,
ADDCOLUMNS(
VALUES('BI_Autotask_Phases'[phase_id]),
"proxuma_phase_id", CALCULATE(MAX('BI_Autotask_Phases'[proxuma_phase_id])),
"start_date", CALCULATE(MAX('BI_Autotask_Phases'[start_date])),
"end_date", CALCULATE(MAX('BI_Autotask_Phases'[end_date])),
"est_minutes", CALCULATE(MAX('BI_Autotask_Phases'[proxuma_estimated_in_minutes])),
"act_minutes", CALCULATE(MAX('BI_Autotask_Phases'[proxuma_actual_in_minutes]))
),
[act_minutes], DESC
)
The three phases with the highest percentage overruns (9780, 7979, 82395) all had original estimates under 3 hours. When a phase is budgeted at 1-2.5 hours, any real work immediately produces a 1,000%+ variance. These are likely phases that were created as placeholders or scoped without real task breakdowns.
Phase 9727 (50.6h estimate, 527.0h actual) and Phase 41160 (484.9h estimate, 729.0h actual) represent the most expensive overruns in absolute hours. Combined, they consumed 720.5 more hours than planned. The percentage looks lower at 50-942%, but the dollar impact is far larger than the smaller phases.
35 out of 50 phases are either under budget or within 10% of the estimate. The overrun problem is concentrated in a relatively small group. Fixing the estimation process for those 15 problematic phases would bring the portfolio into much better shape without changing how the other 35 are managed.
1. Set a minimum estimate threshold. Any phase with an estimate under 4 hours should be flagged during project setup. If a phase genuinely needs only 1-2 hours, it probably belongs as a task inside a larger phase, not a standalone phase with its own budget line.
2. Add a budget alert at 75% consumption. Phases 9727 and 41160 burned through hundreds of extra hours before anyone noticed. An automated alert when a phase hits 75% of its estimated hours gives project leads time to reassess scope or adjust the estimate before the overrun becomes permanent.
3. Review the 8 severely over-budget phases individually. Each of the 8 phases above 100% variance needs a brief root cause review. The answer will fall into one of three categories: bad initial estimate, scope change that was never re-estimated, or time logged to the wrong phase. Each requires a different fix.
4. Track under-budget phases for estimation accuracy. Phase 52654 came in at 55.6% under budget (298 hours unspent). That is either a sign of great efficiency or a sign the estimate was inflated. If estimates are consistently high, they distort capacity planning and make the portfolio look healthier than it is.
5. Run this report monthly. A single snapshot shows the current state. Running this every month turns it into a trend line: are overruns growing or shrinking? Are the same projects showing up repeatedly? Monthly comparison is what separates a data point from an actual management tool.
Autotask PSA stores both the estimated and actual minutes per project phase. Proxuma Power BI pulls these fields through the Autotask connector. The AI divides minutes by 60 to display hours and calculates the variance percentage as (actual - estimated) / estimated x 100.
Percentage variance amplifies when the original estimate is very small. A phase estimated at 2.5 hours that consumes 173 hours produces a 6,820% overrun. In absolute terms, 170.5 extra hours is serious but manageable. The percentage is eye-catching, but the dollar impact depends on the actual hours, not the percentage.
This report queries the top 50 phases by actual minutes logged, regardless of project status. That means it includes active, completed, and on-hold phases. To filter by status, add a project status filter to the DAX query.
Yes. Add a filter on the project ID in the DAX query to isolate a single project. Proxuma Power BI can also generate a per-project report that breaks down every phase with its budget status, timeline, and resource allocation.
Yes. Connect Proxuma Power BI to your Autotask PSA account, 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