Price repeatable HVAC repairs and tune-ups flat rate, and keep diagnosis-heavy or unknown work on hourly time and materials, but test that split on your own jobs first: export six to twelve months of jobs, have AI replay them at flat prices, compare margin per job type with what hourly earned, and keep whichever protects margin.
Flat rate and hourly are two ways of recovering the same costs, so neither wins in general. Flat rewards a fast technician and punishes a slow job. Hourly passes the slowness to the customer, who often distrusts it. Your records show which one costs you money, provided they hold the hours each job really took.
Every figure below is invented for illustration: a firm with a $75 fully loaded cost per technician hour, 120 jobs from nine months and eight job types. Swap in your own.
What each method protects, and what it exposes
| Method | Who carries the time risk | What it rewards | Where it fails |
|---|---|---|---|
| Flat rate | You | Speed, tidy jobs, the same price for the same task | Slow jobs and comebacks eat the margin; a price set too low repeats on every job |
| Hourly with parts markup | The customer | Complex or unknown work, where nobody can say how long it will take | Quick jobs earn little, and customers distrust a bill they could not predict |
The usual advice stops at that table. The useful question is narrower: for each type of job your company actually does, which method would have earned more margin per technician hour over the last nine months, and how bad is the worst case? That is something you can calculate, and an AI assistant can do the calculation in a few minutes once the data is in order. For the markup side of the sum, a worked markup and margin check on past jobs covers it in more detail; this tutorial is about the pricing method.
The export: ten columns and a job type on every row
Pull one row per completed job with these columns: job ID, date, job type, technician, on-site hours (clock-in to clock-out, not billed hours), drive hours, parts cost at what you paid, invoice total, pricing method used (flat or hourly) and whether the job came back as a callback within 30 days. Field-service platforms normally hold this in the job list and the timesheet report, and both can usually be exported to CSV or Excel; the menu names vary, so search your software's help pages for "export jobs". If hours exist only as billed hours, the test goes blind exactly where it matters, on jobs where the time billed differs from the time worked, so check ten jobs you remember against the export before trusting it. A second test is cheap: add up one technician's on-site and drive hours for a week and compare them with the hours that technician was paid against jobs. A gap above about 5% means clock times are being missed or padded, and every margin per technician hour in the replay inherits that error.
Remove customer names, addresses and phone numbers before the file goes into a chat tool. On consumer ChatGPT and Claude plans, check the model-training switch in privacy settings; business plans leave your content out of training by default. The assistant needs the job descriptions, not the customer's identity.

