This report provides a detailed breakdown of what’s the average project lead time? 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: Project managers, operations leads, and MSP owners tracking delivery
How often: Weekly for status updates, milestone dates for escalation, monthly for portfolio review
The portfolio is healthy at a high level: $1.44M in revenue with a near 50% margin is solid for an MSP project book. The key question is whether that margin holds as projects age. Complete projects sit at 48.2% margin, while in-progress projects are tracking higher at 55.8% — suggesting pricing has improved on newer work, or that cost actuals have not fully landed yet.
EVALUATE
ROW(
"Total Projects", COUNTROWS('Project'),
"Total Revenue", SUM('Project'[Revenue]),
"Total Cost", SUM('Project'[Cost]),
"Total Profit", SUM('Project'[Revenue]) - SUM('Project'[Cost]),
"Overall Margin %", DIVIDE(
SUM('Project'[Revenue]) - SUM('Project'[Cost]),
SUM('Project'[Revenue])
) * 100
)
| Status | Revenue | Margin | Revenue Share |
|---|---|---|---|
| Complete | $1,137,672 | 48.2% | |
| In progress | $261,787 | 55.8% | |
| Live | $23,139 | 54.2% | |
| On Hold | $16,704 | 51.0% | |
| New | $1,430 | 53.7% | |
| Waiting to start | $306 | 62.9% | |
| Inactive | $123 | 59.3% |
Complete projects account for 79% of total portfolio revenue. The margin gap between Complete (48.2%) and In Progress (55.8%) is worth watching. In-progress margins often compress as projects close out — labour overruns, scope additions, and final billing adjustments all land at completion. A project tracking at 55.8% today might close at 48% or lower.
The On Hold category carries $16,704 in revenue at 51% margin. These projects are not generating billable hours but are consuming sales and operational overhead. Each week they sit idle, the effective margin erodes.
EVALUATE
SUMMARIZECOLUMNS(
'Project'[Status],
"Revenue", SUM('Project'[Revenue]),
"Cost", SUM('Project'[Cost]),
"Margin %", DIVIDE(
SUM('Project'[Revenue]) - SUM('Project'[Cost]),
SUM('Project'[Revenue])
) * 100,
"Project Count", COUNTROWS('Project')
)
ORDER BY [Revenue] DESC
| Project | Company | Status | Revenue | Cost | Margin |
|---|---|---|---|---|---|
| Project Environment | Lewis LLC | Complete | $227,918 | $126,286 | 44.6% |
| Project Somebody | Craig-Huynh | Complete | $88,995 | $62,510 | 29.8% |
| Project Along | Doyle-Contreras | Complete | $77,269 | $35,439 | 54.1% |
| Project Leave | Clements, Pham & Garcia | Complete | $59,583 | $27,299 | 54.2% |
| Project Though | Burke, Armstrong & Morgan | In progress | $49,122 | $25,730 | 47.6% |
| Project Number | Little Group | Complete | $42,903 | $20,302 | 52.7% |
| Project Feel | Wu-Jackson | In progress | $39,867 | $18,507 | 53.6% |
| Project Anyone | Ramos Group | In progress | $26,162 | $10,652 | 59.3% |
| Project Safe | George Ltd | Complete | $26,557 | $11,651 | 56.1% |
| Project Mr | Rivers, Rogers & Mitchell | In progress | $29,887 | $17,721 | 40.7% |
Project Somebody stands out immediately: $88,995 in revenue but only 29.8% margin. That is the second-largest project by revenue and the lowest margin in the top 10. It is worth reviewing whether this was a fixed-price engagement that ran over, or whether billing did not capture all hours. Either way, the cost of $62,510 on a $89K project leaves very little room for error.
Project Mr (In Progress, 40.7% margin) is tracking below portfolio average while still active. If cost actuals continue to accumulate at the current rate, this project may close well below the team average.
EVALUATE
TOPN(
10,
SUMMARIZECOLUMNS(
'Project'[Name],
'Project'[Company],
'Project'[Status],
"Revenue", SUM('Project'[Revenue]),
"Cost", SUM('Project'[Cost]),
"Margin %", DIVIDE(
SUM('Project'[Revenue]) - SUM('Project'[Cost]),
SUM('Project'[Revenue])
) * 100
),
[Revenue], DESC
)
Lead time for a project is the number of calendar days between the moment a project moves to active status and the moment it reaches Complete. Your ConnectWise PSA records status change timestamps for every project, which means you can calculate this directly in Power BI without any manual tracking.
Several factors shape lead time in an MSP context. Scope definition quality is the biggest one: projects that enter the active phase without a clear statement of work routinely run 30–50% longer than planned. Client availability is the second driver — waiting for client sign-offs, access credentials, or maintenance windows adds days or weeks that have nothing to do with your team's capacity.
On Hold status is a direct indicator of client-side delays or scope disputes. The $16,704 sitting in On Hold in this portfolio is not earning new revenue but continues to consume project management overhead. Tracking time-in-status gives you the data to have that conversation with the client.
EVALUATE SUMMARIZECOLUMNS('BI_Autotask_Projects'[project_status_name], "ProjectCount", COUNTROWS('BI_Autotask_Projects'), "AvgDurationDays", AVERAGE('BI_Autotask_Projects'[duration_days]), "TotalEstHours", SUM('BI_Autotask_Projects'[estimated_hours]), "TotalWorkedHours", SUM('BI_Autotask_Projects'[worked_hours]))
At 29.8% margin on $88,995 revenue, this is the portfolio's biggest underperformer. The gap between revenue and cost suggests either hours were not fully captured in billing or the fixed-fee was set too low relative to actual scope. Pull the time entries and cross-reference against the original SOW.
Projects currently in flight are showing 55.8% margin — 7.6 points above the complete project average. This gap almost always narrows at project close. Budget for final labour costs, punch-list items, and any scope that was delivered informally but not billed.
ConnectWise records every status change with a date. Using DATEDIFF on these timestamps gives you accurate lead time per project without any manual data entry. Once this measure exists in Power BI, you can segment by project type, client tier, or technician to find where delays concentrate.
Lead time is the elapsed calendar time from when a project first becomes active (status moves to "In Progress" or equivalent) to when it reaches "Complete". It is a wall-clock measure, not a billable hours measure. A project can have low billable hours but a long lead time if it spent weeks waiting for a client approval or hardware delivery. Both numbers matter, and they tell different stories.
It depends on how you define it. If you calculate lead time as total days from start to completion, On Hold periods inflate the number and may unfairly reflect on your team's delivery speed. A cleaner approach is to calculate active lead time only — excluding days where the project was in On Hold, Waiting to Start, or Inactive status. Proxuma's Projects dashboard gives you both views.
Two main reasons. First, in-progress projects have not yet accumulated all their final costs. Labour entries, subcontractor invoices, and charge items that arrive late often land after a project is marked complete — but while it is still active, the cost side looks lighter than it will at close. Second, newer projects are often priced more aggressively as MSPs gain experience and tighten their SOWs. Complete projects may include older engagements from a time when pricing was less refined.
There is no single benchmark because it depends entirely on project type. Small configurations and device setups should close in 2 to 4 weeks. Infrastructure migrations typically run 6 to 10 weeks. Full-scale M365 tenant migrations or network redesigns can extend to 3 to 6 months. The useful benchmark is your own historical average per project type — if your network deployments used to close in 5 weeks and now average 9, something has changed in scope or capacity.
If your PSA does not expose a status history table, you can use the project's scheduled start date and actual completion date as a proxy. DATEDIFF([Scheduled Start], [Actual End Date], DAY) gives you a reasonable approximation of lead time. It is less precise than using actual status change timestamps, but it gets you 80% of the insight with a much simpler query. ConnectWise Manage does expose status history through its API, so Proxuma can surface it if it is included in your data model.
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