Job costing

Job Costing Software That Shows Profit on Every Service Job

Busiest month of the year, and the bank balance disagreed. Every contractor has had that month. A full schedule tells you nothing about which of that work paid, and the invoice total is only half the arithmetic — Opsler keeps the other half, job by job, and hands you the margin the evening the work closes.

Most job costing software chasing this search was built for construction: cost codes, phases, work in progress. Opsler was built for the other kind of contractor — HVAC, plumbing, electrical, appliance repair, pest control. One visit, one invoice, and a straight answer about what it cost you to earn it.

$25 per seat per month, no seat minimum, no card to start.

Sample figures — Gross Field Profit card

$18,24061.4% margin

Net earnings, this period

Total revenue
$29,710
Labor cost
$6,845
Material cost
$4,625
Average ticket size
$472
Jobs closed
63

Illustrative numbers, on the card every plan gets — including the free one.

The per-job breakdown behind the aggregate figure above — labor, materials and margin, on the job record itself.

Quick answer and job-costing formula

Opsler costs a job from two things it already captured while the work was happening: the hours your technician logged, and the parts they used. Set those against the invoice and you get a figure the product calls Gross Field Profit, with its margin beside it. Here is the job costing formula, in full.

Invoice totalLabor costMaterial cost=Gross field profit

Invoice total

The total on the job’s invoice once the job is closed. One invoice per job, so there is one number to agree on.

Labor cost

Logged work hours × the Hourly Rate on the technician’s record. Pause time stays out of it.

Material cost

Materials Used entries × your own cost price, not the price the customer paid.

Why this particular number is useful

Gross field profit is what a job left you after the two costs the job itself created. Every job is measured the same way, from data the work produced rather than data somebody typed in afterwards, which is what makes the comparison between two job types or two technicians worth acting on. Get twenty jobs into it and the pattern is usually a job type you have been pricing on habit — the sort of thing that pays for the software several times over the month you fix it.

Service job costing vs construction project costing

Search for job costing for contractors and most of what comes back was designed for people who build things over months. Those products are good at what they do, and they are the wrong shape for a two-hour drain call. The difference is not depth, it is the unit of work — which is why job costing software for contractors splits into two families that share a category name and almost nothing else.

DimensionService job costing — where Opsler worksConstruction project costing
Unit of workOne visit, one invoice, usually closed the same dayA project running weeks or months across phases
Cost captureWork-timer hours and parts consumed on the visitCost codes, committed costs, subcontractor draws
Revenue recognitionThe invoice total once the job is closedPercentage of completion, schedules of value, retainage
BillingInvoiced in full at completionProgress billing against milestones
Setup before it worksA cost price on your parts and an hourly rate on your peopleA cost-code structure and a burden model built first
Time to a profit numberThe evening the job closesAfter the month-end close

If your week is service calls, maintenance visits and small replacements, the middle column is your world and Opsler was built inside it. You will have a costed job the evening it closes rather than a picture of the quarter in the second week of the next one — which is early enough to change what you charge for the same job tomorrow.

Where job revenue comes from

Job revenue is the invoice. One job, one invoice, built during the visit by the person who did the work, and its total is the revenue side of the formula. That single rule is why two people looking at the same job in Opsler see the same number.

How the invoice gets built

  1. Pricebook service. The job starts from a catalog service at its list price, so nobody invents a figure on the driveway.
  2. Parts added on site. Each inventory line carries a selling price and, behind it, your cost price.
  3. Labor and extras. Line types are Service, Part, Labor or Custom — which is how revenue splits apart later, without anyone tagging anything.
  4. Approval, then close. The technician sends it, or the office queue holds it for a check first. Your setting, your call.
How the invoice approval queue works

What keeps the revenue figure clean

  • Every completed, invoiced job counts once, on its completion date
  • Void an invoice and it drops straight out of the totals, so a typo never inflates a month
  • Warranty work counts at what it earned and carries its full cost, so you can see exactly what going back costs you
  • Revenue is what you billed; the Pending Amount card tracks separately what has yet to land
  • Sales tax collected on the job sits inside the invoice total, the same way it does on the invoice itself

Estimated labor and parts

The plan side comes free with the way you already sell. An estimated job cost in Opsler is read straight off what you quoted and how long you said the work would take — there is no separate cost budget for anyone to fill in before the van leaves, and no second system to keep in step with the first.

