Home  /  Blog  /  Job Costing
ServiceTitan · Job Costing · Margin

How Do You Know If a ServiceTitan Job Actually Made Money?

Top Builder AI Published August 14, 2026 ~11 min read HVAC · Plumbing · Electrical · Roofing Updated August 14, 2026 (video added)
A contractor reviewing job costing numbers between ServiceTitan and QuickBooks on a laptop

The 44-second version: ServiceTitan's own docs say job costing locks at invoice, and burden rate has to be entered by hand.

Not from the number on your screen while the job is still open. ServiceTitan's own help documentation states its Job Costing tool locks once you post and export the invoice, and the report is built from the invoice, not from individual appointments as the work happens. Until that invoice posts, the margin you're looking at is an estimate, and one of its biggest inputs, labor burden, has to be calculated and typed in by hand per technician or ServiceTitan's own documentation says it shows as zero dollars.

You've probably felt the disconnect already. A job wraps, the crew moves on, and two months later your bookkeeper or your accountant tells you the margin on that "good" job was thinner than it looked, or worse. ServiceTitan's own marketing describes a live dashboard that updates as costs come in. ServiceTitan's own help docs, the pages that describe what the actual tool does, tell a different story. This post walks through exactly where that gap sits, using ServiceTitan's own documentation and the accounting literature on why job margin visibility lags in the trades generally, and what closes it.

Does ServiceTitan's job costing report update in real time?

ServiceTitan's own marketing blog says it does. Its post on real-time job costing describes a dashboard of "total budget, actual cost to date, estimated cost to complete, projected final cost, projected margin," updated "as of the last timesheet entry, material receipt, or invoice posting," and frames the problem it solves in one sharp line: "Month-end job cost reports tell you what went wrong. They don't help you fix it while you still can."

That's the pitch. Here's what ServiceTitan's own help article for the actual Job Costing tool says the tool does: it is "based on the job invoice, not individual appointments," and payroll adjustments made after an invoice is posted and exported do not show on the job costing flyout, because it locks once the invoice is posted and exported. Performance pay, bonus and commission, is explicitly stated to be "only available in job costing after invoices are posted." Two descriptions of the same feature, both from ServiceTitan, and the second one is what the tool does on a Tuesday afternoon while your crew is still on site.

What ServiceTitan saysSourceWhat it actually describes
Live dashboard, updated as costs come inServiceTitan marketing blogA promise, no lock behavior mentioned
Job costing flyout locks once invoice is posted and exportedServiceTitan help docsThe real mechanic of the shipped tool
Performance pay only available after invoicingServiceTitan help docsAnother invoice-gated field

Sources: servicetitan.com/blog/real-time-job-costing and help.servicetitan.com, "Run the Job Costing tool". One-line takeaway: the marketing description and the shipped tool's own documentation don't agree with each other.

What does the invoice lock actually mean while a job is still open?

It means the number on your screen is a snapshot, not a feed. A technician's hours get corrected after the fact, a late material bill comes in, a change order gets added once the invoice already posted, none of it moves the report you already looked at. The report locked the moment the invoice was posted and exported, and ServiceTitan's own documentation is explicit that later payroll adjustments simply do not show up there.

That matters most on the jobs that run longer than a day, the ones where you'd actually want a mid-project check. A quick same-day service call rarely has time to drift. A multi-day install with a change order or two is exactly where the invoice-lock gap does the most damage, because the report you'd want to check while there's still time to catch a problem is the one that hasn't been generated yet.

Does ServiceTitan calculate technician burden rate for you?

No, and this is the single biggest manual step in the whole picture. ServiceTitan's own help article on calculating technician burden rates defines burden as "payroll and overhead costs for technicians," including payroll taxes, insurance, benefits, fuel, and related costs like meals and training. Those are all real, named cost categories. None of them get pulled in automatically. The article's instruction is direct: once you've calculated a technician's burden rate yourself, you can go add it to their profile under Settings, People, Technicians.

What happens if a technician has no burden rate entered
Labor cost shows as $0.00
ServiceTitan's own documentation states that if a technician has no defined hourly rate, labor costs on the job show as zero dollars, not an estimate, not a flag, zero. The job can look more profitable than it is simply because nobody finished the burden-rate setup for that one technician.
Source: help.servicetitan.com, "Calculate technician burden rates" (2026).

