Profit & Grit CFOs

Table of Contents

Profit & Grit Podcast

The Home Service Podcast for Trades Entrepreneurs​

Share this article

How to Get Accurate Job Costing Out of ServiceTitan

Tyler Martin, CPA and fractional CFO

Tyler Martin

Tyler Martin, CPA is a fractional CFO for home service companies and the founder of Profit & Grit CFOs.

He built and sold a CPA firm, then built an engineering services company to $25 million in annual revenue before selling it. He hosts Profit & Grit podcast.

More about Tyler →

12 min read

Accurate ServiceTitan Job Costing

Her words were simple enough: install hides so much.

The company was profitable. Every month the statement showed a number she was reasonably happy with. What it did not show was that one department was carrying the other, and had been for years, because service pricing had not been touched since before COVID.

Once she separated the classes and matched them to her ServiceTitan business units, the picture arrived immediately. She adjusted pricing, and in her words, everything started turning around.

That is what job costing buys you. Not tidier books. The ability to see which work is worth doing.

ServiceTitan can give you that, and most companies running it are not getting it. Here is how to fix that.

The two layers people mix up

Before any settings, the distinction that causes most of the confusion.

LayerWhat it gives youWhere it lives
Job costingMargin on an individual job. What this install actually cost you in labor, material and subs.ServiceTitan
Departmental P&LMargin by department. Whether service, install or maintenance made money this month.QuickBooks, via business unit to class mapping

These are not substitutes for each other, and companies routinely build one while believing they have both.

Mapping your business units to QuickBooks classes gives you a departmental P&L. It tells you service lost money in August. It does not tell you which service jobs lost money, or why. That answer only exists if costs are attached to jobs inside ServiceTitan.

Going the other way, perfect job costing with no class mapping means you can see individual jobs and cannot produce a departmental statement your accountant will accept.

You want both, and they are built differently. The rest of this covers the job costing side. The class mapping side is in why ServiceTitan and QuickBooks stop matching.

Labor, and the burden field that is almost always wrong

Labor is where job costing breaks first, and there is one specific setting responsible for a large share of it.

When payroll is enabled, the burden field takes the amount over and above gross hourly pay. Not the combined rate.

I opened a file where a technician showed a burden rate of $54.60. That was his loaded cost, wage included. ServiceTitan was then adding it on top of the wage it already had, so every job that technician touched was costed at nearly double his true cost.

Check that field today. If the number in it looks like something you could pay somebody, it is wrong. It should look like the extra: payroll taxes, workers comp, benefits, the truck. The gap, not the total.

A few other labor settings that matter:

  • Enable payroll for time and material work. Without it, job timesheets exist and payroll never reaches the Job Costing Summary. I have seen files where the technician rate was set, the timesheets were complete, and labor still showed as zero on every job.
  • Assign labor types deliberately. Regular technician and apprentice cost different amounts and should not be averaged.
  • Put everyone in the Labor cost sector and use Labor on the project label, so the costs land where the reports look for them.
  • Handle commission technicians separately. If a tech is paid on commission, an hourly rate does not describe what that job cost you, and the figure needs adjusting.

Stop guessing the burden number

An owner said this to me and I appreciated the honesty:

I’ve always just guessed that 40 burdens, which I know is probably high.

A guessed burden makes every job margin a guess. The replacement is not complicated: take trailing twelve month overhead attributable to field labor and divide it by technician hours over the same period. That gives you a rate built from your own numbers rather than a figure somebody mentioned at a conference. Jason Noel described running his whole operation without tracking any kind of burden, which is more common than anyone admits.

The full version of that calculation, and what belongs in it, is in how to know if your technicians are profitable.

Materials, and getting them onto the job

If labor is the first thing that breaks, materials are the second, and the cause is usually a purchasing habit rather than a setting.

The rule is straightforward. Everything goes on a purchase order, and every purchase order carries the job number and the customer name. One job per PO. The moment somebody puts material for three jobs on one order, that cost cannot be assigned and it ends up somewhere general.

Until POs are itemized properly, what happens instead is what one operations lead described: everything is going in as miscellaneous. Miscellaneous is not a cost code. It is a place costs go to stop being useful.

The purchase order is not the bill

This one confuses nearly everybody, and it is worth stating plainly because it sits at the boundary between operations and accounting.

The purchase order is what you use for costing in your system and it’s also what you use for inventory. The bill is the accounting document, which is your accounts payable.

A purchase order authorizes a purchase and assigns the cost to a job. It does not, by itself, create that month’s expense or payable. The bill does that.

Which means the sequence matters: raise the PO against the job, receive against the PO, then match the bill to it. Skip a step and you get one of two failures. Either the job never sees the cost, or the accounting records it twice.

Get the price book right before you turn on inventory

This is the order I recommend, and it comes from watching people do it the other way.

Your price book carries the expected cost of labor and materials in each service assembly. That is what job costing reads. If those figures are stale, every job is costed against a number that stopped being true a while ago. Keeping those figures honest is the front half of pricing jobs so the number holds up.

You can upload distributor invoices into ServiceTitan for job costing, and when the invoice comes in different from the price book cost, you can adjust it there and push the correction back into the price book. That loop is how the price book stays honest. Bernie Ollila makes the stronger version of this point: the price book is the engine and somebody has to own it.

Turn on inventory before the price book is sound and you are now tracking quantities of things whose costs you do not trust.

What gets expensed that should not be

Watch for material bought and not yet used landing in cost of goods sold.

