How to calculate profit per job for a contractor (2026)
Most working contractors track revenue and call that profit. They look at a $54,200 invoice paid and feel like they made $54,200. They didn't. By the time you back out materials, burdened labor, subcontractors, equipment, sales commission, and an honest slice of overhead, that pool resurface might have cleared 6 percent. The roofing job might have lost money outright. Here is the exact formula used by working contractors who actually know their numbers, plus a worked example, the three costs nearly everyone forgets, and how to track this without rebuilding a spreadsheet every January.
What's in this article
Why "revenue minus materials" is not profit
I came to construction from financial tech. The first time I sat in on a year-end review at the pool company I worked for, the owner pulled up a list of completed jobs and read off revenue numbers. "Lopez Travertine Deck, fifty-two grand. Garcia Spillover Spa, seventy-eight grand. Wilson 16x32, one-twenty." Then he said, "Yeah, good year."
Three months later he laid off two people. The "good year" had cleared something like 4 percent net. The issue was not the jobs. The issue was that nobody had ever sat down and calculated per-job profit with all the actual costs included. Revenue is what hits your bank account. Profit is what is left after every dollar that job cost you walks back out.
The reason contractors do this is straightforward. Material costs are visible because you wrote a check to the supplier. Sub costs are visible because you wrote a check to the sub. But labor, equipment, sales commission, and overhead are diffuse. They sit in your payroll system, your truck loan, your insurance bill, your office rent. Most contractors never connect a specific job back to a specific share of those costs. So those costs disappear from the math.
The actual profit-per-job formula
Here is what real profit per job actually is:
− Materials cost
− Subcontractor cost
− Direct labor (burdened)
− Equipment cost (allocated)
− Sales commission
− Overhead allocation
Each of those bottom four terms is where contractors most commonly mess up. Let's walk through each one.
Revenue
The total dollars collected from the customer for this job. Easy. The one trap: if you ran a financing program for the customer and ate the financing fee (say, 3 percent on a $50k job for 0% financing), the revenue is what hit your bank, not the contract amount. Subtract the fee.
Materials cost
Every receipt and supplier invoice tied to this specific job. Pool builders: gunite, plaster, tile, coping, decking, equipment package, plumbing parts, electrical parts. GCs: lumber, drywall, fixtures, finishes. The trap most contractors fall into: they price the estimate from a catalog price book but forget that they actually paid 7 percent more this quarter due to a vendor price increase. The estimate showed Pebble Tec at $5.40 a square foot; you actually paid $5.78. Multiply across 1,200 square feet and that's a $456 leak you never noticed.
Subcontractor cost
Sub bids accepted and paid. Straightforward, but track actual paid amount, not the bid. Subs send change orders. Subs add hours. The plaster crew quoted $8,700 and you ended up paying $9,200 because they hit unexpected rebar repair. The estimate sheet says $8,700. The accounting reality is $9,200.
Direct labor (burdened, not just hourly)
Here is where almost everybody undercounts. The $25/hour you pay your lead is not the cost to you. The burdened labor cost is the $25 plus:
- Employer payroll taxes (FICA, Medicare, FUTA, SUTA, generally 7.65 percent + state)
- Workers' Comp premium (varies wildly by trade — roofers can pay 20-40 percent, pool builders 5-10 percent, office staff 0.5 percent)
- General Liability allocation
- Health insurance contribution (if you offer it)
- Paid time off, sick days, holidays (the hours you pay them when they are not productively working a job)
- Vehicle, tool, and phone allowance (if you provide these)
For most residential construction trades, the burdened cost lands around 1.35x to 1.65x the base wage. So your $25/hour lead actually costs you somewhere between $33 and $41 per hour worked. Track time on the job and apply the burden multiplier to get the real number.
Equipment cost (allocated)
If you own a skid steer, an excavator, a dump truck, or a gunite rig, those have a depreciation cost per hour of use. The way to handle this without overthinking it: pick a flat hourly rate per equipment piece based on what it would cost you to rent equivalent equipment, and apply that to hours used on this job. A skid steer in Florida rents at ~$300/day so an in-house equivalent allocation is ~$300 per job-day of use. Mileage on company vehicles is another small but real cost worth tracking, especially if you do a lot of distant jobs.
Sales commission
If you have salespeople or a designer who closes the deal, they are getting a cut. Track it per job. A 5 percent commission on a $54,200 job is $2,710 that you do not get to keep. If you sell jobs yourself, you can either skip this line item or pay yourself a notional commission and count it as part of owner labor; either is defensible as long as you're consistent.
Overhead allocation
This is the most misunderstood. Overhead is your fixed monthly costs: rent or office, insurance (the policies, not the job-specific portions), software, salaries of office staff not assigned to specific jobs, accountant, marketing, the truck loan, the phone bill. Most working construction businesses run overhead between 8 and 18 percent of annual revenue.
To allocate overhead per job, the simplest method: take last year's overhead total, divide by last year's revenue, get the percentage. Then apply that percentage to each job's revenue this year. If your overhead is 12 percent of revenue, then a $54,200 job carries $6,504 of overhead allocation.
Yes, this is rough. There are more precise methods (allocating by labor hours, by direct cost, etc.). But "12 percent of revenue" gets you 80 percent of the answer with 5 percent of the work, and 80 percent of the answer is dramatically better than 0 percent of the answer, which is where most contractors currently sit.
Worked example: a $54,200 pool resurface
Here is the same job, looked at two different ways. The "estimate view" is what the contractor sees when they send the bid. The "actual view" is what they paid for in reality.
The estimate view (what most contractors track)
| Revenue (contract) | $54,200 |
| Materials (estimated) | −$22,000 |
| Subs (estimated) | −$8,500 |
| "Profit" | $23,700 |
| "Margin" | 44% |
Looks great. 44 percent margin. The owner posts it on the office whiteboard. Time for new boots.
The actual view (with every cost included)
| Revenue (after 3% financing fee) | $52,574 |
| Materials (actual, with vendor price increases) | −$22,800 |
| Subs (actual, with two change orders) | −$9,200 |
| Direct labor (60 hours × $25/hr × 1.45 burden) | −$2,175 |
| Equipment (skid steer 2 days @ $300/day) | −$600 |
| Sales commission (5% on revenue) | −$2,629 |
| Overhead allocation (12% of revenue) | −$6,309 |
| Actual profit | $8,861 |
| Actual margin | 16.9% |
The estimate said $23,700 profit at 44 percent. Reality was $8,861 at 17 percent. That's a $14,839 gap between perception and reality — on a single job.
Multiply that gap across 30 jobs in a year and you can see why a contractor doing $1.5 million in annual revenue can feel busy, feel successful, and still wonder why their bank account never grows. The gap is not laziness or theft. The gap is that "profit per job" has never been calculated honestly. The estimate looked great, the invoice got paid, and the costs that walked back out the door were invisible.
Most working contractors who upgrade from a free estimating app to real construction software do it because they hit this realization. The leak only becomes visible when you have a system that subtracts every cost the way it actually was, not the way you estimated it.
The spreadsheet method (manual)
Before recommending an app, here is how to do it manually if that's where you are right now. Build one Google Sheet per job. Columns:
- Revenue — contract amount, then subtract any financing fees
- Materials — every supplier invoice tied to this job, actual amount paid (not estimated)
- Subs — every sub payment, actual including change orders
- Labor hours — total crew hours on the job, multiplied by the burdened hourly rate (your hourly wage × 1.45)
- Equipment days — days of company equipment used × your allocation rate
- Commission — % × revenue, if you pay one
- Overhead — annual overhead % × revenue (set the % at the start of the year based on last year's numbers)
- Profit — revenue minus all the above
- Margin — profit ÷ revenue, formatted as a percentage
The spreadsheet works. The reason most contractors who try this stop after a few jobs is that data entry is painful and the spreadsheet doesn't help you actually capture costs as they happen. You forget to log the supplier invoice. You forget to log the sub change order. By month three the sheet is incomplete and the numbers don't reconcile.
What "good margin" looks like by trade
Once you start calculating real profit per job, you need benchmarks. Here are typical net margins (after every cost including overhead) for residential trades. These are rough ranges, not law:
- Custom home building (GC): 10-18%
- Pool building (new construction): 18-28%
- Pool resurfacing / remodel: 15-25%
- Pool service (recurring): 25-40%
- Kitchen / bath remodeling: 12-20%
- Roofing (residential): 8-15%
- HVAC (install): 12-22%
- HVAC (service / repair): 30-50%
- Landscaping (install): 15-25%
- Landscaping (maintenance): 20-35%
- Electrical (residential service): 20-35%
- Plumbing (residential service): 25-40%
- Subcontracting (any trade, project work): 8-18%
If your real margins after every cost are below the bottom of the range for your trade, you are either underpricing, overspending on labor or subs, or carrying too much overhead for your revenue level. Calculate it per job and you can tell which.
How Workhand calculates this for you
Workhand's Team plan ($89/month) calculates real profit per job inside every estimate. On the estimate detail screen, owners and project managers see a clearly marked "Internal · Not on customer copy" section with:
- Materials cost (auto-summed from line items)
- Subcontractor cost (auto-summed from sub bids attached to the job)
- Sales commission (% × revenue, set per salesperson)
- Estimated profit (revenue minus the above)
- Margin percentage
As materials are received and subs are paid, the cost numbers update from "estimated" to "actual". Labor and equipment hours pull from the time tracking feature automatically. Overhead allocation can be set at the company level as a percentage of revenue and applied per job. By the time the job is invoiced, your dashboard shows the real margin — not the estimate-time margin.
The internal margin section is never visible to your customer. When you send an estimate or invoice via email or job portal link, the customer sees only the line items they're paying for. The cost breakdown stays on your side of the app.
See real profit per job from your phone
14-day free trial on Team. No credit card. Set up takes under 10 minutes.
Download WorkhandA few common questions
Should I include my own owner salary in the cost?
Depends on what you're trying to measure. If you want "is this business making money on top of paying me a salary?", then yes, include your owner pay in the overhead allocation. If you want "what did this specific job leave for me to take home including my work on it?", then exclude your pay from costs. Both are valid; just be consistent.
How do I handle warranty / callback costs?
Two options. Option A: build a 1-2 percent warranty reserve into your overhead allocation. Option B: when a callback happens, log the cost back to the original job and recalculate margin retroactively. Option B is more accurate but requires going back and adjusting jobs months after they closed. Most working contractors use Option A.
What about jobs that take more than a year?
Large multi-month builds (think custom homes or large pools) require revenue recognition tied to milestones, not to invoice dates. Either bill at milestones and treat each milestone as a "sub-job" with its own profit calculation, or wait until the entire job closes to calculate final margin. Don't try to calculate "current margin" on an open multi-month job — too much can change.
I'm a one-person shop. Do I really need this?
Yes, more than anyone. When you're solo, your labor IS the job, and undercounting your hours is the fastest way to feel busy and broke at the same time. Track your own hours. Apply a burden multiplier (use 1.0x if you don't have payroll burden costs yet, or whatever your hourly target is). The math still works.
What to do next
Pick one job you just finished or are about to invoice. Sit down for 20 minutes and do the math by hand using the formula above. Most working contractors are stunned at the gap between the estimate-time margin and the actual margin. The first time you do it honestly, you'll either:
- Raise your prices on the next bid (most common reaction)
- Renegotiate with a sub or supplier (when their costs are way over estimate)
- Cut a category of work entirely (when a trade you do consistently loses money on a real margin basis)
Or you'll just feel relieved that the work you've been doing is actually profitable. Either outcome is more useful than not knowing.