Historic burden-rate tracking, keeping a past job's labor cost tied to the burden rate that applied at the time rather than whatever rate is entered today, is a separate, non-default configuration on top of that. A rate change six months ago can quietly rewrite the apparent margin on every older job unless that setting was turned on from the start.

What breaks when you connect ServiceTitan to QuickBooks for job costing?

ServiceTitan's own QuickBooks Online integration guide lists a real chain of setup a contractor has to do before job-cost data lands anywhere useful: create GL accounts in QuickBooks, add account numbers, create chargeable-materials and equipment records, map every pricebook item to a QuickBooks GL account, and, if you want cost broken out by crew or division, create QuickBooks classes and manually map each ServiceTitan business unit to one. The same documentation states plainly that return transactions, inventory adjustments, and batch numbers do not export to QuickBooks Online at all, full stop, not partially.

On the QuickBooks side, Intuit's own support content draws a distinction worth knowing: Projects is QuickBooks Online's real job-level profit-and-loss tool, while class tracking is a simple tag, not a cost ledger, and there is no built-in tool to convert class-tracked data into a Project after the fact. A lot of contractors "doing job costing in QuickBooks" are actually using classes, a workaround, not the tool built for the job.

None of this is unique to any one contractor's setup. Multiple dated Capterra reviewers of ServiceTitan describe the same friction in their own words: one 2022 reviewer wrote of "3 failed attempts at merging with my quickbooks data base," another described "the background coding job from ST was not done well," and a 2018 reviewer called the QuickBooks bridge "a little clunky" with "holes in the reporting, especially projects." Individual reviews aren't a formal study, and dates matter, but they corroborate the same pattern the official docs describe: the sync needs real setup, and gaps in that setup show up as job-cost gaps.

What is the difference between committed costs and actual costs in ServiceTitan?

ServiceTitan's own Job Costing tool separates committed costs, purchase orders that are approved but not yet received or billed, from actual costs, costs that have actually landed. A job can look healthy mid-project purely because a real, already-incurred expense is still sitting as committed rather than actual, and it only shows up as a margin hit once that PO finally gets billed, which by ServiceTitan's own workflow description can happen well after the crew has left the site.

That's not a flaw exactly, it's a real accounting distinction most systems make. But it means "committed" and "actual" both have to be checked together to get an honest read on where a job stands, and the invoice-locked report only ever shows you the picture as of the last invoice, not the committed costs still sitting in the pipeline.

Is job-cost lag a documented problem outside ServiceTitan, or just a ServiceTitan issue?

It's documented broadly in construction accounting under a specific name: profit fade. Kittell Branagan and Sargent, a Vermont construction-accounting CPA firm, puts it plainly: "Construction projects rarely become unprofitable overnight," and "waiting until year-end to review profitability often means valuable opportunities for corrective action have already passed," which is why they recommend monthly WIP reviews specifically because standard reporting cadence runs too slow to catch fade in time. Doeren Mayhew, a national CPA and advisory firm, names faulty job costing as one of five recognized causes of profit fade, alongside inaccurate estimating and poor project management.

That's the honest context: this isn't a ServiceTitan defect specifically, it's an accounting pattern across the trades that a ServiceTitan-plus-QuickBooks setup doesn't automatically fix, because both systems, by their own documentation, are still built around a report that closes after the fact rather than a number that's trustworthy while the job is still open.

Are there other tools built specifically to solve real-time job profitability?

Yes, and their existence is itself proof the gap is real enough to build a company around. Knowify and Werx both market themselves as QuickBooks Online companions purpose-built for construction job costing, with Werx's own site promising a margin figure that's "always current, per project and across the company," language aimed directly at the lag problem. Dapt, a QuickBooks add-on, states outright that standard QuickBooks "operates as a post-project analysis tool rather than a real-time management system." None of these plug natively into ServiceTitan, so adopting one means running a second system alongside your field platform, not inside it.

What does this look like on one real job?

The example below is illustrative, built to show the mechanism, not a client result.

Illustrative walkthrough: one $12,000 HVAC replacement, mid-project
What the job screen shows today
Contract price$12,000
Raw technician wages logged$4,100
Materials logged$3,800
Burden rate entered for this technicianNot entered
What's actually sitting off-screen
Labor cost as shown (no burden rate)Undercounted
Change-order ductwork, approved POCommitted, not yet actual
What both gaps close to once invoicedThinner margin than the screen shows today
Same job, same numbers on screen, different reality once the burden rate gets entered and the change order finally bills. Neither gap is visible from the mid-project job screen alone.

