Your best month last year probably contained your worst work. Owners who sit down to find unprofitable jobs with AI almost always discover the same thing: the service line they are proudest of is carrying a cost their software never attached to it. Not a pricing mistake. A bookkeeping blind spot.
Here is the through-line for everything below, and it is the only idea in this article: your field service software prices jobs, it does not cost them. Jobber, Housecall Pro, and ServiceTitan will all tell you what you invoiced. What they will not tell you, unless you have configured them to and almost nobody has, is what the job actually consumed. Every leak in the list is the same leak wearing a different hat: a real cost that left your bank account but never got stapled to a work order.
AI is useful here for one narrow, unglamorous reason. It is very good at joining five ugly exports that have no common key, spotting the pattern across 800 rows, and asking you the question a spreadsheet cannot. It is not predicting anything. It is reconstructing what already happened.
Can AI really tell me which jobs lose money?
Yes, but only by rebuilding job cost from data you already collect. AI does not have access to profit you never recorded. What it does is take your completed-job export, your timesheets, your supply house invoices, and your merchant statements, and rebuild the true cost of each job so the losers surface. The work is in the joining, and that is exactly the work an AI assistant does faster than you or your bookkeeper will by hand.
What to export before you start
Do this once, and the next seven passes take an afternoon instead of a quarter. Pull the last 12 months into four files:
- Completed jobs — job number, date, customer, job type or service line, technician, invoice total, and any discount applied.
- Payroll or timesheet detail — hours by tech by day, ideally by job number.
- Supply house and vendor invoices — every purchase order, with the job number if your counter guy is disciplined enough to give you one.
- Money out after the invoice — merchant processing statements and financing dealer fee statements.
Strip customer names, street addresses, and phone numbers before any of this goes into a general-purpose AI tool, or use a business-tier account where your data is not retained for training. Job numbers and zip codes are enough for every analysis below. If you want the broader picture of what these tools do and do not do with your operating data, we walk through it in our guide to using AI to understand your numbers.
1. Drive time and the second trip to the supply house
Start here because it is the biggest and the most invisible. A four-hour billable job with 90 minutes of windshield time and a mid-job parts run is a five-and-a-half-hour job that you priced as four. Your dispatch board knows this happened. Your profitability report does not.
Ask the AI to compare each technician's clock-in to clock-out span against the billed hours on that job, then group the gap by service line and by zip code. What comes back is a map. You will usually find one or two zips where the average gap is double everywhere else, and one service line — often small-diameter drain work, service calls on older equipment, or anything requiring a part you do not truck-stock — where the second supply run is not an exception, it is the norm.
Put a real number on it. The IRS business standard mileage rate was 70 cents per mile for 2025, which is a defensible per-mile cost for the truck. Add the burdened hourly rate for the time. A 26-mile round trip to the counter with a tech in the seat is rarely under sixty dollars all in, and if it happens on a third of a service line's jobs, that line is not the margin you think.
2. The burdened labor rate you are not actually using
Most shops cost jobs at the tech's wage. That number is wrong by roughly a third before you have done anything else. The Bureau of Labor Statistics' Employer Costs for Employee Compensation data consistently shows benefits running close to a third of total compensation, and that is before you get to the piece that varies most in the trades: workers' compensation.
Comp rates are set by class code, and the spread is not subtle. Roofing work under NCCI class 5551 carries a rate that is a multiple of plumbing under 5183 or HVAC service under 5537. If you run more than one trade under one roof — and a lot of $1M-$5M shops do — you cannot use one blended labor cost across all of them without hiding money.
Give the AI your actual burden inputs: wage by tech, employer payroll tax, benefits contribution, comp rate by class code, PTO hours, and non-billable training and shop time. Have it produce a single burdened hourly rate per technician, then re-run every completed job at that rate. Do not be surprised when jobs you remembered as fat turn thin. That is the point.
3. Callbacks that were booked as brand-new jobs
This is the one that fools good operators. When a tech goes back out on a warranty return, most shops open a new zero-revenue work order. The original job keeps its full margin on the report. The rework hours land in an orphan record nobody reads. Your service line looks profitable and your callback rate looks like a training issue instead of a costing issue.
Fix it with a matching pass. Ask the AI to find every zero-dollar or warranty-flagged job and match it back to the prior job at the same address within 90 days, then re-attribute those hours and any parts to the original job number. Then re-rank your service lines.
The output is often a list of two or three specific install or repair types where the true cost is 15 to 20 percent higher than recorded, and one technician whose personal callback rate is carrying it. Neither of those is visible without the join. Both are fixable this month — one with a repricing, one with a ride-along.
4. The customer segment, not the job type
Here the analysis usually breaks in a useful way. You go looking for a bad service line and find a bad customer instead.
Three segments show up over and over:
- Home warranty work. American Home Shield, Choice, and the rest pay an authorized flat rate per covered repair that the warranty company sets, not you. It is often below your own diagnostic-plus-repair price, it comes with authorization hold time your tech spends on the phone in the driveway, and it pays slowly.
- Property management and REIT accounts. Volume at a negotiated discount, frequently with net-45 or net-60 terms, multi-unit access delays, and a portion of trips that end in no-access.
- Builder and GC punch-list work. Small tickets, long drives, and retainage.
Have the AI group all 12 months of jobs by customer type and compute revenue per truck hour, not revenue per job. Revenue per truck hour is the honest metric because it prices your only genuinely scarce resource. A $340 warranty ticket that eats 3.2 truck hours loses to a $190 residential service call that eats one, every single time.
None of this means you fire the segment. It means you know what it is: a capacity filler for your slow weeks that should never be dispatched ahead of retail demand.
5. Two techs on a one-tech job
Pull every job where two or more people clocked in, and have the AI compare the labor hours to the median for that same job type when a single tech ran it. You are looking for jobs where the second body added no throughput — where two techs took 3.5 hours on work that one tech does in four.
This is a dispatch habit, not a bad decision at the time. It usually traces to one of three causes: an apprentice riding along with no defined training objective, a helper sent because the truck was idle, or a job type nobody has re-scoped since a difficult version of it three years ago. If the pattern is concentrated in one job type, your scope template is stale. Our piece on quoting jobs faster without losing accuracy covers how to rebuild those templates from your own completed-job history rather than from memory.
6. The money that leaves after the invoice clears
An invoice marked paid is not the same as cash collected. Three things skim the top and almost none of them get posted back against the individual job:
- Card processing. Consistent, roughly three percent, and easy to allocate.
- Promotional financing dealer fees. The 0%-for-12-months offer that closes system replacements is not free to you. The contractor absorbs a dealer fee, commonly several percent of the ticket, and it is charged at the lender, not in your field software. On a replacement, that fee can be larger than the entire margin on two service calls.
- The discount the tech gave in the driveway. The senior discount, the repeat-customer courtesy, the waived dispatch fee when the repair proceeds.
Ask the AI to reconcile your merchant and lender statements against the job list by date and amount, attach every fee to its job, and then re-rank. Financed replacements very often drop several places. That does not mean stop offering financing. It means the promotional offer is a marketing cost, and it should be sized like one.
7. The loss leader that never pulled through
Tune-ups, seasonal inspections, and first-year maintenance visits are sold at or below cost on purpose. The bet is pull-through: the found repair, the replacement two seasons later, the customer who calls you instead of shopping. That bet is testable and almost nobody tests it.
Have the AI take every maintenance visit from 13 to 24 months ago and pull the same customer's trailing revenue since. Now you have a conversion rate and an average follow-on ticket. Compare the loss on the visit to the follow-on revenue, per plan type.
What usually falls out is that the bet pays on one plan and not another — the plan sold at the point of a replacement converts, the plan sold cold to a new customer does not. That is a sales-channel finding, not a service finding, and it belongs next to your marketing attribution work rather than in your dispatch review.
The afternoon version, in order
If you only have four hours, run it in this sequence. Each step feeds the next.
- Export the four files above for the trailing 12 months.
- Strip customer names, addresses, and phone numbers. Keep job numbers and zips.
- Build one burdened hourly rate per technician and have every job re-costed at it.
- Re-attribute callbacks and warranty returns to their original job.
- Attach drive time, processing fees, financing dealer fees, and discounts.
- Rank service lines by gross margin per truck hour. Rank customer segments the same way.
- Take the bottom five percent of jobs and read them yourself. The pattern is almost never what the summary suggested.
That last step matters more than the six before it. The output of the analysis is a hypothesis, not a verdict. You know things about those jobs the data does not contain.
What to do with what you find
The instinct after this exercise is to cut. Usually the right move is narrower than that: reprice one service line, re-scope one job template, change the dispatch priority for one customer segment, and set a callback threshold that triggers a ride-along.
Then make the measurement permanent rather than annual. That means getting job numbers onto supply house purchase orders and getting techs clocking in and out by work order — which is a field discipline problem, not a software problem. Once the data is clean at the source, this whole review becomes a monthly report instead of a project. If you want to know what will actually connect to your existing system without a rebuild, we covered which AI tools connect to Jobber, Housecall Pro, and ServiceTitan in detail.
One honest caveat, and it is the reason I put the through-line at the top. AI did not find your margin leak. It made the arithmetic cheap enough that you finally looked. The judgment about which customer to keep, which tech to coach, and which service line to raise — that stays yours, and it should.
Frequently asked questions
Doesn't my field service software already have a job costing report?
It has the feature; it probably does not have the data. Job costing in Jobber, Housecall Pro, and ServiceTitan only works when payroll hours are mapped to work orders and vendor invoices carry job numbers, and in most $1M-$5M shops one or both is missing. The report renders, it is just built on partial inputs.
How many completed jobs do I need before this is meaningful?
A trailing 12 months is the right window because it captures both seasons. If a service line has fewer than about 30 jobs in that window, treat its result as a question to investigate rather than a finding.
Is it safe to put customer data into an AI tool?
Not without stripping it first. Remove names, street addresses, phone numbers, and email addresses before upload — job numbers and zip codes preserve every grouping you need. If you need the full record, use a business or enterprise account where your inputs are excluded from model training, and confirm that in writing.
Should I stop taking home warranty or property management work?
Rarely. Those segments are capacity fillers. The decision this analysis supports is dispatch priority and volume cap, not a blanket cutoff — you want that work in slow weeks and behind your retail demand, not competing with it at peak.
My techs don't clock in by job. Can I still do this?
Partly. You can run the customer segment, fee, discount, and pull-through passes on invoice and vendor data alone. The drive time and two-tech passes need per-job time, so start collecting it now — those two are where the largest surprises usually live.