Planned inputWhere it livesWhat it holds
Quoted priceEstimate line itemsDescription, quantity, unit price, line total, per-line tax
Planned partsEstimate lines drawn from the pricebookPart, SKU and quantity, at the price you sell them for
Planned labor timeEstimated duration on the jobMinutes, usually inherited from the catalog service
Tier chosenGood, Better or Best on the estimateWhich package the customer approved, and its total

Four fields you already fill in to win the work, doing a second job as the planned side of every comparison in this page. The last row earns its keep on its own: knowing which of Good, Better and Best your customers actually approve is how you find out your middle option is priced too close to the top one. How an approved estimate becomes a scheduled job.

Actual labor from technician time

Labor cost tracking in Opsler starts when your technician taps Work on the job, not when dispatch pencilled in two hours. That distinction is the whole point: scheduled time flatters every estimate anybody has ever written, and logged time tells you which of your job types has been running long since spring.

One visit, as recorded

  • 09:12WorkOn site, diagnosis begins
  • 10:04PauseParts run — reason logged
  • 10:29WorkMotor swapped and tested
  • 11:57CompletePhotos, signature, invoice

Work time

2h 20m — billable

Pause time

25m — non-billable

Pause reasons are recorded, not guessed

Parts run, lunch break, waiting for the customer, or other with a note the technician has to write. Read a quarter of those and they will tell you as much as the margins do — usually that one supplier is costing you an hour a week.

The rate is per person

Each team member carries an Hourly Rate, described in the app as the figure used for profit and revenue calculations. Put two technicians on one job and each is costed at their own rate, so an apprentice-plus-lead day prices correctly.

Bad timer data can be corrected

An admin sets the corrected worked time on the job, the per-technician split scales to match, and the original stays visible struck through with a correction badge. The corrected figure is what the profit calculation uses, so one forgotten timer never poisons a month.

Hours arrive already attached to the work

Nobody fills in a timesheet on a Friday afternoon, and the same intervals feed both payroll hours and job cost. Work timers come with Pro, at $25 per seat per month.

More on automated time tracking

Actual parts from inventory

Material cost tracking runs through a panel on the job called Materials Used. It is an internal record: your customer never sees what you paid, and it sits deliberately apart from the lines you bill. That separation is what lets a part be costed even when it was never charged for — which is how warranty work stops hiding.

Materials Used

From: Van 2

Condenser fan motor 1/3 HP

MOT-133 · qty 1

$138.00

Run capacitor 45/5 MFD

CAP-455 · qty 2

$34.00

Total material cost

$172.00

Internal cost record. Sample figures.

Cost price, not the price you charged

Each entry carries the part, SKU, quantity, unit cost, total cost and the van or warehouse it came off. The unit cost is the cost price on your catalog record, so your margin moves the day your supplier's does.

It can mirror the invoice for you

On a custom job, ticking Same as items keeps Materials Used in step with the inventory lines on the invoice automatically. Labor, service and custom lines stay out, because they are not parts off a shelf.

Warranty parts still get costed

A part fitted under warranty lands in Materials Used even though the customer paid nothing, which is why warranty work shows up on the dashboard as absorbed cost instead of quietly disappearing into a good month.

Stock moves on its own at close

Closing the job deducts billed parts from the invoice's inventory location and writes the stock movement against that job. Cost and stock are handled separately, so a pricebook job with parts included in the price still gets costed properly.

Parts inventory across vans, trucks and warehouses

Other supported direct costs

Direct job costs in Opsler are the two the job itself creates: the labor that went into it and the materials that came out of the van. That is a deliberate choice, and it is the reason this works for a service business on a Tuesday instead of becoming a project you never finish configuring.

Costed against every job

  • Technician labor — logged work hours at each person's own hourly rate
  • Materials — Materials Used entries at your catalog cost price

Two inputs, applied identically to every job you close. That consistency is what makes the comparison between jobs worth something.

What that buys you

  • Two fields to fill in before it works: a cost price on your parts, an hourly rate on your people
  • A margin on the first job you close, not after a cost-code structure is designed
  • Numbers that come from the work itself, so nobody has to remember to code anything
  • One method across every job, every month and every technician, which is what makes a trend a trend

The fully loaded, every-cost-in version of the number belongs in your accounting software, and Opsler feeds it: the CSV export hands your bookkeeper the invoices and payments behind each of these margins. Most owners already know roughly what their own overhead multiplier is — apply it to the gross margin here and you have a working answer this afternoon, with the rigorous one arriving at month end.

