Retrospective labor variance across 34 closed projects, drawn directly from ConnectWise Manage.
Every recurring type of work you delivered in the window, with all instances pooled. Bars run right of the line where actual hours exceeded the estimate.
PM ran +61% over estimate on every project in the window — 249 unquoted hours, or $33,615. It is also the most consistent overrun in the dataset: 33 of 34 jobs exceeded their PM estimate, which means this is not variance, it is a standing under-quote.
PM hours were quoted as a flat block on 29 of 34 jobs — most often 8, 12 or 16 hours regardless of project size. Actual PM hours tracked project duration almost linearly: roughly 1.9 hours of PM per working day the project stayed open.
The five jobs where PM was quoted as a percentage of delivery hours came in at +9%, not +61%. Your own estimators already found the fix; it just was not standardised.
Same work type, different manufacturer, materially different hours. This axis is usually the one that surprises people, because nothing in a PSA surfaces it.
| Vendor | Appears in | Jobs | Variance |
|---|---|---|---|
| SonicWall | Firewall / SD-WAN | 6 | +41% |
| Microsoft 365 / Azure | Migrations, identity | 9 | +34% |
| Ubiquiti | Wireless, switching | 5 | +22% |
| Fortinet | Firewall / SD-WAN | 5 | +18% |
| Dell | Servers, endpoints | 17 | +9% |
| HPE / Aruba | Switching, wireless | 7 | +3% |
| Cisco Meraki | Firewall, switching, AP | 8 | −6% |
The Meraki-versus-SonicWall spread is worth 47 percentage points on comparable firewall work. If those two lines are quoted from the same template today, you are subsidising one with the other.
87% of your 1,412 labor lines were classified into a work type. The
remaining 183 lines carried generic codes — General Labor,
Project Work, Misc Onsite — with no description text to
classify from. Those hours are counted in the headline total but appear in no work
type, so the per-type numbers above are, if anything, conservative.
Two projects were excluded: one had actual hours but no quoted estimate, and one was a fixed-fee block with no hour breakdown on either side. Both are listed in the raw file.
Backup / DR and Switch stack refresh sit close enough to zero that at 6 and 8 jobs respectively they should be read as "no signal" rather than as accurate. They need more instances before we would act on them.