How to bid construction jobs without losing money

By Zia Nawaz, Owner & General Contractor, Eiffel Builders Inc.7 min read

Most contractors do not lose money on a job because they cannot do math. They lose money because the numbers they fed into the math were wrong before the estimate ever left the printer. A bid built on optimistic hours, a forgotten setup day, and a guess at overhead will look perfectly reasonable and still lose money, because it was never really a forecast — it was a hope with a dollar sign in front of it.

The fix is not a fancier spreadsheet. It is feeding the estimate real numbers from real jobs you already finished, instead of numbers that feel about right. A contractor who has three years of job cost history knows that trim work runs 20% over the textbook rate on his crew and prices for it. A contractor without that history reads the same textbook rate and gets surprised, every time, in the same direction.

Below: the four places bids usually go wrong, and how to turn your own closed jobs into the pricing tool that keeps that from happening again.

Why bids go wrong

A losing bid is rarely one big mistake. It is usually four small ones stacked on top of each other, each one shaving a point or two off margin until there is nothing left.

Where it breaksWhat actually happens
Labor productivityThe estimate assumes a crew works at the pace of a good day. Real days include a truck that will not start, a permit inspector running late, and a helper who is new. Actual hours land higher than planned hours on almost every job, and the gap is bigger on unfamiliar work.
Prep and mobilizationLoading the trailer, driving to the site, walking the job with the client, setting up and tearing down protection — none of it touches the tape measure, so it is easy to leave out of the estimate entirely. On a small job, prep can be 10-15% of the labor hours and nobody wrote it down.
OverheadThe truck payment, insurance, phone bill, and your own time in the office do not stop because a job is small. A bid priced only on materials and labor, with nothing added for the cost of running the business, can look profitable and still not cover the lights.
No cost historyWithout records from past jobs, every bid is a fresh guess. The same mistake — underestimating labor on a certain type of work — gets made over and over because nothing carries forward from the last time it happened.

Notice that none of these four is someone stealing from the job. Bids lose money quietly, through numbers that were reasonable-sounding but never checked against what actually happened last time.

What a bid needs to include

A complete bid separates into the same buckets a job cost report tracks later, which is not a coincidence — the bid is a prediction, and the job cost is the result you check it against.

  • Labor hours, broken out by task, priced at your burdened rate — what an hour actually costs you, not the wage on the paycheck.
  • Materials, priced with a buffer for waste and price movement between the bid and the purchase.
  • Subcontractor quotes, locked in writing before they go into the number, not estimated from memory.
  • Prep, mobilization, and cleanup time, counted as real hours even though none of it is visible in the finished work.
  • Overhead, added as a percentage of the job so it is never quietly missing.
  • Margin, added last and on purpose, not whatever is left over after everything else.

Using past jobs to bid the next one

The single biggest upgrade a small contractor can make to bidding is boring: keep the actual cost data from finished jobs, and go back to it before pricing anything similar.

  1. When a job closes, write down what it actually cost — actual labor hours, actual materials, actual sub invoices — next to what the bid said it would cost.
  2. Tag the job by type: kitchen remodel, deck, service call, whatever categories match how you sell work.
  3. Before bidding a similar job, pull the last two or three of that type and compare the bid hours to the actual hours. A pattern shows up fast — most contractors find they underestimate the same task category every time.
  4. Adjust the new bid by that known gap, not by a gut feeling. If decks have run 18% over bid hours for a year, the new deck bid should include that 18%, not hope it was a fluke.
  5. Re-check the pattern every few months. Crews get faster at familiar work and slower on anything new — a productivity factor from two years ago can be stale.

This only works if the actual numbers get captured while the job is open, not reconstructed from memory after it closes. A job cost that is tracked weekly gives you a true actual to compare against. A job cost stitched together in March from a shoebox of receipts gives you a rough guess compared against another rough guess, and the pattern never gets sharp enough to trust.

A worked example

A contractor bids a bathroom remodel at 220 labor hours based on a rough sense of the scope. No history to check it against, so the number is really a guess dressed up as an estimate.

Pull the last three bathroom remodels from job cost records and the actual hours were 245, 260, and 250 — every one ran over the bid by 12-18%, mostly in demo and rough-in, where old houses hide surprises no walkthrough catches. Bidding the next one at 220 hours again repeats the same underestimate a fourth time.

Bid it at 255 hours instead, using the pattern rather than the hope, and the price moves up by roughly $2,000 on a burdened labor rate of $55 an hour. That is not padding — it is pricing the job at what it has actually cost three times in a row. The client pays for the real job, not the optimistic version of it.

This kind of comparison only works if past job costs are easy to pull up by job type. SiteLedger keeps labor, materials, and sub costs tied to each job as they happen, so the actual numbers from a finished job are there to check the next bid against instead of buried in old paperwork.

Bid against your own history, not the market

The most common reason a bid loses money is that it was priced against what the contractor thought the job should take rather than what their crews have actually taken on similar work. Market rates tell you what you can charge. Only your own finished jobs tell you what it will cost you.

That is why closing the loop matters more than any estimating technique. A finished job costed properly becomes the input to the next bid, and after a dozen of them your pricing stops being an opinion.

Common questions

Why do contractors underestimate labor hours in bids?
Because estimates are usually built from a mental picture of a good day, not from records of how past jobs actually went. Without cost history to check against, the same optimistic gap repeats on every similar job.
How much should I add to a bid for overhead?
Enough to cover insurance, vehicles, office costs, and your own time, spread across the jobs you expect to run in a year. Most small contractors land somewhere between 10% and 20% of contract value, applied as a flat percentage rather than calculated job by job.
What is mobilization time and why does it matter in a bid?
It is the time spent loading, traveling, setting up, and cleaning up around the actual work — time a crew spends on site that produces no visible progress. Left out of a bid, it still gets worked and still gets paid, just not billed for.
How do I use past job costs to bid more accurately?
Keep the actual labor hours, materials, and sub costs from every closed job, tagged by job type. Before bidding a similar job, compare the last few actuals to what was originally bid. If a category consistently runs over, price the new bid to that known pattern instead of the original guess.
Is a low bid ever worth taking to win the work?
Only if you know exactly how much margin you are giving up and decide that on purpose — to keep a crew busy, or land a client you want. A bid that is low because the numbers were wrong is not a strategic decision, it is a mistake that happens to look like one after the fact.