How does Top Builder AI close this gap?

The Pricebook and Financial agents pull ServiceTitan's committed costs, actual costs, and technician pay data alongside QuickBooks, recompute a job's real margin using an entered or a reasonable estimated burden rate rather than waiting for someone to finish typing every technician's rate in by hand, and flag when a job's projected margin has moved past a set tolerance while the job is still open, not after the invoice locks the report.

1
Pull committed and actual costs together Both cost states from ServiceTitan's own job costing data, read side by side instead of only seeing whichever one has posted so far.
2
Recompute labor with burden Uses an entered burden rate where one exists, or a reasonable configured default where it doesn't, instead of letting missing data show as zero.
3
Cross-reference QuickBooks Reconciles against the mapped GL accounts and classes already set up, the same mapping ServiceTitan's own integration guide requires, without adding a second manual entry step.
4
Flag margin drift past tolerance A job trending below its expected margin gets flagged for review while the crew is still on site, not two months later.
5
A human decides the next move The agent never edits a ServiceTitan job cost record or a QuickBooks entry. It surfaces the number and the reason; a person acts on it.

Does this replace ServiceTitan's job costing or QuickBooks?

No. ServiceTitan stays the system of record for the job, the invoice, and the pricebook. QuickBooks stays the system of record for the books. Nothing about either changes. The agent reads what both systems already have, recomputes the margin using the real cost categories ServiceTitan itself defines, burden, committed versus actual, and surfaces a projected number while the job is still open, closer to what ServiceTitan's own marketing promises than what its own help docs currently deliver on their own.

  • No edited records. ServiceTitan's job cost data and QuickBooks entries stay exactly as your team enters them.
  • No invented numbers. Committed costs, actual costs, and burden all come from your real data or a burden default you configure, never a guess presented as fact.
  • No blind self-serve signup. Delivered as part of a Teardown and Install, configured against your actual ServiceTitan and QuickBooks data.
  • Connects to the rest of the back office. Pricebook, the Financial agent, and Workforce's labor-hour reconciliation all draw from the same underlying job data, so a margin flag and a labor flag on the same job tell a consistent story.

Check your own burden-rate setup this week

Open Settings, People, Technicians and see how many of your techs actually have a burden rate entered. A fit call walks through what a full margin recompute finds against your real ServiceTitan and QuickBooks data.

Book a fit call →

Frequently asked questions

