PPC and paid-ads agencies churn clients faster than any other agency type, close to 49% a year according to Focus Digital's agency churn research, more than double the churn rate of retainer-based agencies overall. Delivery dissatisfaction is the single biggest reason clients leave, cited by 48% of departing clients in the same research. Put those two numbers together and paid-ads agencies, home services PPC shops very much included, are losing clients on the thing they can control least: whether the client feels like the work is delivering, not whether it actually is.
Cost per lead is where that gap opens up. It's the easiest number to pull from an ad platform, so it's the number that ends up in the report. It's also only half the story, and reporting it alone doesn't just under-serve the client. It puts the agency's own neck on the line for problems the agency didn't cause.
The number that makes you look bad for reasons that aren't your fault
Cost per lead measures something the agency mostly controls: targeting, ad copy, bids, landing pages. Booking rate measures something the agency mostly doesn't: how fast the client's front desk answers the phone, whether a technician actually calls a lead back same-day, whether the office is short-staffed that week. Those are two different systems producing two different numbers, and a report that only shows CPL quietly hands the agency responsibility for both.
Run the scenario. A $40 lead source is booking at 8%, working out to $500 per job. The client's front office goes through a rough week, someone's out sick, follow-up slips from same-day to two days later. Booking rate on that same source drops to 5%. Cost per job jumps to $800 with nothing on the ad side having changed at all. If the report only ever showed cost per lead, the client sees a campaign that looks exactly the same as it did last month and a bill that looks exactly the same, then feels a spike in cost per job with zero explanation for it. The agency gets the call asking what broke. Nothing did. There was just never a number in the report that could show the difference between an ad problem and a follow-up problem.
That's the same math from our earlier piece on cost per booked job vs. cost per lead, but the angle here is different. That post argued booking-rate visibility makes reporting more useful to the client. This is the same argument made for the agency's own sake: without that visibility, you have no way to show a client that a bad month wasn't a campaign problem, and clients who can't tell the difference between "the ads stopped working" and "we had a rough week internally" default to blaming the agency. Every time.
Home services makes this worse than most verticals
Booking rate volatility isn't a minor variable in home services, it's structural. Shared lead sources, common across Local Services Ads marketplaces and lead aggregators, close at roughly 10% to 20%, while exclusive leads close at 30% to 50%, according to BaaDigi's contractor lead comparison. That's not agency execution driving the gap. It's how many other contractors got the same lead at the same time.
the close-rate range between shared and exclusive contractor leads, per BaaDigi's lead comparison. A CPL-only report can't tell a client which end of that range they're on this month, or why it moved.
Channel mix compounds it. SearchLight Digital's February 2026 data, built from 888 contractors, puts average Local Services Ads cost per lead at $53. Their separate roofing analysis puts non-branded paid search cost per lead at $124, more than double, for a completely different type of lead. A client looking only at cost per lead is going to assume the cheaper channel is winning, when the honest comparison depends entirely on how those leads actually book. An agency reporting CPL alone either wins or loses that comparison in the client's head for reasons that have nothing to do with the value it's actually delivering.
Report the number that protects you, not just the client
NarrateIQ tracks cost per booked job by source for every contractor client, so a bad month reads as a booking-rate dip with a cause, not an unexplained campaign failure.
Book a free audit call →What actually needs to change in the report
The fix isn't complicated, it's just rarely built into the default reporting workflow. Booking or job status data almost always already exists in whatever scheduling or CRM software the contractor runs, whether that's Housecall Pro, ServiceTitan, or something simpler. The work is pulling that data alongside the ad platform's numbers and reporting cost per lead and cost per booked job by source, weekly, not blended into one monthly average. Weekly matters here specifically because a booking-rate dip caught in week one is a conversation. The same dip discovered a month later, after the client has already noticed their job count is down, is a defense.
This is also where agencies stop absorbing blame that belongs somewhere else. When a report shows booking rate moved independently of CPL, the conversation with the client shifts from "why did the campaign break" to "let's look at follow-up speed on this source together," which is a conversation about the client's own process, not an accusation against the agency's work. That's a materially different call to be on, and it's the difference between a client who trusts the agency's read on a bad month and a client who's already shopping for a replacement.
Reporting cost per lead alone was never really a strategy, it was just the path of least resistance because it's the number the ad platform hands you for free. Home services agencies that build booking-rate visibility into the report aren't just doing better work for the client. They're the ones who don't end up as a data point in next year's churn number.