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
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 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.
| Dimension | Service job costing — where Opsler works | Construction project costing |
|---|---|---|
| Unit of work | One visit, one invoice, usually closed the same day | A project running weeks or months across phases |
| Cost capture | Work-timer hours and parts consumed on the visit | Cost codes, committed costs, subcontractor draws |
| Revenue recognition | The invoice total once the job is closed | Percentage of completion, schedules of value, retainage |
| Billing | Invoiced in full at completion | Progress billing against milestones |
| Setup before it works | A cost price on your parts and an hourly rate on your people | A cost-code structure and a burden model built first |
| Time to a profit number | The evening the job closes | After 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
- Pricebook service. The job starts from a catalog service at its list price, so nobody invents a figure on the driveway.
- Parts added on site. Each inventory line carries a selling price and, behind it, your cost price.
- Labor and extras. Line types are Service, Part, Labor or Custom — which is how revenue splits apart later, without anyone tagging anything.
- Approval, then close. The technician sends it, or the office queue holds it for a check first. Your setting, your call.
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 input | Where it lives | What it holds |
|---|---|---|
| Quoted price | Estimate line items | Description, quantity, unit price, line total, per-line tax |
| Planned parts | Estimate lines drawn from the pricebook | Part, SKU and quantity, at the price you sell them for |
| Planned labor time | Estimated duration on the job | Minutes, usually inherited from the catalog service |
| Tier chosen | Good, Better or Best on the estimate | Which 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.
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 2Condenser 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.
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.
| Comparison | Planned side | Actual side | What a gap usually means |
|---|---|---|---|
| Revenue | Approved estimate total | Final invoice total | A discount given on site, or a line dropped to close the sale |
| Labor | Estimated duration in minutes | Logged work time, pauses excluded | A job type that is priced on optimism, or access nobody warned about |
| Parts | Part lines on the estimate | Materials Used entries and their cost | A 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
| Technician | Jobs | Hours | Revenue | Rev/Hour |
|---|---|---|---|---|
| D. Okafor | 24 | 61.5 | $12,140 | $197 |
| M. Reyes | 21 | 68.0 | $10,930 | $161 |
| T. Brandt | 18 | 54.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 worksJob 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.
Related Features
Multi-Location Inventory
Where part cost comes from
Automated Time Tracking
Work and pause intervals
QuickBooks and Xero Export
CSV out to your ledger
Estimate to Job
The quoted side of the comparison
Automated Invoicing
Where job revenue is set
Revenue Dashboard
Period totals and exports
Technician Efficiency
Hours, revenue and revenue per hour
Pricing
What Pro adds to job costing
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.