Estimate vs actual

Three comparisons decide whether a service job was priced right, and Opsler keeps both sides of all three on the job record where you can put them next to each other. Two numbers, one glance, and you know whether the problem was the price, the time or the parts.

ComparisonPlanned sideActual sideWhat a gap usually means
RevenueApproved estimate totalFinal invoice totalA discount given on site, or a line dropped to close the sale
LaborEstimated duration in minutesLogged work time, pauses excludedA job type that is priced on optimism, or access nobody warned about
PartsPart lines on the estimateMaterials Used entries and their costA second failure found on site, or a catalog cost that has drifted

Read the result as a pricing signal, because that is where the money is. When the same job type runs long three months running, the fix is in the price book rather than in the technician — and a price book you can edit in an afternoon is a faster route to margin than any report ever written.

Live and completed job profitability

Timing matters here, and most vendors stay vague about it. In Opsler’s field service job costing, a job joins the job profitability figures the moment it is marked complete with its invoice attached — same day, not next quarter. Until then you watch the inputs build.

While the job is open

Work time accumulates on the job as the technician runs the timer, and the Materials Used panel keeps a running dollar total of what has come off the van. You can see a job getting expensive while there is still time to say something about it.

At completion

Photos, signature and the invoice close the record, and job value appears as Total Charges on the job. From that moment it counts toward the period figures — nobody exports anything to make it happen.

On the dashboard

Pick a range — last 3, 6 or 12 months, or a custom window — and every completed, invoiced job whose completion date falls inside it is recalculated. Change the range and the answer follows immediately.

Revenue dashboard, with sample figures

Total Revenue

$29,710

This period · 63 jobs

Gross Field Profit

$18,240

Net earnings · 61.4% margin

Pending Amount

$4,180

Awaiting payment

Average Ticket Size

$472

Per job · labor $6.8k · materials $4.6k

A profit analysis chart underneath splits the same period’s revenue into labor cost, material cost and gross profit — the whole business in one bar. If you do warranty work, a separate card carries the absorbed cost of warranty claims broken into labor and materials, which is the money you spent going back and the number most contractors have never seen.

Compare jobs, services and technicians

Field service profitability earns its keep the moment you can slice it, which is where job profitability software either changes how you sell or gathers dust. Here is what Opsler groups for you, and every one of these views is a click rather than a request to somebody in an office.

Technician EfficiencyPro

TechnicianJobsHoursRevenueRev/Hour
D. Okafor2461.5$12,140$197
M. Reyes2168.0$10,930$161
T. Brandt1854.2$6,640$122

Sample figures. On a two-technician job the invoice value splits evenly between them, so read revenue per hour as a trend rather than a scoreboard.

By technician

Jobs completed, hours logged, revenue attributed and revenue per hour, ranked, with badges on the top three. The gap between your best and your third is usually a training conversation, and now you can have it with numbers on the table. Pro.

By month

A monthly table of revenue, paid, pending, invoice counts and tax, exportable to CSV or Excel with revenue already split into parts, labor, service and custom columns. Twelve months of that is a pricing strategy.

By estimate tier

Which of Good, Better and Best your customers actually approve, with the revenue behind each. Contractors who watch this number usually reprice the middle tier within a quarter.

By service type

Job lists filter by service type, and the monthly export already carries revenue split by line type — so the per-service view you want is a filter and a column away, in the spreadsheet you were going to open anyway.

Job by job

Every completed job carries its own revenue, labor and material figures, so the one that felt wrong can be opened and read line by line rather than argued about from memory.

HVAC example

HVAC job costing lands better on one call than in the abstract. A rooftop unit at a strip mall stops cooling in August: one technician, one afternoon, one invoice. Every number below is a worked example rather than a customer figure, and every one of them comes from data the visit produced on its own.

What the customer paid

Diagnostic call$129.00
Condenser fan motor 1/3 HP$310.00
Run capacitor 45/5 MFD × 2$85.00
Labor, 2.5 hrs billed$312.50
Sales tax at 8.25%$69.01
Invoice total$905.51

What it cost you

Fan motor, cost price$138.00
Capacitors × 2, cost price$34.00
Work time 2h 45m at $34.00/hr$93.50
Pause 25m, parts run — excluded$0.00
Total direct cost$265.50
Gross field profit$640.01 · 70.7%

