Job Costing for Home Service Contractors: How to Know Which Jobs Are Actually Profitable
Most home service owners know their overall gross margin. Far fewer know which specific job types or job sizes are profitable and which are draining margin. Job costing assigns actual costs to individual jobs so patterns surface.
Key takeaways
- Overall gross margin hides the job-type and tech-specific patterns that determine whether a business is growing profitably or just growing
- One tech's drain clearing jobs averaging 2.2 hours instead of 1.4 hours costs $47 more per job in labor -- enough to flip a profitable job type into a margin drain for that specific tech
- The four cost categories for every job: direct labor, materials, vehicle cost, and overhead allocation. Missing any one produces a margin estimate that is wrong
- Job costing by tech surfaces performance gaps that a price increase would never fix -- the fix is tech-specific coaching or dispatching, not raising prices
Most home service owners can tell you their gross margin for the quarter, but very few can tell you the gross margin on a specific job type last month. The aggregate number feels like insight. It is not. It hides the job types that carry the business and the job types that drain it. A plumbing shop running 38% gross margin overall might have drain clearing at 51% and water heater replacements at 19%. The mix of those two job types determines whether the 38% aggregate goes up or down next quarter.
Job costing is the practice of assigning actual costs to individual completed jobs and comparing those costs to what the job was billed. Done consistently, it surfaces three patterns that no dashboard will show you: which job types are profitable, which techs deliver margin and which erode it, and whether your pricing on specific job types reflects actual cost or historical habit. The full picture sits inside job profitability for home services.
What Job Costing Is (and Isn't)
Job costing is not accounting. It does not live in QuickBooks. It is a field operations discipline that assigns the costs that actually happened on a job to that job record, then aggregates job records to find patterns.
A job cost is not the estimated labor and parts when the job was quoted. It is the actual hours logged by the tech, the actual parts pulled from the van or ordered for that job, the actual miles driven, and an overhead allocation based on how long the job took.
Job costing is also not a one-time exercise. It only produces useful patterns when done consistently over 60-90 days of completed jobs, because any individual job has noise (a part that had to be driven to the supplier, a job that ran long because of an unusual installation condition). The signal is in the aggregate across job types and techs over time.
What job costing is not: a way to penalize techs. The goal is to find systemic patterns, not to catch individuals. A tech whose jobs consistently cost more is often struggling with a process, a routing problem, or a job-type match rather than a performance problem.
Text Clint: "What is my actual gross margin by job type for the last 90 days?"
The 4 Cost Categories
Every job has four cost categories. Each one needs to be captured for the job costing to be accurate.
Category 1: Direct labor.
Direct labor is the actual hours a tech spent on the job multiplied by the burdened labor rate. Burdened rate includes wages, payroll taxes, workers comp, and benefits -- not just the hourly wage. If a tech earns $26/hour and the burden adds 30%, the burdened rate is $33.80/hour.
Most CRMs track clock-in and clock-out at the job level. If your CRM does not, technicians can log job time in the field and the admin team can verify against the schedule. Estimating job time from the scheduled duration is not job costing -- it is the same estimate the quote was based on, which defeats the purpose.
Category 2: Materials.
Materials cost is the actual cost of parts consumed on the job, not the list price charged to the customer. Most businesses markup materials at the time of quoting. Job costing uses the cost line, not the sale price. If a part cost $45 and was billed at $90, the materials cost for that job is $45.
The data source is purchase orders, van inventory counts, or parts invoices linked to the job. In CRMs with parts tracking (ServiceTitan, Housecall Pro, Jobber), parts pulled for a job can be tied to the job record automatically if the inventory workflow is being used.
Category 3: Vehicle cost.
Vehicle cost is miles driven for the job times the per-mile cost of operating the vehicle. IRS standard mileage rate ($0.70 as of 2025) is a reasonable proxy. Alternatively, track actual fleet costs (fuel, maintenance, insurance, depreciation) and divide by total miles driven to get a per-mile rate.
For route-based businesses, vehicle cost per job is typically $8-$25 depending on travel distance and whether the job is in a dense service area or on the outskirts of the territory.
Category 4: Overhead allocation.
Overhead is the cost of running the business that is not directly tied to individual jobs: office staff, rent, software, marketing, insurance, the owner's salary to the extent it is not already in burdened labor. Overhead allocation per job is calculated by dividing total overhead by total billable hours, then multiplying by hours on the job.
If overhead runs $18,000/month and the business produces 450 billable hours per month, the overhead rate is $40/billable hour. A 1.5-hour job carries $60 in overhead allocation. A 3-hour job carries $120. The mechanics for this allocation are covered in how to calculate overhead markup as a contractor.
Text Clint: "What is my total billable hours for last month and my overhead cost per billable hour?"
How to Set It Up in Each Major CRM
The degree of built-in job costing support varies across CRMs. None of them do it automatically without a consistent data entry process.
ServiceTitan has the most complete built-in job costing: techs clock time at the job level, parts are tracked through pricebook and van inventory, and job costing reports are in the reporting module. The setup requirement is that techs actually use the clock-in/clock-out function and that parts are pulled through the inventory workflow.
Housecall Pro tracks labor time and materials at the job level but requires the materials to be entered against each job. The job profitability report in HCP compares job revenue to labor cost and materials cost. Overhead allocation is manual.
Jobber tracks time on jobs through the time tracking feature. Materials are entered line-by-line on the job. Job costing requires pulling the data from the job records and calculating margin. There is no built-in job costing report in Jobber as of early 2026.
Workiz has job-level time tracking and materials entry. Profitability reporting is available in Workiz, though the overhead allocation step is manual.
For any CRM: the floor requirement is that techs log actual time at the job level and that materials are entered against the job, not estimated from the quote. Without those two data inputs, job costing is not possible.
Text Clint: "Which of my job types have the highest variance between estimated job duration and actual job duration?"
The 3 Patterns Job Costing Surfaces
Given 90 days of job cost data across job types and techs, three patterns consistently emerge:
Pattern 1: Job types priced below their actual cost.
A job type with an average ticket of $225 and an average job cost of $180 is running 20% gross margin. If overhead on that job type runs $55/job, it is effectively breaking even after overhead. The question is whether the pricing was set based on market rates or based on actual cost. Usually it is market rates. The fix is a price increase on that job type, with the cost data as the justification.
Pattern 2: One or two techs accounting for most of the cost variance.
Aggregate job costing by job type will look acceptable. When you break the same data out by tech, you often find that two techs have average job costs 20-35% higher than the rest. The cause is almost always longer job duration, not higher parts cost. A tech taking 2.2 hours on a job the others complete in 1.4 hours is costing $26.80 extra per job in labor (at $33.80 burdened rate). On 15 jobs per week, that is $402/week or $20,900/year in excess labor cost from that one tech.
This pattern explains why general price increases often fail to solve margin problems. The problem is a specific tech's job duration, and the fix is coaching on that specific job type, not a price increase that affects every tech and every customer. The broader read on this is in technician performance metrics for home services.
Pattern 3: A job type that loses money at any reasonable price.
Some job types are structurally expensive relative to what the market will pay. An appliance repair shop that takes on refrigerator compressor replacements may find the job costs $280 in parts and 3.5 hours of labor, totaling $398 in cost -- and the market price the customer expects is $350-$400 all-in. At any price a customer will accept, the shop is losing money on every compressor replacement. The right answer is to stop taking that job type, not to find a way to do it cheaper.
Text Clint: "Which tech has the highest average job duration compared to others on the same job types?"
How to Use Job Costing for Pricing Decisions
Job costing data changes how pricing decisions are made, because it replaces intuition with specific cost evidence.
For new job types: Before adding a job type (for example, a plumbing shop starting to offer water filtration installation), run the cost-up calculation using estimated labor and real parts costs. Compare to the price you would need to charge to hit target margin. If the required price is above what customers will accept, do not add the job type.
For existing job types showing low margin: Use job cost data to separate the question "is the price wrong?" from "is the execution wrong?" If the average job cost is high because techs are taking too long, it is an execution problem, not a pricing problem. A price increase does not fix slow execution. When the answer is pricing, see how to raise prices in home service without losing customers.
For pricing review cadence: Costs change over time: labor rates increase, parts costs rise, vehicle costs go up. Job costing data from 12 months ago is stale. Review pricing annually using current cost data for each major job type, not the cost data from when the price was originally set.
For the owner's time allocation: The job types and techs with the best margins are where the business should be directing marketing spend, dispatcher routing, and hiring. The job types with the worst margins are candidates for price increases, scope changes, or elimination. Job costing makes that decision data-driven rather than gut-level, the same logic behind job profitability by trade.
Text Clint: "Show me my gross margin by job type and by tech for the last 90 days and flag any job type under 30% gross margin."
How Clint Surfaces Job Costing Data
Clint connects to your CRM job records, time logs, and parts data to answer job costing questions in text form. Instead of pulling reports from ServiceTitan or Housecall Pro and building a spreadsheet, you text a question and get the answer. "What is my average gross margin on drain clearing jobs by tech for the last 90 days?" returns the breakdown in seconds.
The underlying data is already in your CRM if your techs are logging time and parts against jobs. Clint reads that data, applies the cost model, and surfaces the patterns without requiring a manual report-building exercise.
Sources
Frequently Asked Questions
4 questions home service owners actually ask about this.
01How long does it take to set up job costing?
The setup work is getting your techs to consistently log time at the job level and entering actual parts cost against each job. In a CRM like ServiceTitan or Housecall Pro where these workflows exist, the data entry habit takes 2-4 weeks to establish. The analysis itself -- once 60-90 days of clean data exists -- can be done in 30 minutes by pulling the job cost report.
02How do I calculate the burdened labor rate for my techs?
Take the tech's annual wages, add employer-side payroll taxes (roughly 7.65% for FICA), workers comp (varies by state and trade, typically 4-12% for field techs), health insurance premiums if you contribute, and any other benefits costs. Divide by 2,080 annual hours (or actual hours worked). That is the burdened hourly rate. For most residential service techs earning $22-$30/hour in wages, the burdened rate runs $28-$40/hour.
03What gross margin should I target by job type?
Target varies by trade and job type, but a general benchmark: service and repair jobs should run 45-60% gross margin because they are skill-and-time intensive. Installation jobs (equipment installs, system replacements) typically run 30-45% because parts cost is a larger portion. Maintenance and agreement visits run 25-40% depending on chemical or parts content. Any job type consistently below 25% gross margin warrants a pricing review or elimination.
04What if my techs will not log their time accurately?
Start with the why. Techs who see time tracking as surveillance will resist. Techs who understand that job cost data is used to set fair prices and improve routing -- not to penalize them -- are more likely to comply. Tie the habit to a visible benefit: showing techs their own job cost data and how it compares to peers tends to increase engagement. Make time logging the easiest part of the job record, not an afterthought.
See Clint in action
Clint is the pre-built AI for home service shops. Connect your CRM, email, and phone system in minutes and the agents run on your real data.