MyDashBorg

Track Job Profit Margin per Service Call

Most HVAC and plumbing shops know their bank balance but not which jobs actually make money. Here is a per-call costing method that turns every service ticket into a profit number you can act on.

M MyDashBorg Jul 24, 2026 6 min read

To track profit margin per job in an HVAC or plumbing business, you calculate the gross profit on each service call (revenue collected minus the direct cost of labor, materials, and the truck to get there) and divide it by that call's revenue. Done consistently across every ticket, this single number tells you which jobs, technicians, and service types are funding the business and which are quietly draining it.

Most shops never see it because their accounting stops at the monthly profit-and-loss statement. A P&L answers one question: did the whole company make money last month? It cannot tell you that your after-hours water heater calls run at a 12 percent margin while your scheduled maintenance plans run at 55 percent. Those two realities net out to a comfortable-looking blended number, and that blended number is exactly what keeps an owner bidding unprofitable work. The fix is not more accounting software. It is a repeatable way to assign costs to a job at the ticket level, and a habit of looking at the result before you bid the next one.

Why the call has to be the unit

Per-job costing flips the unit of measurement from the month to the call, and patterns surface fast: the dispatch that always needs a second truck roll, the technician whose callbacks erase their billed hours, the flat-rate price that has not kept up with copper. The IRS draws a related line. Publication 334, the Tax Guide for Small Business, separates cost of goods sold from operating expenses and, within cost of labor, distinguishes direct labor (workers involved in producing the work) from indirect labor and supervisory overhead. That split is a useful anchor for deciding what counts as a direct, job-attributable cost versus general overhead.

The per-call margin formula

The math is intentionally simple so it survives a busy week. For each service call:

  • Revenue collected: what the customer actually paid, not what you invoiced, if those differ.
  • Direct labor: the technician's fully loaded hourly rate (wage plus payroll taxes, plus a workers-comp and benefits load) times hours on the job, including drive time.
  • Materials and parts: your cost on everything installed, at the price you paid, not the marked-up price you charged.
  • Truck and dispatch cost: a per-call allocation for fuel, vehicle wear, and the time it took to roll. A flat per-roll figure derived from last year's vehicle costs divided by total calls is precise enough to start.

Gross profit is revenue minus those three cost lines. Margin is gross profit divided by revenue, expressed as a percentage. The discipline lives in that loaded labor rate: a technician who costs you 32 dollars an hour in wages frequently costs 45 to 50 once taxes, comp, and benefits are layered in, and using the raw wage is the most common way shops fool themselves into thinking a job was profitable.

The Service Call Scorecard

Pick four numbers to capture on every ticket and you have a scorecard that compounds into real intelligence within a single billing cycle. Name it, post it, and make it non-negotiable for dispatch and field staff. The four are: revenue collected, loaded labor hours, material cost, and a callback flag (did this job require an unbilled return visit within 30 days). Truck cost can be applied automatically as a constant.

Those four inputs let you slice profitability by the dimensions that change decisions: by service type (installs versus repairs versus maintenance), by technician, by lead source, and by time of day. The callback flag is the quiet hero. Callbacks rarely show up as a separate cost anywhere, yet a job with two unbilled return trips can swing from a 40 percent margin to a loss. Tracking the flag turns an invisible leak into a measurable one you can coach against.

A worked example: the emergency call that looked like a win

Consider a 9-truck plumbing shop that prided itself on 24/7 emergency response. The owner assumed after-hours calls were the most profitable work because they billed a premium rate. Putting the Service Call Scorecard on three months of tickets told a different story. (The figures below are an illustrative scenario, not survey data.)

Emergency calls billed at an average of 480 dollars. But the loaded after-hours labor rate ran 1.5 times the day rate, the calls averaged longer drive times to unfamiliar properties, and 1 in 5 generated an unbilled callback because the overnight diagnosis was rushed. The true average margin on emergency work came out near 14 percent. Scheduled repairs, billed lower at 290 dollars, carried a 46 percent margin. The shop did not stop offering emergency service; it raised the after-hours premium, added a 20-minute diagnostic checklist to cut callbacks, and steered marketing spend toward the repair and maintenance work that was actually carrying the company. Within two quarters the blended margin moved several points without adding a single truck.

How to start this week

Take your last 30 completed jobs, fill the four-column scorecard from existing invoices and timesheets, apply one constant truck-roll figure, and sort by margin. The bottom five jobs will teach you more about your pricing than any consultant, and the whole pass takes an afternoon.

Once the manual pass proves the pattern, the question becomes how to keep the number current without re-entering data after every ticket. That is where a purpose-built dashboard earns its keep, pulling closed-job data into live margin views by technician and service type. MyDashBorg builds these for trade shops from a ready-made template so the scorecard updates itself, and the "Ask your data" feature lets an owner type "which technician's jobs had the lowest margin last month" and get an answer in plain language. You can see how that fits your shop on the pricing page.

Per-job profit tracking costs almost nothing to start and changes what you bid, who you dispatch, and where you advertise. Start with the bottom five jobs from last month, and you stop subsidizing your worst work.

Frequently Asked Questions

What is a good profit margin per job for an HVAC business?

There is no single correct figure because installs, repairs, and maintenance plans carry very different margins. As a rough rule of thumb, not an industry standard, many trade shops treat a gross margin in the 40 to 50 percent range on service work as healthy and anything under 30 percent as a warning sign. The more useful target is your own baseline: track every job for one quarter, find your blended average, and work to lift the bottom quartile rather than chasing a benchmark that may not fit your market or mix.

How do I include overhead in per-call profitability?

Keep overhead out of the per-call gross margin and handle it separately. Per-call costing should capture only direct, job-attributable costs (loaded labor, materials, and a truck-roll allocation) so you can compare jobs cleanly. Fixed overhead like office rent, software, and admin salaries is then covered out of the total gross profit across all jobs, which mirrors how IRS Publication 334 frames the split between cost of goods sold and operating expenses. Once you know your blended gross profit, you can check that it comfortably clears your monthly overhead, and if it does not, the per-job report shows you exactly which work to reprice first.

Why does drive time matter when calculating job margin?

Drive time is paid technician labor that produces no billable work, so a job 40 minutes away costs meaningfully more than one next door even at the same ticket price. If you exclude drive time from the labor cost, you systematically overstate the margin on distant calls and make routing and service-area decisions on bad numbers. Including it often reveals that tightening your service radius improves profitability more than raising prices.

Can I track per-job profit margin in a spreadsheet?

Yes, and a four-column spreadsheet (revenue, loaded labor hours, material cost, callback flag) is the right way to validate the method on your last 30 jobs before investing in anything. The limitation is that spreadsheets require manual entry after every ticket and rarely stay current, so most shops that stick with per-job tracking eventually move to a dashboard that pulls closed-job data automatically and updates the margin views in real time.

How often should I review per-call margins?

Review the slice-level numbers (margin by service type, technician, and lead source) at least monthly so pricing and dispatch problems get caught within one billing cycle. Spot-check individual tickets weekly during the first month to confirm your loaded labor rate and truck-roll figure are realistic, since an inaccurate cost assumption will quietly distort every job in the report until you correct it.

Ready to see your margins one call at a time? Explore MyDashBorg's trade-shop templates and start turning service tickets into profit you can act on.

M
MyDashBorg
The MyDashBorg editorial team.

Want a dashboard like this for your team?

We build it for you, from a template, in 5 business days.

Related reading