How to read that 70.7%

Revenue here is the invoice total, so the $69.01 of sales tax is sitting inside it; on the tax-exclusive figure the same job runs 68.3%. Take your own overhead multiplier off that and you have your working answer, with your accountant producing the rigorous one from the data this export hands them. What the 70.7% is genuinely good for is the comparison — run it across forty motor swaps and you will know inside a month whether your diagnostic fee is priced where it should be. That is one decision, worth considerably more than a year of software.

Accounting connection, limits and FAQs

Opsler measures the operational half of the business — what each job earned and what it consumed. Your accounting software carries the ledger, and the two are joined by a file you control. Invoices and payments export as a QuickBooks-formatted or Xero-formatted CSV that somebody downloads and imports, which means your bookkeeper sees every batch before it reaches the books and there is nothing to re-authorise the week an update lands.

How the QuickBooks and Xero CSV export works
Invoices and payments in a QuickBooks-formatted or Xero-formatted CSV, plus a plain CSV for anything else.
The monthly revenue table — revenue, paid, pending, invoice counts and tax — exportable to CSV or Excel.
Revenue already split into parts, labor, service and custom columns, so the pivot table takes a minute.
Job-level labor and material cost your ledger never sees, ready for the overhead multiplier you apply.
Filtered by date and status, previewed before download, imported whenever it suits your month end.
One number your accountant and your dispatcher can both point at, which is rarer than it sounds.

Job costing FAQs

Gross field profit equals the invoice total minus direct labor cost minus material cost. Labor cost is the hours your technician logged on site multiplied by the hourly rate on their record. Material cost is the Materials Used entries on the job, valued at the price you paid for the parts rather than the price the customer paid. Two inputs, one formula, applied the same way to every job you close.

The two costs the job itself created: the hours your technician logged, priced at their own hourly rate, and the parts that came off the van, priced at your cost. Set against the invoice total, that gives gross field profit and its margin percentage on the dashboard. Because the method never changes, the gap between two job types — or two technicians — is a real difference you can act on rather than an artefact of how somebody chose to split the rent that month.

From the work timer your technician runs on site, which is the only version of the truth worth costing. Work and pause intervals are recorded separately, so a twenty-minute parts run is logged as a pause with its reason and stays out of the labor cost. The hours are multiplied by the Hourly Rate on that team member's record, so two people on one job are each costed at their own rate. Work timers come with Pro.

From the cost price on your own catalog record. When a part goes into Materials Used on a job it carries that cost price, the quantity and the van or warehouse it came off. Materials Used is an internal cost record, so the customer never sees your buying price, and it sits separately from the stock deduction that fires when the job closes. Keep your catalog cost prices current and every margin on the dashboard stays honest.

Yes. Opsler keeps both sides on the job: the quoted total on the estimate and the estimated duration on one side, the logged work hours, the Materials Used cost and the final invoice total on the other. Read them together and you learn which job types you price on optimism and which parts have quietly gone up since you last looked at the catalog. That is a pricing decision, and it is worth more to a service business than a cost-code report ever was.

Yes. The revenue dashboard and the Gross Field Profit card are on every plan, free one included, so two people can start costing jobs on revenue and parts without paying anything. Pro adds the work timers that put labor into the calculation and the per-technician efficiency table, at $25 per seat per month with no seat minimum and a 14-day trial that never asks for a card.

Four things, in this order. Labor cost taken from what the technician actually logged rather than what dispatch scheduled. Part cost taken from your own purchase price rather than the line on the invoice. A margin figure calculated identically on every job, so comparing two of them means something. And a clean export into your accounting software for the rigorous, fully burdened version of the number. Job costing software that gets those four right will show you your worst job type inside a month.

Cost twenty jobs and see what you find

Put a cost price on your catalog, an hourly rate on each technician, and let the timers run for a fortnight. The pattern that turns up is almost never the one owners expect, and a 14-day trial is long enough to see it clearly.

$25 per seat per month, no seat minimum, no card to start. Budding stays free forever — 2 seats (1 admin and 1 technician), 50 jobs a month.

View as plain text

Ready to Run Your Business Without the Chaos?

Scheduling, dispatch, estimates, invoicing, customer portal, and a free branded website — start completely free, upgrade to Pro when you scale.

Free forever on the Budding plan. No credit card required.

Explore all 42 features·See full pricing