The Portfolio That Looked Profitable Until the Drive Time Landed
Why this matters
A portfolio account fails quietly. Nothing breaks, no customer complains, no invoice bounces. Revenue climbs, the schedule stays full, and the owner feels busy and successful right up until the year-end numbers say the busiest year was the thinnest one. Because nothing looks broken, shops chase the wrong cause for months, usually the rate. This is one shop's walk from the first signal to the actual cause, including the three hypotheses that were wrong and the one number that looked reassuring while it lied.
The signal
Three properties under one manager, thirteen months in. Year over year on that account, revenue rose 41% and technician clock hours charged to the account rose 61%. Everything else in the shop was flat.
The owner's read was the obvious one: we discounted too hard to win it. The agreement carried a 6% concession off standard rates. That was the first hypothesis and it was the wrong one, but it took recomputing three others before that became clear.
Hypothesis one: the rate is too low
Test. Realized rate per billable hour on portfolio invoices against realized rate on residential invoices, over the same thirteen months. Realized, not quoted, so discounts, write-offs, and unbilled trip charges all land in the number.
Result. Portfolio realized 94% of the residential rate. A 6% gap, exactly the concession, applied consistently with no leakage underneath it.
Why that eliminated it. A 6% rate gap cannot produce a 20-point swing in account contribution. If the rate were the cause, the gap between realized and quoted would have been much larger than the concession, which is what rate leakage looks like: unbilled trips, waived after-hours premiums, quietly absorbed disposal. There was none. The concession was the concession and nothing more.
Hypothesis two: parts margin is slipping
Test. Parts margin percentage on portfolio work orders against residential, by category.
Result. Portfolio 31%, residential 34%. Real, and it traced cleanly to the manager's approved-parts requirement in two categories where the shop could not use its usual supplier.
Why that only partly eliminated it. Three margin points on the parts portion of an account whose work is mostly labor is a genuine cost, and it stayed on the list as a contributor. It is not a cause. It is nowhere near large enough to move the account, and the shop kept it as a renegotiation item for renewal rather than as an explanation.
Hypothesis three: we are eating callbacks on this account
This one felt right. Occupied units, unfamiliar equipment, tenants who describe the fault secondhand, techs working under time pressure with someone standing in the room. Every condition for rework.
Test. Callback rate, defined as a return visit on the same fault inside 30 days, portfolio against residential.
Result. Portfolio 4.1%, residential 5.3%. The portfolio was better.
Why that mattered more than the elimination. The inversion was informative. The techs were not rushing on portfolio work. If anything they were being more careful, because a manager watching is a different audience than a homeowner. Whatever was consuming the hours, it was not rework, and it was not carelessness. That pointed the search away from quality entirely and toward time that never became work at all.
A fourth check went the same way: after-hours calls were 11% of portfolio work orders against 7% residential, but after-hours bills at a premium, so a higher after-hours share should lift revenue per hour, not depress it. It flagged a scheduling problem to fix later. It was not the cause either.
The number that lied
Through all of this, one figure kept reassuring everybody: billable hours per work order held at 1.90 in the prior year and 1.94 in the current one. Essentially flat. The jobs were the same size as they had always been. Nothing about the work had changed.
That number was true and it was the wrong denominator. Per work order is a measure of how big a job is. It cannot see how many jobs a technician gets through in a day, and that is the only denominator that pays for a technician-day.
Recomputed on technician-days, the picture reversed. On days a technician was dispatched to the portfolio, billable hours came to 3.9 out of an 8.0-hour day, which is 49%. On residential days, the same technicians ran 5.9 out of 8.0, which is 74%. Same people, same skills, same trucks, 2.0 fewer billable hours per day.
That is the whole account, and it had been invisible for thirteen months because the shop measured revenue per job in an account whose problem was jobs per day.
Finding where the 4.1 unbilled hours went
Knowing the gap is not knowing the cause. The shop ran a six-week log: every tech, every stop, four timestamps. Depart previous stop, arrive on site, start work, finish. The difference between arrive and start is the one nobody normally captures, and it turned out to be the answer.
| Unbilled time per 8.0-hour day | Portfolio day | Residential day | Difference |
|---|---|---|---|
| Drive between stops | 1.7 | 1.2 | +0.5 |
| Access wait (arrive to start) | 1.4 | 0.3 | +1.1 |
| Work-order administration | 0.7 | 0.3 | +0.4 |
| Breaks, shop, other | 0.3 | 0.3 | 0.0 |
| Total unbilled | 4.1 | 2.1 | +2.0 |
Drive time was the thing everyone had blamed, including the owner, for a year. Measured, it was +0.5 hours a day, a quarter of the 2.0-hour gap. It was real and it was not the story.
Access wait was +1.1 hours a day, 55% of the gap on its own. That is the time between a technician arriving at a unit and being able to touch anything: calling a tenant who is not home, waiting on a manager with a key, being let into an occupied unit and waiting for a room to be cleared, discovering the unit number on the work order does not match the unit with the fault. None of it is drive, none of it routes away, and none of it shows up in any report a shop normally runs.
Administration was +0.4 hours, from the manager's portal requiring per-unit photos and a written condition note, which the techs were doing at the truck at the end of the day, which meant re-walking units they had already left.
One logged call was excluded from the sample. A tech smelled gas in a ground-floor corridor: everyone left the building immediately, no light switches or thermostats touched, no phone used inside, the gas utility emergency line called from outside, the manager notified after. The call consumed about 40 minutes of the day and it is not access wait, so it stayed out of the averages rather than inflating a number it does not belong to.
The fix, and what it moved
Three changes, each aimed at a measured component rather than at the account in general.
Access, the biggest one. Lockbox or key control on every vacant unit, and a tenant confirmation message sent 30 minutes ahead of arrival on occupied ones, sent by the manager's office rather than by the tech, because a message from the management company gets answered and a message from an unknown number does not. Access wait fell from 1.4 to 0.8 hours per day over the following six weeks.
Administration. Photos and condition notes captured in the unit before leaving it, not at the truck. Administration fell from 0.7 to 0.45.
Drive. Portfolio work blocked onto fixed days rather than interleaved with residential. Drive fell from 1.7 to 1.35.
What they deliberately did not change. The after-hours share stayed at 11%. It bills at a premium and the manager's response obligation is real; changing it would have meant renegotiating the response window, which was worth doing at renewal rather than mid-term.
New unbilled total: 1.35 plus 0.8 plus 0.45 plus 0.3 is 2.9 hours, so 5.1 billable hours per portfolio day, up from 3.9.
Confirming it, and the comparison that actually decides
The shop re-ran the six-week timestamp log rather than watching revenue, because revenue also moves with call volume and season and would not have isolated anything. The log is what confirmed the change was in access and not somewhere else.
Then they ran the comparison that decides whether the account is worth carrying, and it needs one careful step. Portfolio hours bill at 94% of standard, so to compare them against residential hours you have to convert: 5.1 portfolio billable hours at the concession rate is equivalent to 4.79 hours of standard-rate work. At 3.9 it had been 3.67.
The residential comparison is not 5.9, either. That is a full day, and residential days are not always full. Across the year the shop's residential fill averaged 78% of capacity, so the expected residential day is 5.9 times 0.78, about 4.60 standard-rate hours.
Before the fix, 3.67 against 4.60: the portfolio day was running 20% below what an average residential day produced. After, 4.79 against 4.60: about 4% above. The account went from a drag to a modest gain, and the entire swing came from time that was never billable in the first place.
What would have changed the conclusion
If the callback rate had come in higher on the portfolio. The cause would have been quality, not utilization, and the fix would be technical training and better pre-visit information, not routing and keys. Chasing access wait in that case would have wasted a quarter.
If access wait had been flat and drive had carried the whole gap. That is the easier problem and the fix is entirely inside your control: block days, tighter routing, a route order set the night before. No conversation with the manager required.
If the portfolio had been turnover work rather than occupied demand work. Vacant units have almost no access wait, so the diagnosis inverts. On a turnover-heavy portfolio the unbilled time concentrates in drive and in material runs, and the fix is staging parts at the property rather than fixing access.
If the shop had no residential demand to displace. The 4.60 comparison is what makes the account a decision. A shop that cannot fill its days from residential work should evaluate the portfolio day against an empty day, not against a full one, and at that point even 3.67 beats nothing.
References
- See related: How to Price a Multi-Property Agreement, The Payment Cycle You Do Not Control
- See related: How to Find the Job Types You Consistently Underbid, The Dashboard Numbers That Matter
- Trade-standard practice on technician utilization measurement: billable hours as a share of paid technician hours, measured per dispatched day