← Back to blog

Job Profitability for a Construction Company Still Running on Spreadsheets

May 31, 2026

The problem: When your jobs run on spreadsheets, you find out what a job made months after it closed, long after the number could change anything.

The solution: Track costs against the budget while the job is live, so you catch the overrun on this job and bid the next one from what actually happened.

The math

A $600k job that lands six points under bid is about $36k of margin gone, and if the number does not surface for three months you have likely bid four more jobs the same way, putting roughly $180k at stake before anyone sees the first one.

A job closed in March. In June, going through the year to date with your bookkeeper, you notice it made far less than you thought. Not a disaster, but four or five points off. You go looking for why, and the answer takes two days to reconstruct out of the master spreadsheet, some invoices, and a conversation with the project coordinator about what she remembers.

By June it does not matter much. The job is done, the customer paid, and you have already bid the next six. If that job ran over because you underpriced a scope you keep selling, you have now sold it five more times at the same wrong number.

This is the real cost of running jobs on spreadsheets, and it is not the one people usually name. The fragility is real, the version chaos is real, but the expensive part is timing. You find out what a job made when the answer is a piece of history instead of a decision.

The margin number arrives too late to act on

Ask most contractors at this size which jobs made money last year and they can answer roughly, at the end, in aggregate. Ask which of the jobs running right now is going to come in under, and it goes quiet.

The reason is that job margin is not one number sitting somewhere. It is labor, materials, subs, equipment, and change orders, and each of those lands in a different place at a different time. Field hours come in on paper at the end of the week. Supplier invoices arrive weeks after delivery. A sub bills at the end of the month. Somebody has to gather all of it, key it into the spreadsheet, and put it next to the budget.

That gathering only happens when there is time for it, which in construction means it happens late or after the fact. So the comparison of actual to budget is always describing a job you can no longer influence.

What you lose by finding out afterward

Three things, and they compound.

  • The overrun you could have stopped. A job trending over at week three can still be managed: scope tightened, a change order written, a crew rebalanced. The same job discovered at closeout can only be absorbed.
  • The bid you already repeated. The work you are underpricing does not announce itself. It gets bid the same way every time until something shows you, and by then it is in the backlog several times over.
  • The work you should be chasing. Just as invisible as the jobs that lose is the type of job that quietly carries your margin. Without job-level numbers you cannot steer toward it, so the mix stays whatever came through the door.

None of these look like an error. Nobody made a mistake. The information simply arrived after the moment it was worth something.

Seeing margin while the job is live

What changes this is getting job costs to land against the job as they happen rather than being assembled afterward.

That means the pieces your jobs run on need to be connected: the budget, the field hours, the purchase orders and supplier invoices, the sub commitments, and the change orders, all tied to the same job so a cost lands where it belongs the day it exists. Field time goes in from a phone against a job instead of onto a sheet in a truck. A supplier invoice matches to its purchase order and its job on arrival.

The reason this has not happened already is not that the office is careless. It is that in a spreadsheet, all of that matching is manual, and manual matching is the first thing to slip in a busy month. When the routine collecting and matching runs on its own, the comparison of actual to budget is just there, per job, current as of today. Then the coordinator is looking at exceptions rather than building the picture, which is a better use of her week than guarding a file.

A look at a construction company

Consider a contractor doing about $11 million a year with 55 employees, running fifteen to twenty jobs at a time. The entire pipeline, bids, active jobs, costs, change orders, and schedules, lives in a master spreadsheet the project coordinator built and only she fully understands. It works, barely. Job costs get updated when there is a quiet hour, which in season there is not.

The sensible way through is one piece at a time, starting with the piece that carries the money: active job costs against the budget. Field hours captured by job from a phone, purchase orders and supplier invoices matched to the job on arrival, change orders logged where the budget can see them. Run it alongside the spreadsheet for a few weeks to confirm the numbers agree, then retire that part of the file and move to the next one. No live job is ever bet on an untested switch.

What a contractor would expect to find in the first quarter of doing this is uncomfortable and valuable. A category of work would likely show up consistently thinner than bid. A $600k job coming in six points under is about $36k of margin, and the point is that the same shape of job was probably bid four more times before that surfaced, which puts something like $180k in play on a single unnoticed pattern. With current numbers, the second job of that shape gets caught while it is running and the fifth gets bid correctly. You would also expect a quieter finding in the other direction, some category running better than anyone assumed, which is worth knowing before the next round of bidding decides where the crews go.

The coordinator would not be doing less. She would be looking at the two jobs drifting off budget this week instead of reconstructing what happened in March.

How to start

  1. Pick the jobs in flight, not the ones that closed. Start with active work, where the number can still change something.
  2. Get field hours landing by job. Time captured from a phone against a job is the single biggest gap between the budget and reality.
  3. Match costs on arrival. Tie supplier invoices, purchase orders, and sub commitments to the job as they come in, so nothing waits to be assembled later.
  4. Run it in parallel, then look weekly. Keep the spreadsheet until the numbers agree, then put actual against budget in front of yourself every week and watch which categories drift.

The takeaway

The spreadsheet running your jobs is fragile, but the expense is not the fragility. It is that you learn what a job made months after you could have done anything about it, and by then you have bid the same work the same wrong way several more times. Get costs landing against live jobs as they happen, let the routine matching run on its own, and job margin becomes something you watch rather than something you reconstruct. Start with active job costs this month, and the first pattern you find will probably be worth more than the work of finding it.

Every business has a number like that hiding in it.

Text us where your team loses its time, and we’ll put a real number on yours, then show you what’s worth organizing and automating first. No forms, no sales call.