A facilities maintenance company can win a fifteen-building portfolio on a clean preventive-maintenance number and be losing money on it by month three. The PM schedule is the easy part to price. What the bid never really counts is the reactive volume: the after-hours emergencies, and the one building that eats twice its share of work orders.
What the bid prices well
Preventive maintenance is predictable, so it prices cleanly. Quarterly HVAC filter changes, monthly common-area inspections, the annual backflow test. You can put hours and a frequency against each one per building and add them up. The proposal that comes out looks tidy and competitive, and it usually wins.
The trouble is that the PM schedule is maybe half of what the portfolio will actually demand over a year. The other half does not show up on a schedule, so it does not show up in the bid.
What it underprices
Reactive work orders are the half nobody priced. A tenant reports no heat, a pipe lets go on a Saturday, a door closer fails on the suite a law firm just moved into. Volume like this is not random across the portfolio. An older building throws more than a new one, and one demanding property manager generates more tickets than the other fourteen combined.
Most bids price reactive work as a flat per-door adder or fold it into the PM number, because the company has no record of how many reactive calls each property actually produced last year. So the bid is an average applied to buildings that are nowhere near average, and the heavy properties quietly carry the light ones until the contract as a whole stops making money.
Where the margin actually goes
After-hours dispatch is the first drain. An emergency call at 11 p.m. pulls a tech off rest or a subcontractor at premium rate, and an all-in contract eats the difference. Then there is the trade work the company does not self-perform: every plumbing or electrical job it subs out carries a markup the bid may not have built in.
Drive time is the quiet one. A portfolio spread across a metro means a tech spends an hour in traffic for a fifteen-minute fix, and that hour is real labor cost that no line item captured. Add the work orders that get completed but never billed because nobody was sure they were billable, and the margin that looked fine in the proposal is gone by the second quarter.
What a system changes
The fix starts with the data the operation already generates and throws away: every work order, tagged to its property, its trade, whether it was PM or reactive, and what it cost to close. Once a year of that exists, the next bid is priced on cost-to-serve per building instead of a portfolio average, and the renewal conversation comes with a number that reflects which properties actually cost what.
We built the work-order routing layer for a facilities operator running fifteen properties, and the same record that routes a ticket to the right trade also becomes the pricing history. The owner can see the three buildings running at a loss before the renewal, and either price them correctly or let them go on purpose instead of by accident.
Before you build it
Two things have to be real first. Work orders captured per property with enough tagging to separate PM from reactive, and the willingness to price a renewal on what a building actually costs rather than what keeps it cheapest to win. A pricing model is only as good as the history under it, and most maintenance companies have that history scattered across a dispatch inbox and a tech's memory.
Map one quarter to start. Pull every work order, tag each to a property and a type, and total the real hours and subcontractor cost per building. That alone, before any software, usually shows two or three properties that have been losing money the whole contract. Build against the gap that is costing you the most.
