Make the job the unit of record
A busy month can still lose money. Many HVAC shops with three to ten trucks know revenue to the dollar and learn their margin weeks later, at month-end close. By then nobody remembers why a changeout ran six hours long, who approved the new disconnect, or which van the extra line set came from. Job costing answers those questions while the job is still open.
This guide is for owners and service managers who want estimated versus actual cost on every install and repair—and to stop doing extra work that never reaches an invoice. TwoQM develops custom software, connected systems, automation, AI integrations, and CRM workflows for contractors whose current tools do not hold that picture together.
Every cost should land on a job. A useful job record carries:
The estimate as a budget. Equipment, materials, labor hours, permits and disposal, and any subcontracted work, each on its own line.
A short list of cost codes. Equipment, materials, labor, subs, permits and fees, change orders. Six codes technicians actually use beat forty nobody picks correctly.
A burdened labor rate. Wages plus payroll taxes, benefits, and paid time off.
Every purchase, time entry, and change order tagged to that job number.
The IRS notes that good records help you monitor the progress of your business, and that purchases, sales, and payroll generate supporting documents you record in your books. A job-tagged supply-house invoice is one of those documents, filed where it can tell you something.
The math on one changeout
Here is an original illustration with round numbers, not a TwoQM client and not a measured result. A shop sells a system replacement for $11,800.
Estimated cost: equipment $5,600, materials $900, labor 16 hours at a $55 burdened rate ($880), permit and disposal $250. Total $7,630, for an estimated gross margin of $4,170, about 35%.
What happened: the crew found the existing line set unusable and replaced it with $340 in extra material. Nobody wrote a change order. They also replaced a corroded disconnect; that one was approved and billed at $420, with $180 in parts. Labor came to 22 hours, including the hour on the disconnect.
Actual cost: $5,600 + $900 + $340 + $180 + $1,210 labor + $250 = $8,480. Revenue: $11,800 + $420 = $12,220. Gross margin: $3,740, about 31%.
The job still made money, but it lost nearly five margin points, mostly to work the customer never saw a price for. The only record was a technician's memory. Multiply that by a season of changeouts.
A change order is a record, not a conversation
Field changes are normal; unrecorded ones are the problem. A change-order record should hold:
What changed and why, with a photo of the condition.
The price and its effect on the job budget, so the estimate updates instead of drifting.
Who approved it, when, and how—a tablet signature, an approval-link reply, or a logged phone call.
A status: proposed, approved, declined, completed, invoiced.
A rule for when work may start. Above an amount you set, the crew waits for a recorded approval.
Declined change orders matter too: they are useful history when the customer calls next summer.
Where costs leak in a multi-truck shop
Truck stock pulled without a job number. Fittings, capacitors, and refrigerant leave the van and land on no job.
Time coded to "shop." Drive time, supply-house runs, and return trips belong to the job that caused them.
Callbacks and warranty visits opened as new jobs, hiding the true cost of the original install.
Permit and disposal fees paid on an owner's card and entered at month-end without a job reference.
A weekly fifteen-minute review
Review four lists: open jobs over their labor budget, change orders proposed but not approved, purchases with no job number, and completed jobs not yet invoiced. Each list should name an owner and a next step. Fix jobs while they are still running.
What to automate, and where AI helps
Conventional business automation handles the rules: block a job from closing while a change order is still "proposed," match supply-house invoices to jobs by purchase-order number, alert the service manager when labor passes 80% of budget, and send the customer an approval link when a change order is written.
AI helps with messy input, with a person reviewing the result. It can read a supply-house invoice PDF and suggest which job each unmatched line belongs to, or turn a technician's voice note—"line set's kinked behind the drywall, recommend new run, about 25 feet"—into a draft change-order description. It should not set prices, approve work, or post costs on its own. AI integrations at TwoQM start with the task, the data it may use, and who signs off.
Connect first, build where it breaks
If your field service platform and accounting software already support jobs and cost codes, connect those systems so purchases, time, and change orders reach the same job number without retyping. Custom software earns its place when the gap is specific to how you run trucks: a customer approval page that shows photos and the revised total, truck-stock tracking tied to jobs, or a margin-by-job dashboard managers open every week. You can also see how we approach technology for contractors and home services.
Tell us what you need built
Bring one recent job where the margin surprised you and a list of the tools your team uses. Then tell us what you need built. TwoQM is based in Brownsville, Texas, and works with businesses nationwide, in English and Spanish. We will tell you whether a connection between your current tools, a few automations, or a focused custom piece fits—and what it will not do. An inquiry is not a quote, and it is not a claim that a system is already built.