One client had unused electrical panels sitting in the warehouse, expensed the day they arrived. We estimated roughly $15,000 of that in a single month, which explained about five points of gross margin. The department looked worse than it was, and the people in it took the blame for a purchasing decision.

That is an inventory question more than a job costing one, and it is covered in how HVAC accounting should be set up.

Business units and class mapping

The departmental half is mostly one discipline: the names have to match exactly.

Your ServiceTitan business units map to QuickBooks classes, and the mapping is literal. “HVAC Service” on one side and “Service Field” on the other will not connect. Neither will a trailing space. I have sat on calls where an export had been failing for weeks over a name mismatch and a revenue account that existed in one system and not the other.

A few things worth doing when you set this up:

  • Decide your business units before you build them. Service, install, maintenance and memberships at minimum, and a separate one for each trade you run.
  • Create the matching classes in QuickBooks first, with identical names, then map.
  • Send one test invoice and confirm it lands in the right class before you trust the connection. A single small invoice will tell you what a month of exports would.
  • Lock the period once a month is closed, so nothing drifts backward into it.

If any of that is already broken, the reconciliation article goes through the failure points.

The part nobody warns you about

Everything above is configuration, and configuration is the easy half.

The hard half is that job costing only works if the people in the field assign costs to jobs, every time, without being chased. An owner put it to me like this: Steve Carroll put the consequence plainly, that past a couple million in revenue you should plan on a fire if you do not have job costing and a regular WIP process.

I’ve had quite a struggle getting the guys to put, especially our electricians, to put their costs on a job.

He was not describing a bad team. He was describing a habit that had never been built, in a company where nothing had depended on it before.

He tried an automated nudge through Slack and got limited response. What worked better was less clever: when a receipt or a card charge showed up without a job attached, he contacted the technician directly and asked which job it belonged to. Every time, while it was recent.

His reasoning is the part worth copying. He wanted to catch that a job had gone badly during the month, not six weeks later when the books closed. By then the crew has moved on, nobody remembers the detail, and the information is a history lesson rather than something you can act on.

The same company found install materials running at almost double their 24 percent target. Job tagging alone was never going to close that whole gap, but without it they could not even see which jobs were responsible.

What to check this week

If you want to know where you stand, five things, in this order:

  • Open the burden rate on three technicians. If it looks like a wage, it is the combined rate and it is wrong.
  • Pull a Job Costing Summary on a completed install. If labor shows zero, payroll is not enabled or the cost sector is wrong.
  • Look at last month’s purchase orders. Count how many carry a job number. That percentage is roughly how much of your job costing is real.
  • Compare a price book assembly against a recent distributor invoice. If the costs differ meaningfully, your expected costs are stale.
  • Run a P&L by class. If you cannot, the mapping is not done, and no amount of job-level work will produce a departmental answer.

Most companies I look at fail three of those five. It is not a competence problem. It is that the system was set up to schedule work and invoice customers, and nobody was asked to make it produce cost data. Jason Payne audits his quarterly and reckons it saves him six figures a year.

If your job costing is not telling you the truth and you would like help working out why, let’s have a conversation.

Questions owners ask

How do I get accurate job costing out of ServiceTitan?

Four things have to be right. Labor costs need payroll enabled with a burden rate holding only the amount above gross pay, not the combined rate. Materials need to be purchased on job-specific purchase orders. The price book needs current costs so expected cost can be compared against what you paid. And business units need mapping to QuickBooks classes if you also want a departmental P&L. Most companies have one or two of the four.

Why does ServiceTitan show no labor cost on my jobs?

Usually payroll is not enabled for that work type, or technicians are not assigned to the Labor cost sector. You can have complete job timesheets and a technician rate set and still see zero labor on the Job Costing Summary, because those fields are not what the costing report reads.

How do I set up job costing in a plumbing company?

Same sequence regardless of trade. Define your business units first, service, install, maintenance and any separate crews, then create matching QuickBooks classes with identical names. Get the price book carrying current labor and material costs. Enable payroll and set burden correctly. Put every material purchase on a job-specific purchase order. Then send one test invoice through and check where it lands before trusting it.

What is the difference between a purchase order and a bill in ServiceTitan?

The purchase order is what drives job costing and inventory. It assigns the cost to a job. The bill is the accounting document that creates your accounts payable. A PO authorizes a purchase, it does not by itself create the expense for that month. Raise the PO against the job, receive against the PO, then match the bill to it.

Why is my gross margin wrong even though ServiceTitan job costing is on?

The most common causes are a burden rate holding the combined hourly figure instead of the amount above wages, material bought on purchase orders with no job attached, a price book carrying stale costs, and inventory expensed on purchase rather than carried on the balance sheet. Any one of those will move your reported margin by several points.

Who fixes job costing in an HVAC or plumbing business?

It sits between operations and accounting, which is why it often belongs to nobody. Your field system consultant knows the software and not your books. Your bookkeeper knows the books and usually not the software. Someone has to own both ends, define the business units, set burden from your own numbers, fix the purchasing workflow, and reconcile the result against your P&L. That is controller-level work, and it is the layer most companies in this range are missing.

Accurate ServiceTitan Job Costing

Real Talk.
Real Profits.

A weekly show built for blue-collar entrepreneurs in the trades who want to grow, profit, and build something that lasts.

You’ll only hear from us when new episodes drop.
No spam, ever!

GET STARTED

Want to see what your numbers are actually telling you?

 Two ways to start. Pick whichever fits.

No pressure either way. Let’s chat!

Latest Podcast Episodes:

More Great Articles: