Angi Leads for Plumbers and HVAC: Worked Cost per Job and AI Follow-Up

Coding Liquids tutorial cover featuring Sagnik Bhattacharya for Angi Leads for Plumbers and HVAC: Worked Cost per Job and AI Follow-Up.
Coding Liquids tutorial cover featuring Sagnik Bhattacharya for Angi Leads for Plumbers and HVAC: Worked Cost per Job and AI Follow-Up.

Divide what you spend on leads by the jobs they win. At an illustrative $60 a lead, a 20% win rate costs $300 per won job and a 10% rate costs $600. Your Angi charges show what each lead cost, but only your own log shows how many became jobs, so build that log before spending more.

The figure that decides whether Angi pays is the break-even win rate: all-in cost per lead divided by gross profit per won job. If a lead costs $80 all-in (fee, phone time and a visit), a $7,200 system replacement at a 32% margin breaks even at about 3.5%, while a $320 drain clearing at 55% needs about 45%. Same lead, opposite verdicts.

Follow me on Instagram@sagnikteaches

Cost per won job, and the break-even rate behind it

Two definitions first, because most muddled results start here. A lead is won when the customer has paid or signed, not when a visit is booked. All-in cost is the lead fee, plus the phone time spent chasing it, plus any visit or estimate you carried out for it.

Connect on LinkedInSagnik Bhattacharya

Then two formulas. Cost per won job equals total lead spend divided by jobs won. Break-even win rate equals all-in cost per lead divided by gross profit per won job. The first tells you what you are paying; the second tells you what you can afford to pay.

Subscribe on YouTube@sagnikteaches
Cost per won job, lead fee only (illustrative fees)
Win rate$30 lead$60 lead$90 lead
10%$300$600$900
20%$150$300$450
30%$100$200$300

Your statement gives the real fees. Read the table across and down: tripling the fee has the same effect on cost per won job as cutting the win rate to a third, so a $90 lead at 30% costs what a $30 lead at 10% does. That is why a follow-up routine that lifts wins can be worth as much as a cheaper lead.

What Angi says about win rates, and what it leaves out

Angi sells these leads one at a time, and as far as I could find it does not hand a plumber a win rate to plan around. Its quarterly filings say it moved to "homeowner choice" in January 2025, so pros now receive only the leads a homeowner picks, yet none of its filings from 2024 to 2026 prints a win-rate figure. The numbers sit in shareholder letters and calls instead. The Q1 2025 letter, as quoted in search results (Angi's investor site blocks automated reading, so check the original), says the "self-reported pro win rate", the share of leads a pro paid for that became a won job, rose 10% after the move removed lower-quality, auto-matched leads. A transcript of the Q3 2025 earnings call has the chief executive putting the estimated win rate "up nearly 30%" and saying the formerly auto-matched leads had won about half as often as other channels. Every figure is a change, not a rate; I found no absolute percentage.

Two lessons follow. A relative rise from a low base is still a low rate, so Angi's trend says nothing about your own number. And "self-reported" means pros marked the job as won, exactly as your log will, so the quality of your records decides whether your figure means anything. Borrow Angi's definition and use it as yours: won jobs divided by leads you paid for.

Put five questions to your account contact and write down the answers:

  • Is each lead sent only to me, or to other firms as well, and how many?
  • Which job types and sizes can I switch off?
  • Which reasons and time limits apply when I challenge a lead?
  • Can I cap weekly spend?
  • Can I export lead history with prices and dates?

A list price on its own cannot tell you whether a $45 lead is cheap. That depends on what a won job earns you, which is the part this tutorial works through.

The six-column lead log that makes the maths possible

A spreadsheet with six columns is enough: lead ID, received (date and time), job type, lead fee, first contact (time and outcome), and result (won with invoice value, lost with a reason, or invalid). Take the fee from your statement, match each lead to a job in your field service app by phone number, and take gross profit from the finished job costing. Four illustrative rows:

Lead IDReceivedJob typeFeeFirst contactResult
A-1041Tue 08:12Blocked drain$34Called 08:15, reachedWon, $380
A-1042Tue 11:40Furnace or AC replacement$78Texted 11:52, no replyLost: no answer after four tries
A-1043Wed 07:05Water heater leak$41Called 07:09, reachedQuoted $1,850, lost to another firm
A-1044Wed 15:30Tap repair$34Called 15:34, number not in serviceInvalid: disputed

An assistant can build the summary sheet for you, which is a good use of the ChatGPT Excel guide if formulas are new to you. Describe the columns and ask for formulas, not for the answer:

My lead log is on a sheet called Log. Columns: A lead ID, B date, C job type, D lead fee, E reached (Y/N), F visit (Y/N), G won (Y/N), H invoice value, I gross profit.
On a sheet called Summary, with job types listed in A2:A6, write formulas for: leads, total fees, jobs won, win rate, fees per won job, gross profit, and gross profit minus fees. Use COUNTIFS and SUMIFS. Say what each formula does in one line.

A sensible result looks like this, and it is worth testing on five rows you can add up by hand:

B2  =COUNTIFS(Log!C:C,A2)                       leads
C2  =SUMIFS(Log!D:D,Log!C:C,A2)                 fees
D2  =COUNTIFS(Log!C:C,A2,Log!G:G,"Y")           jobs won
E2  =IFERROR(D2/B2,0)                           win rate
F2  =IFERROR(C2/D2,"none won")                  fees per won job
G2  =SUMIFS(Log!I:I,Log!C:C,A2)                 gross profit
H2  =G2-C2                                      gross profit minus fees

Check the first row against your hand count, then fill down. The usual fault is spelling: if the log says "Blocked drain" on one row and "Drain blocked" on another, the summary counts them as two job types, so settle on a fixed drop-down list for the job type column before you start.

A four-van firm's month: repair leads against replacement leads

Take a four-van plumbing and heating firm in the middle of a busy month. Every figure below is illustrative. It buys 40 leads, 30 for repairs (drains, leaks, water heater faults) and 10 for replacements (boiler, furnace or air conditioning). Handling a lead costs about $6 of phone and admin time, and each visit or estimate costs $70 in labour and van time.

Repair leadsReplacement leadsBoth
Leads bought301040
Average fee$38$78
Lead fees$1,140$780$1,920
Reached / visits21 / 128 / 629 / 18
Jobs won617
Win rate (won ÷ leads bought)20%10%17.5%
Gross profit per won job$216 ($450 at 48%)$2,100 ($7,000 at 30%)
Handling ($6 a lead)$180$60$240
Visits ($70 each)$840$420$1,260
Total cost$2,160$1,260$3,420
Gross profit won$1,296$2,100$3,396
Result-$864+$840-$24
Cost per won job, fee only$190$780$274
Cost per won job, all-in$360$1,260$489

Look at the last column first. The firm is $24 down on the month, which feels like a shrug. A firm that tracked only the fee per won job would see $274 against a $3,396 gross profit and conclude Angi was healthy. The split tells a different story: repair leads lost $864 and replacement leads made $840.

The break-even test agrees. Repair leads cost $72 all-in ($2,160 over 30), so at $216 gross profit per win they need a 33% win rate and achieved 20%. Replacement leads cost $126 all-in, so against $2,100 they need 6% and achieved 10%. One caution: a single replacement win is a thin sample, and one more or fewer swings that rate by ten points. Treat the result as a reason to look closer, then wait for 30 leads in the category.

Gross profit on the first job is also not the whole value. A repair customer who later buys a maintenance plan or a replacement is worth more, so track repeat revenue per source for twelve months and keep it as a separate line rather than folding guesses into the first-job maths.

Which job types need which win rate

A second illustration makes the point without the firm's month. Hold the all-in cost of a lead at $80 (fee, phone time and a share of visit cost) and see what win rate each job type needs to break even on gross profit. The invoice sizes and margins are placeholders; swap in your own from the last six months of invoices.

Job typeInvoiceMarginGross profitBreak-even win rate
Blocked drain$32055%$17645%
Tap or toilet repair$26055%$14356%
Air conditioning repair$52050%$26031%
Water heater replacement$1,90035%$66512%
Furnace or AC replacement$7,20032%$2,3043.5%

Compare each figure with the win rate your own log shows for that job type. Where the rate needed exceeds the rate achieved, the job type loses money at that fee, however busy it keeps the phones. A firm that does both plumbing and heating can sit on both ends of this table at once, which is why logging by category matters more to you than to a single-trade firm.

Counting "booked" as "won", and other ways the maths goes wrong

  • Booked is not won. In the firm above, 18 visits were booked from 40 leads, which looks like a 45% win rate. Seven jobs were won, which is 17.5%. Use the second figure.
  • Averaging across job types. The blended -$24 hid a loss and a profit. Always split by category.
  • Leaving out your own time. $240 of handling and $1,260 of visits was 44% of the firm's total cost. Fee-only maths ignores nearly half.
  • Judging on ten leads. Wait for 30 per category and three months of trading.
  • Paying twice for one homeowner. If the same phone number appears on two leads, flag the second as a duplicate when you log it, since it may be challengeable later.

The all-in cost per lead is also where a visit fee changes the answer. If you charge for the first visit, visits stop being a pure cost; the tutorial on building a service call fee from your costs shows how to set one.

A follow-up routine you can run from a phone

Speed and persistence are the two things in your control, and the routine below needs no software to start. Treat the timings as targets to test, not as rules Angi sets.

WhenActionChannel
Within 5 minutesCall; if there is no answer, text one question that moves towards a bookingPhone, text
Within the hourSecond call; email with two time slotsPhone, email
That eveningThird attempt offering next morningText
Day 2Last call attempt; voicemail naming the jobPhone
Day 4Closing message: "reply any time"Text
Day 10Record the reason lostLog only

AI earns its keep on the texts. Ask for short, job-specific first messages once, store them as phone snippets, and a person sends them in seconds:

Write first-reply texts for a plumbing and heating firm answering a lead from an online request. Four job types: blocked drain, water heater leaking, no heating, air conditioning not cooling. Each under 40 words, friendly, one question that helps us book, no prices, no arrival promises, signed [your name] at [company]. Use [first name] for the homeowner.

An illustrative result for the first two:

Hi [first name], it's [your name] at [company]. I've seen your request about the blocked drain. Is it one sink or is water backing up through the house? I can send someone this afternoon between 2 and 4 or tomorrow morning.
Hi [first name], [your name] at [company] here about your water heater. Is water still coming from the tank, or has it stopped? Tell me and I'll work out the quickest slot for you.

What I would fix: delete any line that sounds like a promise ("same-day guaranteed"), make sure each text asks exactly one question, and add whatever opt-out wording your adviser says your texts need, because texting rules differ by place and by how the homeowner asked to be contacted. Words such as flooding, burst, no heating in winter or any gas smell should send the lead to a person on the phone straight away; the emergency-call tutorial covers how to set that up if an AI answers.

What the follow-up routine costs to run

The manual version costs nothing beyond a chat assistant, which is about $20 a month on an individual plan. Automation costs more. These are list prices from the vendor pages, in USD.

OptionMonthly costWhat it doesLimit
Phone snippets plus an AI assistant$0 to about $20Drafts texts; you send themOnly as fast as you are
Jobber Connect$99 for one user on annual prepay; $139 month to monthAutomatic follow-up by email or text after a quoteFollows quotes, not new leads; Core lacks it
Jobber Receptionist add-on$29, covering 30 conversations, then $0.79 eachAnswers calls and texts when you are on a jobNeeds escalation rules for emergencies
Housecall Pro Essentials$149 annual billing, $189 monthly, five usersScheduling, estimates, invoices; AI team members on every planCSR AI is sold separately and the page shows no price
ServiceM8 AI Writing Helper$29 to $149 by job count; helper on every planDrafts emails and texts to clients; Office Agent Pro ($39 on paid plans) follows up quotes, with your approvalJob limits per plan; Free allows 10 assists a day

One more condition: automation can only act on a lead that reaches an inbox or tool you control. If your leads arrive only inside an app, find out whether any export or integration exists before you buy anything. For after-quote chasing, which is where Jobber Connect helps, the HVAC replacement quote follow-up sequence has the wording.

What better follow-up does to the repair numbers

Suppose the routine lifts the repair leads reached from 21 to 25 and the wins from 6 to 8. That is a target to test, not a forecast. Visits rise from 12 to 15, so visit cost goes from $840 to $1,050 and total cost to $2,370. Gross profit is 8 × $216 = $1,728. The result improves from -$864 to -$642, and all-in cost per won job falls from $360 to about $296.

Notice what did not happen. Better follow-up saved $222 and still left repair leads losing money, because a $450 job at 48% cannot carry a $72 all-in lead. The levers that move the answer sit elsewhere: a minimum charge, a visit fee, accepting fewer low-value job types, or capping repair-lead spend until the log shows a better rate. Follow-up improves the win rate; it cannot change what a drain job earns.

Sorting lost leads so you can see why you lose

Free-text notes like "no ans" and "went cheaper" are useless in a pivot table. Paste ten days of notes, with no names or numbers, and ask for fixed categories:

Note as typed (illustrative)Category
no ans x4Never reached
went w someone cheaperLost on price
just wanted a ballparkPrice shopper
wrong #Invalid lead
other firm got there firstLost on speed
couldn't fit before FridayCapacity

Use six categories at most and let the assistant place each note in one of them, then scan the output for a mistake before it goes into the log. "Lost on speed" is the one that justifies the routine above; if it is a large share, your follow-up is the problem. "Never reached" and "Invalid lead" belong in the next section.

Disputing leads that were never real

Angi's current lead-credit rules and time limits sit in your pro account, which I could not see, so read that section first. What does not change is the evidence. For each lead you challenge, keep the lead ID and time received, every call and text attempt with times (screenshots of the call log are enough), and a one-line reason. Reasons that usually fit the category: a disconnected or wrong number, a duplicate of a lead you already paid for, a job outside your service area, a job type you do not do, or a homeowner who says they never asked for service. Check which of those Angi's terms name.

Ask an assistant to turn your notes into a short, factual message. An illustrative version for lead A-1044 from the log above:

Lead A-1044, plumbing, received Wednesday at 15:30. We called at 15:34 and 15:52 and texted at 15:36. The number returned "not in service". Screenshots of the call log are attached. Please review this lead for credit.

Track the share you challenge. If more than about one lead in five turns out invalid, that is a conversation to have with your account contact and a reason to tighten service area and job-type settings, not a reason to send more disputes. For the Google equivalent, the plumber's evidence pack for disputing local services leads works from the same habits.

A 90-day test with a stop rule

  1. Month 1: log only. Record every lead with the six columns. Change nothing, so you have a baseline.
  2. Month 2: add the routine. Start the five-minute call and text, the snippets and the lost-reason categories. Keep logging in the same way.
  3. Month 3: compare by category. Work out win rate, all-in cost per won job and result for repairs and replacements separately.

In month 3, add one more cut: group the leads by minutes to first contact (under 10, 10 to 60, over 60) and compare win rates. If your data shows no difference, do not pay for speed tools. If the under-10 group wins clearly more, you have a business case for automation or an AI receptionist in your own numbers instead of a vendor's. Groups of fewer than 15 leads say very little, so merge them if you need to.

Then apply a stop rule written in advance. A category is worth keeping if its result is positive after at least 30 leads, and comfortable if all-in cost per won job is under half the gross profit per won job. That 50% margin of safety is my rule of thumb, not Angi's. If a category is negative for two months running after the routine is in place, cap its spend or pause it. Run the same log for any other source, such as your own website or a Google ads campaign, and compare like with like; the plumbing lead sources cost per job tutorial shows how.

Questions plumbers and HVAC owners ask about Angi leads

Can I get my money back for a bad Angi lead?

Credit and dispute rules sit in your own Angi pro account, so read that section before you rely on one. Whatever the rules say, build an evidence file for each lead you challenge: time received, every call and text attempt with times, and why the lead was invalid. A lead that was real but simply unprofitable is rarely a refund case.

How many leads do I need before I can judge Angi?

Aim for at least 30 leads in each job category before you trust a win rate, and look at three months of results. With only 10 leads, one extra won job moves the rate by ten points. Judge repairs and replacements separately, because they carry very different gross profit per job.

Can AI reply to Angi leads automatically?

Only if the lead details reach an inbox or tool you control, and you should check Angi's terms before automating messages. A safer start is AI-drafted text snippets that a person sends within minutes. Keep price talk, arrival promises and emergency calls with a human, whatever you automate.

Is a $40 lead cheap or expensive?

Neither, until you know the break-even win rate: all-in cost per lead divided by gross profit per won job. Say phone time and a share of visit costs add $48, making $88 all-in. On a $2,000 gross-profit replacement that breaks even at about 4.4%. On a $150 gross-profit repair it needs nearly 59%, which few firms reach on any lead source.

Further reads

Sources: Jobber, Housecall Pro and ServiceM8 pricing pages read in October 2026; Angi's quarterly filings and Q4 2025 earnings release; its Q1 2025 shareholder letter as quoted in search results and a transcript of its Q3 2025 earnings call, because Angi's pro, help and investor pages blocked automated reading.

Want your lead costs counted properly?

On a 1:1 call we'll set up your lead log, work out the break-even win rate for each job type, and pick the follow-up step worth automating first.

Book a 1:1 call with me