How do you know if a ServiceTitan job actually made money?
Not from the number on your screen while the job is still open. ServiceTitan's own help documentation states its Job Costing tool locks once you post and export the invoice, and it is built from the invoice, not from individual appointments as the job runs. Until that invoice posts, what you are looking at is an estimate, not a closed answer, and one of the biggest inputs, labor burden, has to be calculated and typed in by hand per technician or it silently shows as zero.
Does ServiceTitan's job costing report update in real time?
ServiceTitan's own marketing blog says yes: a dashboard of total budget, actual cost to date, and projected margin, updated as of the last timesheet entry, material receipt, or invoice posting. ServiceTitan's own help documentation for the actual Job Costing tool says something different: the report locks once you post and export the invoice, and performance pay only becomes available in job costing after invoices are posted. Those are two different descriptions of the same product from ServiceTitan itself, and the help doc is the one describing what the tool actually does day to day.
What does the invoice lock actually mean while a job is still open?
ServiceTitan's own documentation states payroll adjustments made after the invoice posts and exports do not show on the job costing flyout, because it locks at that point. So a correction to a technician's hours, a late material receipt, or a change order added after invoicing will not move the number you already saw. The report is a snapshot taken at invoice time, not a live feed that keeps updating as new information comes in.
Does ServiceTitan calculate technician burden rate for you?
No. ServiceTitan's own help article on calculating technician burden rates states the rate has to be calculated and then manually entered into each technician's profile under Settings, People, Technicians. Burden includes payroll taxes, insurance, benefits, fuel, and related costs like meals and training, all real cost categories ServiceTitan names, but none of them get pulled in automatically. If a technician has no burden rate entered, ServiceTitan's own documentation states labor costs show as zero dollars on that job.
What breaks when you connect ServiceTitan to QuickBooks for job costing?
ServiceTitan's own QuickBooks Online integration guide lists a chain of one-time and ongoing manual setup a contractor has to do before job-cost data lands correctly: creating GL accounts, mapping every pricebook item to a QuickBooks account, setting up QuickBooks classes and mapping each business unit to one, and mapping tax zones. The same documentation states plainly that return transactions, inventory adjustments, and batch numbers do not export to QuickBooks Online at all. On the QuickBooks side, Intuit's own support content distinguishes Projects, its real job-level profit and loss tool, from class tracking, a simple tag, and there is no built-in tool to convert class-tracked data into a Project after the fact.
What is the difference between committed costs and actual costs in ServiceTitan?
ServiceTitan's own job costing tool separates committed costs, meaning purchase orders that are approved but not yet received or billed, from actual costs, meaning costs that have actually been received or billed. A job can look profitable mid-project because a real expense is still sitting as committed rather than actual, and only shows up as a margin hit once the PO is finally billed, which by ServiceTitan's own description can be well after the crew has left the site.
Is job-cost lag a documented problem outside ServiceTitan, or just a ServiceTitan issue?
It is documented broadly in construction accounting as profit fade. Kittell Branagan and Sargent, a construction-focused CPA firm, writes that projects rarely become unprofitable overnight and that waiting until year-end to review profitability means the window for corrective action has already closed, which is why they recommend monthly WIP reviews. Doeren Mayhew, a national CPA and advisory firm, names faulty job costing as one of five recognized causes of profit fade. This is an industry-wide accounting pattern that a ServiceTitan and QuickBooks connection alone does not automatically solve, because the underlying reports on both sides are still built to close after the fact, not to watch a job live.
Are there other tools built specifically to solve real-time job profitability?
Yes, and their existence is itself evidence the gap is real. Knowify and Werx both market themselves as QuickBooks Online companions built specifically for construction job costing, with Werx explicitly promising a margin figure that stays current per project rather than one that surfaces at year-end. Dapt, a QuickBooks add-on, states plainly that standard QuickBooks operates as a post-project analysis tool rather than a real-time management system. None of these are ServiceTitan-native, so a ServiceTitan shop adopting one still runs a second system alongside its field platform.
What does this look like on one real job?
This example is illustrative, not a client result. A $12,000 HVAC replacement shows $4,100 in raw technician wages and $3,800 in materials on the job screen mid-project. The crew's burden rate, payroll tax, workers comp, and benefits, was never entered for that technician, so labor cost is undercounted until someone calculates and types it in by hand. A change order for extra ductwork sits as a committed cost, an approved PO, rather than an actual cost, so it has not hit the margin number yet. The job looks healthier on the screen than it will look once the invoice finally posts and both gaps close at once.
How does Top Builder AI close this gap?
The Pricebook and Financial agents pull ServiceTitan's committed costs, actual costs, and technician pay data alongside QuickBooks, recompute a job's real margin using an entered or estimated burden rate rather than waiting for someone to type one in, and flag when a job's projected margin has moved past a set tolerance while the job is still open, not after the invoice locks the report. It never edits a ServiceTitan job cost record or a QuickBooks entry. It surfaces the number and the reason, and a person decides what to do next.
Does this replace ServiceTitan's job costing or QuickBooks?
No. ServiceTitan stays the system of record for the job, the invoice, and the pricebook, and QuickBooks stays the system of record for the books. Nothing about that changes. The agent reads what both systems already have, recomputes the margin using the real cost categories ServiceTitan itself defines, burden, committed versus actual, and surfaces a projected number while the job is still open, closer to what ServiceTitan's own marketing describes than what its own help docs currently deliver.
Is this a live, self-serve product I can connect today?
The margin recomputation logic is real, built and tested code in the Pricebook and Financial agents. It is delivered today as part of a Teardown and Install engagement, configured against your actual ServiceTitan pricebook, job cost, and QuickBooks data, not as a blind self-serve signup.
What's the fastest way to check if this is happening in my shop?
Open ServiceTitan's Job Costing tool on three jobs still in progress and check two things: whether every technician on those jobs has a burden rate entered under Settings, People, Technicians, and how many line items on each job are still sitting as committed rather than actual costs. Most shops running this check for the first time find at least one technician with no burden rate entered anywhere. A fit call walks through what that same check finds against your real ServiceTitan data.