The Complete Excel Course with AI Integration
From formulas and pivot tables to Power Query, DAX, VBA and AI with Copilot, ChatGPT and Claude — hands-on from the first lesson.
By Sagnik Bhattacharya and Virginia Thorn, Primetime Emmy Award winner
Buy nowSorting 120 jobs into eight job types
Technicians write job notes in their own shorthand, and the replay is only as good as the grouping. Give the assistant a fixed list of types and tell it to flag what does not fit. Five rows from a first pass look like this (illustrative):
| Job note | Assigned type | Confidence |
|---|---|---|
| Capacitor swapped, unit running | Capacitor replacement | High |
| No cool. Found failed blower motor, quoted and replaced | Blower motor replacement | High |
| Called out for no cool, customer declined repair | No-cool diagnosis only | High |
| Leak search, evaporator coil leak found, top-up | Refrigerant leak search and repair | High |
| Tstat swap, smart model, wifi set up | Thermostat replacement | Medium |
The rule I would write into the prompt: a visit that starts as a diagnosis and ends in a repair is one job, filed under the repair, because the diagnosis time is part of what the repair price has to cover. A visit that ends without a repair is its own type, "diagnosis only", because that is the job a call charge exists for. Any type with fewer than eight jobs keeps its tag but stays hourly for now, and a note that fits no type goes into "Other". Before running the replay, check a dozen high-confidence tags against the job notes yourself. Errors usually point to two types that overlap, such as a thermostat swap and a low-voltage wiring fault, and fixing the list is quicker than correcting rows one by one.
What hourly billing earned on each job type
This is the baseline: the 120 jobs as billed, at $145 an hour for on-site time with a one-hour minimum and parts sold at cost plus 60%. Margin here is the invoice minus technician hours (on site plus driving) at $75 an hour, minus parts, minus an allowance for callbacks.
| Job type | Jobs | Avg technician hours | Avg parts | Avg invoice | Margin per job | Margin | Margin per technician hour |
|---|---|---|---|---|---|---|---|
| Capacitor replacement | 22 | 1.34 | $22 | $182 | $54 | 29.4% | $40 |
| Blower motor replacement | 9 | 3.24 | $218 | $735 | $263 | 35.7% | $81 |
| No-cool diagnosis only | 18 | 1.54 | $0 | $156 | $41 | 26.0% | $26 |
| Refrigerant leak search and repair | 7 | 3.23 | $112 | $557 | $166 | 29.8% | $51 |
| Maintenance tune-up | 28 | 1.60 | $14 | $188 | $52 | 27.7% | $33 |
| Thermostat replacement | 12 | 1.49 | $96 | $311 | $100 | 32.2% | $67 |
| Condensate drain clear | 10 | 1.30 | $7 | $157 | $44 | 28.0% | $34 |
| Furnace igniter or flame sensor | 14 | 1.90 | $53 | $278 | $73 | 26.3% | $38 |
Across all 120 jobs the firm invoiced $31,784 at a margin of 30.1%. The average hides a spread: a technician hour earns $81 on a blower motor and $26 on a diagnosis-only call. Hourly billing is rich where the job carries a big part to mark up, and thin where the job is short, parts-free and takes a drive each way. Two things follow. Diagnosis-only is where a flat price or a proper call charge has the most to give. And the blower motor is a warning: if you move to flat rate and price it from cost alone, you may cut what hourly billing was quietly collecting.
Building a flat price for each type from your own data
The formula has four parts: the median technician hours for the type (on site plus driving) at your cost per hour, the median parts cost, an allowance for callbacks, all divided by one minus the margin you want. Median, not average, because one three-hour comeback should not set the price for every capacitor. For the capacitor, the median is 1.32 technician hours, so labour is $99.00. The median part costs $22. Six per cent of capacitor jobs came back, and a return visit costs about $99, so the callback allowance is $5.94. Total cost is $126.94, and at a 30% margin the price is $126.94 / 0.70 = $181.34, which rounds to $180.
The blower motor works the same way: 3.03 technician hours is $227.25, plus a $227 median part, plus a callback allowance of $11.36 (5% of the $227.25 return visit), gives $465.61, and $465.61 / 0.70 is $665. The callback allowance matters more than it looks. It is the reason a job type with a poor callback record carries a higher flat price than its hours alone justify, and it is the reason to log callbacks properly; the tutorial on logging the cause of every callback shows how. The $75 itself should come from your own wages, vans and overhead, divided by the hours technicians spend on jobs and driving between them.
Replaying 120 jobs at flat prices
Now give the assistant the tagged export and ask it to do the whole comparison at once. This is the prompt:
Here are 120 tagged HVAC jobs as CSV: job_type, tech_hours_on_site, drive_hours, parts_cost,
invoice_total, callback_rate_for_type. Our fully loaded cost is $75 per technician hour
(on site plus driving).
1) For each job type: number of jobs, average invoice, and margin per job and per technician
hour as billed, after an allowance for callbacks.
2) A flat price = (median technician hours including driving x $75 + median parts + callback
allowance) / 0.70, rounded to the nearest $5.
3) Replay every job at its flat price. Give total revenue, margin %, and how many jobs would
have earned under 15% margin, under billed and under flat.
Show formulas. Do not assume any change in how many jobs we win.
Here is the result for the example firm (illustrative):
| Job type | Flat price | Against today's average invoice | Margin at flat price | Jobs under 15% margin: hourly / flat |
|---|---|---|---|---|
| Capacitor replacement | $180 | -1.1% | 28.6% | 0 / 2 |
| Blower motor replacement | $665 | -9.5% | 29.0% | 0 / 1 |
| No-cool diagnosis only | $170 | +9.0% | 32.1% | 0 / 0 |
| Refrigerant leak search and repair | $580 | +4.1% | 32.6% | 0 / 1 |
| Maintenance tune-up | $190 | +1.1% | 28.4% | 0 / 1 |
| Thermostat replacement | $300 | -3.5% | 29.7% | 0 / 0 |
| Condensate drain clear | $165 | +5.1% | 31.5% | 1 / 0 |
| Furnace igniter or flame sensor | $285 | +2.5% | 28.1% | 0 / 2 |
| All 120 jobs | $31,625 against $31,784 (-0.5%) | 29.7% against 30.1% billed | 1 / 7 |
The headline is quiet: flat prices built from cost would have earned $159 less over nine months, with the same margin to within half a point. What changes is where the money comes from and how much risk you hold. Diagnosis-only gains 9.0% because the one-hour minimum had been under-charging for the drive. The blower motor loses 9.5% because hourly billing, with a 60% mark-up on a $227 part, had been collecting more than cost-plus-30% asks for. And the count of jobs under 15% margin goes from one to seven. That is the cost of promising the customer a price: more thin jobs, spread across types that were safe when time was billed.
Check the assistant's work on three points. It must use the median for the flat price, so check one type's figure against a MEDIAN formula in your own sheet. It must file a diagnosis that ended in a repair as one job, not two. And it must not claim that flat prices would win you more work: the prompt's last line is there because the replay can show what you would have earned from the same jobs, not which jobs customers would have accepted.
From the replay to a price book: publish the higher of two numbers
I would not publish the replay's flat prices as they stand. For each type, publish the higher of two figures: the cost-built flat price, and what hourly billing has actually been collecting, rounded up to the next $5. Moving to flat rate is a choice to sell certainty, not a decision to give away margin, and the second figure stops the blower motor sliding from $735 to $665 by accident. In this example the book becomes: capacitor $185, blower motor $735, diagnosis-only $170, tune-up $190, thermostat $315, condensate clear $165 and igniter or flame sensor $285.
Refrigerant leak search stays hourly. There are only seven jobs, the spread of hours is the widest of any type, and 14% of those jobs came back, so a flat price built on seven records would be a guess presented as a number. Quote an estimate range, bill by the hour, and revisit when you hold eight or more. Logging every search, as in the tutorial on recording leak checks and top-ups, gives you those records in a form you can sort.
Replaying the whole book on the same 120 jobs, seven types flat and leak search hourly, gives revenue of $32,384 against $31,784 billed, a rise of $600 or 1.9%, at a margin of 31.3% against 30.1%. Jobs under 15% margin rise from one to four. Whether three more thin jobs in nine months is a fair price for flat pricing depends on what you expect it to do to the number of quotes customers accept, and the replay cannot measure that. It can only tell you that, on the work you actually did, the book would not have cost you money.
The minimum call charge: the floor under both methods
Diagnosis-only jobs average 0.95 hours on site and 0.59 hours of driving, a cost of $115.50, against $156 billed. Hourly billing's one-hour minimum had been absorbing the drive. A call charge sets the floor explicitly: $170 covers the drive and the first hour on site, and time after that is $145 an hour in quarter-hour units. Ten of the 18 diagnosis-only jobs finished inside the first hour, so they would simply pay $170. The other eight would pay more, and the average across all 18 would rise from $156 to $181, up 16%.
Two edge cases deserve a decision before you publish. First, do you credit the call charge against a repair? In this example you can afford to, because every repair price already includes its own diagnosis time in the median hours, so crediting costs nothing on jobs that become repairs and only the declined repairs pay the full $170. Second, check the call charge against your cheapest flat price. The condensate clear is $165, below the $170 call charge, so a customer who books a drain clear would be charged more for the visit than for the fix. Either lift that job to $170 or exclude it from the credit rule. The tutorial on how much to charge for a service call builds the same fee in more detail.
Why a competitor's price list is not your price list
The quickest way to fill a flat-rate book is to copy a rival's published prices, and it is the quickest way to find out your costs are different. Suppose a rival's page shows $149 for a capacitor, $99 for a diagnosis and $129 for a tune-up (invented numbers, standing in for any list you might copy). Against this firm's own average job costs, including callbacks:
| Job type | Copied price | Your average cost | Profit per job | Margin |
|---|---|---|---|---|
| Capacitor replacement | $149 | $128.44 | $20.56 | 13.8% |
| No-cool diagnosis only | $99 | $115.50 | -$16.50 | -16.7% |
| Maintenance tune-up | $129 | $136.00 | -$7.00 | -5.4% |
Two of the three copied prices lose money, and the third earns less than half the margin the replay targets. A rival's prices carry their parts discounts, their technicians' speed, their drive times, their overhead and a brand that may let them charge more or force them to charge less. An assistant asked for "average HVAC prices" gives you a blend of everyone's costs, which is no better. Looking at a public price page as a sanity check is normal. Agreeing prices with a rival firm is a different matter: that is price-fixing, which competition law prohibits, so keep pricing conversations inside your own business.
What a price book entry should say
A flat price survives an argument only if the entry says what it covers. Each row in the book needs the price, what is included, what is not, the evidence behind it and a review date. For the capacitor, an entry could read:
Capacitor replacement, $185 flat. Includes the diagnosis, a standard capacitor, labour, and a return visit within 30 days at no charge if the same fault comes back. Does not include other failed parts found on the visit, refrigerant, or access work that needs a second technician; those are quoted separately. Basis: 22 jobs, median 1.32 technician hours, median part $22. Review: [date].
The "other failed parts" line is the one that earns its keep. A flat price for one repair collapses the moment a technician finds a second fault inside it, so the entry has to say that a second fault is a second price, quoted before the work starts. Keep the basis line in the book as well. When you review it in a quarter, the assistant can compare the new median hours with the old ones and tell you which entries have drifted. The thirty days in the entry are the same thirty days you used to flag callbacks in the export, so the book and the data stay consistent.
A 90-day trial before you change the whole book
Pick three job types, say the capacitor, the tune-up and the diagnosis call, and put them on flat prices for 90 days while everything else stays as it is. Track five things for those types and compare them with the nine-month baseline: margin per technician hour, average ticket, callbacks, the share of quotes customers accept, and what the technicians say. Decide the stopping rule in advance. For example, keep flat on a type if, after at least 15 jobs, margin per technician hour is at or above the hourly baseline and callbacks have not risen; go back to hourly on that type if two of the three measures are worse.
Agree how technicians are paid before the trial starts. A flat price can reward a fast job or reward selling the bigger repair, depending on the pay structure, and technicians who learn the rules after the change will not trust the book. The replay gives you the numbers. The trial tells you whether the people and the customers behave the way the numbers assume. A replacement quote has its own logic: for options at several price points, a worked good-better-best replacement quote is the place to start.
HVAC pricing questions after the replay
Do flat-rate prices need a price book app?
No. A spreadsheet with job type, flat price, what it includes and the date it was reviewed is enough to start. Field-service software can hold the book later and put prices on quotes, but the method of median hours, parts, a callback allowance and a margin is the same, and you want it working before paying for features.
What about job types with only a handful of records?
Keep them hourly, quote an estimate range and keep logging. Below eight jobs, one odd job moves the median too far. Once you reach eight, run the replay for that type and decide between flat and hourly then. In the meantime, do not copy a rival's number to fill the gap.
Should customers see both a flat price and an hourly price?
For repeatable repairs, show one flat price. Two options invite a debate about how long the job should take. For diagnosis and unknown faults, give the call charge and the hourly rate for time after the first hour, and say so plainly before the technician starts work.
How does flat rate affect what technicians are paid?
It depends on your pay structure. If technicians are paid by the hour, a flat price lets the company keep the gain from a fast job. If pay is tied to sales or jobs completed, agree the rules before launch, because a flat list can reward upselling. Talk to the technicians before the trial, not after.
Further reads
- Follow Up After Giving a Quote: An HVAC Replacement Sequence With AI — Follow up on replacement quotes once the price is set.
- HVAC Price Increase Letter: Maintenance Plan Members and One-Off Customers — Tell maintenance plan members when prices move.
- HVAC Maintenance Agreement Template: Can AI Draft It? What a Lawyer Checks — Wording for the plans that sit next to flat prices.
- HVAC Service Report Template: Can AI Turn Technician Notes Into One? — Capture the hours and notes the replay depends on.
- Using AI in an HVAC Business: A Week-by-Week Setup Plan — Fit this test into a week-by-week AI setup.
- Six AI Automations for HVAC Companies, Ranked by Effort — See where else AI pays back for an HVAC firm.
- How to Price Tattoos: A Rate Card for Hourly, Piece and Flash Work — Cost per chair hour, a minimum charge, a piece grid, flash tiers and deposit credit, then a back-test against twelve past bookings.
- How to Use AI in HVAC Design: Options, Duct Checks and Proposals — Contractor-side AI steps around HVAC design: survey notes to input sheet, duct questions, good-better-best drafts and a proposal audit against the load report.
- AI Tools and AI Development: The Complete 2026 Guide — the AI hub, including every tutorial in the AI-for-business series.
Sources: no outside data. The 120 jobs, the $75 cost per technician hour, the rates and every price in the examples are invented for illustration.