Why Your Roofing Cost Per Lead Keeps Going Up (And How to Pull It Back Down)
On this page
You pulled up last quarter's numbers and the cost per lead is uglier than it was a year ago. Same channels, same ad accounts, same lead vendors, and somehow each phone call or form fill is costing you noticeably more than it used to. If you're tempted to blame your marketing person, your agency, or your own ad copy, hold off. Most of what's pushing your cost per lead up has nothing to do with anything you did. It's structural. It's baked into how roofing leads get manufactured and sold in 2026, and it's getting worse on a curve.
That's the bad news. The good news is that once you understand the actual mechanics, you stop chasing the wrong fixes. You stop swapping agencies every nine months hoping the next one has a secret. You stop buying "fresh" shared leads at a premium that evaporates the second five other roofers' phones light up with the same homeowner. And you start spending your dollars on the part of the funnel you can actually control.
Let's take this apart piece by piece: what cost per lead really measures, why every major channel is inflating, the math that tells you whether you have a lead problem or a conversion problem, and the concrete moves that bring the number back down without gutting your pipeline.
First, get the definition straight
Most roofers use "cost per lead" loosely, and that sloppiness hides the real problem. Three numbers get jammed together and they are not the same thing.
Cost per lead (CPL): total spend on a channel divided by the number of leads it produced. A lead is a human who raised their hand: a form fill, a phone call, a booked appointment, a knock that turned into a conversation. Already there's ambiguity, because a "lead" from Angi and a "lead" from your own website are wildly different in quality even at the same dollar cost.
Cost per acquisition (CPA) or cost per sale: total spend divided by the number of signed jobs. This is the number that actually pays your bills. CPL can stay flat while CPA explodes, because the leads got worse even though they didn't get more expensive per unit.
Customer acquisition cost (CAC): the fully loaded version. Ad spend plus the labor to chase the lead, plus the sales rep's time, plus the gas, plus the portion of your office staff's salary that exists to handle this. Almost nobody calculates this honestly, and it's the number that determines whether you're actually making money.
Here's why the distinction matters for the question you came in with. When someone says "my cost per lead is going up," they're usually staring at CPL because it's the easiest number to see on a dashboard. But the thing that's actually eating their margin is often CPA or CAC rising even faster, because the leads got cheaper-looking and more expensive to close at the same time.
Keep all three in your head as we go. We'll come back to a worked example that shows how a "good" CPL can be masking a brutal CPA.
The short answer: six forces are pushing the number up
Before the channel-by-channel breakdown, here's the map. Your cost per lead is rising because of some combination of these, and usually several at once:
- Auction inflation. Paid channels (Google, Meta, Local Services Ads) are auctions. More roofers bidding on the same clicks means the price floor rises every year, independent of anything you do.
- Lead resale and exclusivity erosion. Shared-lead marketplaces sell the same homeowner to four to eight contractors. You're paying for a lead and a race, and the race is getting more crowded.
- Rising consumer acquisition cost across the board. Privacy changes (iOS tracking, cookie deprecation) made ad targeting blunter, so platforms need more impressions to find a buyer, and each conversion costs more to attribute.
- Tighter homeowner wallets and longer decision cycles. When money is tight, more people "get a quote" with no intention of buying soon. That inflates lead counts in a way that looks fine on CPL but wrecks CPA.
- Storm timing and geographic swarm. After a hail or wind event, out-of-area crews flood in, ad costs in that market spike for weeks, and the leads get fought over. Between events, the same market goes quiet and your fixed costs spread over fewer leads.
- You're paying to reach roofs that don't need you. This is the quiet one. A huge share of every channel's spend lands on homeowners whose roofs are nowhere near due. You pay full price to talk to someone who's seven years from a re-roof.
The first five are mostly outside your control. The sixth is almost entirely inside it, and it's where the leverage is. We'll spend real time there.
Channel by channel: where the inflation actually comes from
Different channels inflate for different reasons. Lumping them together is why generic advice ("improve your ad copy!") rarely moves the needle. Let's go through the big ones.
Google Search and Local Services Ads
Google Search ads for roofing terms run on a second-price-style auction. The cost you pay per click is driven by how many other advertisers want that same keyword in that same ZIP at that same moment. Roofing is one of the most competitive paid-search verticals in the country, sitting alongside legal and insurance for cost per click, because the job value is high enough that everyone can justify bidding aggressively.
What's pushing it up:
- More advertisers, same inventory. Every new roofing company and every national lead-gen brand bidding in your market raises the floor. The number of searches for "roof replacement near me" grows slowly; the number of bidders grows faster.
- Lead-gen aggregators outbidding you on your own terms. Companies whose entire business is reselling leads can bid more per click than you can, because they recover that cost by selling the resulting lead to several contractors. You're competing against businesses with better unit economics on the exact click you need.
- Quality Score erosion. If your landing page and ad relevance slip even slightly, Google charges you more per click for the same position. Most roofers never audit this.
- Local Services Ads (the "Google Guaranteed" badge units) moved to a per-lead model in many categories, and the per-lead price has crept up as more contractors get verified and compete for the same call volume. Disputing junk leads helps, but the baseline price still rises.
What to actually check: pull your search-terms report and look at how much you're spending on broad, top-of-funnel terms ("roof repair," "roofers") versus high-intent ones ("roof replacement quote [city]," "hail damage roof inspection [city]"). Broad terms are where auction inflation hits hardest and where the leads are weakest. Tightening match types and negative keywords can drop CPL meaningfully without touching budget.
Meta (Facebook and Instagram)
Meta isn't an intent channel the way search is. Nobody opens Instagram looking for a roofer. You're interrupting people and using targeting plus a compelling offer to surface the small fraction who happen to need a roof. That model took a direct hit from privacy changes.
What's pushing it up:
- Targeting got blunter. After Apple's App Tracking Transparency and the broader move away from third-party cookies, Meta lost a lot of the signal it used to find your buyer cheaply. It compensates by showing your ad to more people to find the same conversions, and more impressions means more cost per result.
- Creative fatigue is faster. A roofing ad that worked for three months now burns out in three to five weeks as the platform exhausts the responsive audience. You pay rising frequency costs and have to produce new creative constantly just to hold CPL steady.
- "Lead" quality on Meta lead forms is low by default. Instant-form leads are cheap per unit and often near-worthless: people tap through for a "free roof inspection" with zero buying intent. Your CPL looks great and your CPA is a disaster. This is the textbook case of the wrong number looking healthy.
What to actually check: separate your Meta CPL from your Meta cost-per-booked-appointment. If the gap is enormous, the channel is manufacturing junk leads, and the fix is qualifying harder up front (more friction on the form, a phone-verification step) even though it raises the headline CPL. A more expensive lead that actually closes is cheaper than a free one that wastes a rep's afternoon.
Shared and exclusive lead marketplaces (Angi, modernize-style resellers, networX-style platforms)
This is where the structural rot is most obvious. Shared-lead marketplaces sell the same homeowner's information to multiple contractors. The homeowner fills out one form and four to eight roofers get the lead and the phone number, often within seconds of each other.
What's pushing it up:
- The price per lead rises while the value per lead falls. As more contractors join these platforms, the marketplace can charge more per lead (demand is up) while each lead is split among more buyers (so your odds of closing it drop). Both directions hurt you.
- Speed-to-lead arms race. Because everyone gets the lead at once, closing it is a race to the first dial. If you're not calling within a couple of minutes, the four roofers ahead of you already booked the inspection. You're paying for leads you have almost no chance of winning unless you've built a dial-within-90-seconds operation.
- Junk and recycled leads. Bad addresses, tire-kickers, and leads resold weeks later as "fresh." Disputing these is a part-time job and the credits never fully cover the loss.
The brutal math: if a shared lead costs you and you close one in eight, and four of those eight are won by competitors who dialed faster, your effective cost per winnable lead is far higher than the sticker price, and your cost per closed job is higher still. The marketplace's incentive is to maximize how many times it sells each lead, which is structurally opposed to your incentive to close it.
A few contract traps inside these platforms quietly inflate your real cost, and they're worth knowing before you sign or renew:
- Auto-accept and budget-spend defaults. Many platforms default to auto-accepting leads up to a daily or weekly cap. If you don't actively manage filters, you accept (and pay for) leads outside your service area, outside your job type, and outside any sane quality bar. Turn auto-accept off and hand-accept until you trust the filters.
- Narrow dispute windows. Junk-lead credits usually require you to dispute within a tight window (often 24 to 72 hours) with specific evidence. Miss the window and you eat the cost. If nobody on your team owns disputing daily, your effective cost per lead is higher than your invoice implies because you're paying for junk you had the right to refuse.
- Lead-recycling as "new." A lead that didn't close for the first buyers sometimes gets resold weeks later, repackaged as fresh. The homeowner has already been called by six roofers and is cold or annoyed. You pay full freight for a salvage lead.
- Rate creep at renewal. Per-lead pricing tends to ratchet up at renewal as the platform adds contractors to your market. Re-benchmark your cost per sale on the platform before every renewal; a price that was fine last year may have crossed into unprofitable without you noticing.
None of this means marketplaces are never worth it. For a newer company with no list and no brand, buying leads can be a reasonable on-ramp while you build owned channels. The mistake is treating purchased leads as a permanent strategy instead of a bridge, and never building the lower-cost, owned pipeline that should eventually carry most of your volume.
Door knocking and direct mail (your own outbound)
These feel different because there's no "lead vendor" sending an invoice, but they have a cost per lead too, and it's also rising.
For door knocking, your cost per lead is the fully loaded cost of putting a rep on a street, divided by the conversations that turn into appointments. That cost rises when:
- Rep wages and fuel go up.
- Rep churn goes up, because a new canvasser who knocks the wrong doors gets discouraged, makes no money, and quits, so you're constantly paying to train people who leave. Every washout is sunk cost spread across the few who stay.
- You're knocking indiscriminately. If a rep knocks 100 doors and 85 of those homes have roofs that don't need replacing for years, the rep burned a day to find the 15 that mattered, and most of those 15 weren't home.
For direct mail, cost per lead is your printing plus postage plus list cost, divided by the calls the mailing generated. Postage has climbed steadily, print costs are up, and response rates on untargeted mail are low and falling because mailboxes are saturated. If you mail a whole ZIP code, you're paying first-class postage to reach homeowners with three-year-old roofs.
The thing both of these share with the paid channels: a large fraction of the spend lands on roofs that aren't due. You can't fix auction inflation. You can fix who you spend on. Hold that thought.
The macro forces underneath all of it
The channel mechanics above sit on top of a few broader currents. Understanding these stops you from taking the inflation personally and helps you predict where it's heading.
More competitors chasing the same homeowners. Roofing has low barriers to entry on the sales side. A truck, a ladder, and a subcontracted crew, and someone's in the lead-buying market. Every new entrant bidding in your auctions and joining your marketplaces raises prices for everyone already there. The number of roofs that need replacing in a given year grows roughly with the housing stock; the number of companies competing for those roofs can grow much faster, especially after a big storm season pulls in out-of-area operators who then stick around.
Homeowner behavior shifted toward comparison shopping. A decade ago a homeowner with a leak called one or two roofers. Now they fill out a form that fans out to several, read reviews, and get three to five quotes by default. That's good for them and expensive for you: every lead is more contested, and the share of "just gathering quotes, not buying yet" homeowners is higher. More quotes per job means more of your sales capacity gets spent on jobs you won't win, which is a cost-per-sale problem dressed up as a cost-per-lead problem.
The privacy reset reshaped digital acquisition permanently. This isn't a temporary blip you wait out. The move away from third-party cookies and device-level tracking is a structural change in how platforms find buyers. Targeting is permanently blunter and attribution is permanently softer than the 2018-era playbook assumed. The roofers who adapt are the ones who feed the platforms their own first-party data (their customer list, their due-roof list) so the algorithms have a real signal to work with instead of the degraded public signal everyone else is fighting over.
Input costs rose across the board. Postage, print, fuel, and wages all climbed over the last several years. Every one of those is an ingredient in your cost per lead. When a stamp costs more and a canvasser costs more and gas costs more, the same untargeted mail drop or door-knocking day produces leads at a higher cost even if nothing about your method changed. You can't reverse those input prices, but you can refuse to spend them on roofs that aren't due, which is the only real lever you have against them.
Decision cycles stretched out in a tighter economy. When household budgets are squeezed, a roof that isn't actively leaking becomes a "next year" project. Homeowners still request quotes, because the inspection is free and they want to know where they stand, but the time from lead to signed job lengthens. Longer cycles mean more leads sitting in your pipeline at any moment, more follow-up labor per eventual sale, and a cost per acquisition that creeps up even when cost per lead holds steady. This is why a soft economy can make your real acquisition cost rise while your dashboard looks unchanged.
None of these reverse on their own. The contractors who thrive through them are the ones who stop trying to out-bid the market for generic leads and start aiming their spend with information their competitors don't have.
The math that tells you what's really wrong
Before you spend a dollar trying to fix this, you need to know whether you have a lead-cost problem or a conversion problem. They look identical on a surface dashboard and they have opposite fixes.
Here's the diagnostic. Pull these numbers per channel for the last 12 months, broken into quarters if you can:
| Metric | What it tells you |
|---|---|
| Spend | The input |
| Leads | Raw hand-raisers |
| Cost per lead (Spend / Leads) | Channel price |
| Qualified leads (real roof, real intent, in area) | The leads worth chasing |
| Cost per qualified lead (Spend / Qualified) | The honest CPL |
| Booked inspections | Funnel mid-point |
| Signed jobs | The outcome |
| Cost per sale (Spend / Signed) | What a customer costs |
| Close rate (Signed / Qualified) | Your sales effectiveness |
Now read the pattern:
- If CPL is rising but close rate is steady: you have a genuine lead-cost problem. The channel got more expensive per unit but the leads are still as good. This is auction inflation, and the fix is targeting and channel mix, not your sales process.
- If CPL is flat or falling but cost per sale is rising: you have a quality problem. The leads got cheaper-looking and worse. This is the Meta-instant-form trap or the recycled-shared-lead trap. The fix is qualifying harder and possibly killing the channel.
- If both CPL and cost per sale are rising: you have both, which is common, and you need to attack quality first because it's faster.
A worked example
Let's make this concrete with two roofers, both spending the same on the same channel, both reporting the same headline CPL.
Roofer A spends $10,000 and gets 200 leads. CPL = $50. Looks great. But the channel is an untargeted Meta lead-form campaign across the whole metro. Of those 200 leads, maybe 40 have a roof anywhere near replacement age and real intent. Cost per qualified lead = $250. Of those 40, the team books 12 inspections and signs 4 jobs. Cost per sale = $2,500. The other $8,000 of spend went to conversations that were never going to be jobs.
Roofer B spends the same $10,000 but targets only homeowners whose roofs are aging out, in the neighborhoods worth driving to. They get 90 leads. CPL = $111, more than double Roofer A's headline number. On the dashboard, Roofer B looks like they're losing. But of those 90 leads, 60 have a real, due-ish roof. Cost per qualified lead = $167. The team books 35 inspections and signs 11 jobs. Cost per sale = $909.
Roofer B's cost per lead is twice as high and their cost per job is less than half. The roofer who optimized for the cheap headline number is the one quietly going broke. This is the single most important idea here: the headline CPL is the most misleading number in the building, and chasing it down is often how roofers make their real costs go up.
Tie it back to the only ratio that matters
The number that decides whether your acquisition spend is sane isn't cost per lead at all. It's the ratio of what a job is worth to what it cost to win. Take your average gross profit per job (not revenue, profit) and divide it by your fully loaded cost per sale. If a job nets you $3,000 in gross profit and it costs you $900 to acquire, that's a ratio of about 3.3 to 1. As a rule of thumb, anything north of 3 to 1 is healthy for residential roofing, 2 to 1 is tight but survivable if your operations are lean, and under 1.5 to 1 means a channel is eating you alive no matter how cheap its leads look.
Now watch what rising cost per lead does to that ratio. If your cost per sale climbs from $900 to $1,500 on the same $3,000 job, your ratio falls from 3.3 to 2. You're still profitable, but you've lost a third of your cushion, and that cushion was paying for the truck, the office, and the slow month. A roofer who only watches CPL never sees this erosion until the bank account does. Run the ratio per channel, every quarter, and you'll always know which channels are funding the business and which are quietly draining it.
A second number worth tracking alongside it: payback period. A storm-restoration job that closes and gets paid in 60 days is a very different cash-flow animal than a retail re-roof financed over two years. If a channel produces jobs that are slow to collect, a rising cost per lead hurts twice, because you're floating more acquisition cost for longer before the cash comes back. Cheap-looking leads that close into slow-paying jobs are a double squeeze that a CPL dashboard will never show you.
Why "just spend more" and "just switch agencies" don't work
When cost per lead climbs, two reflexes kick in. Both usually make it worse.
Reflex one: increase budget to "buy more leads." In an auction channel, spending more often raises your own cost per lead, because to get more volume you have to bid higher or expand into lower-intent audiences. You're buying the marginal lead, which is by definition the worst and most expensive one. Volume up, quality down, CPA up.
Reflex two: fire the agency and hire a new one. Sometimes warranted, but most of the time the new agency inherits the same auction, the same privacy constraints, the same shared-lead economics. They get a honeymoon quarter from fresh creative, then the structural forces reassert themselves and you're back where you started, minus the switching costs and the ramp-up time. If three agencies in a row couldn't fix it, the problem isn't the agency.
The move that actually works is changing who you spend on, not how much or through whom. Reduce the share of every dollar that lands on roofs that aren't due, and your effective cost per qualified lead drops across every channel at once, with no auction to beat.
The lever almost nobody pulls: spend only on roofs that are due
Here's the part that's genuinely in your control. Across every channel, a large share of your spend reaches homeowners whose roofs are years from needing you. You can't tell which is which from the curb, from a ZIP code, or from "year built" on a property record, so you spend on all of them and eat the waste.
Three common data points that don't tell you a roof is due:
- Year built. A house built in 1998 might have been re-roofed in 2019. The public record shows 1998. Re-roofs are invisible to property data. Targeting by home age is targeting by noise.
- ZIP code or neighborhood. Useful for income and home value, useless for roof condition. The 22-year-old roof and the 4-year-old roof sit next door to each other.
- "It hailed here." A hail map tells you a storm passed over a polygon. It does not tell you which specific roofs took an impact hard enough to matter. A 1.25-inch stone hitting a 19-year-old roof is a very different event than the same stone hitting last year's install, and a storm's hail doesn't fall evenly across a neighborhood.
What does tell you a roof is due is the combination of two things: how old the roof actually is (estimated from aerial imagery, as a range, not a guess from year-built) and what storms that specific roof has actually taken (modeled per roof, not looked up on a map). An old roof that's also been worked over by wind and hail is the one that's due. A young roof in a storm ZIP usually isn't. A 20-year-old roof in a quiet market often is.
How this changes the cost-per-lead math
If you could wave a wand and only spend on roofs that are actually due, here's what happens to each channel:
- Direct mail: you stop mailing the whole ZIP. You mail the houses with old, worn roofs. Same postage per piece, but every piece reaches someone with a real reason to call. Response rate per dollar climbs, so cost per qualified lead falls, even though the per-piece cost is unchanged.
- Door knocking: your rep walks a route built from the due roofs instead of knocking 100 doors blind. The conversations are warmer, the rep makes money faster, the rep stays. Cost per appointment falls and rep churn (a hidden, brutal cost) falls with it.
- Paid digital: you build custom audiences and exclusion lists from your due-roof list, so you stop paying Meta and Google to show ads to people with new roofs. Your audience shrinks but your relevance soars, which Meta and Google both reward with lower costs.
- Your own CRM and old estimate list: this is the cheapest "lead" you'll ever get, and most roofers ignore it. Every homeowner you quoted two or three years ago and didn't close has a roof that's now two or three years older and may have taken a storm since. Re-scoring your own book for which of those roofs is now due turns a dead file into your lowest-cost pipeline. There's no auction, no vendor, and no competitor racing you to the dial.
Where RoofPredict fits
This is the specific problem RoofPredict is built for, so it's worth being plain about what it does and doesn't do. You hand it an area (or your own customer list), and it scores the roofs house by house using two signals: a roof-age range estimated from aerial imagery, and the storm history modeled on each individual roof, rather than whether a storm passed over the ZIP. The output is a ranked list of the addresses most likely to be due, so you can point your mail, your knock routes, and your ad audiences at the roofs that are worn out and skip the ones that aren't.
The honest limits matter, because anyone promising more is selling you something. Roof age comes back as a range (say, 18 to 22 years), not an exact install date, because that's what aerial imagery can responsibly support. The storm model gives you odds that a given roof was impacted, not proof; a roof flagged high-risk still needs an actual inspection to confirm. It is not a lead service and won't hand you a stranger's phone number; it sharpens the outbound you already do and enriches the list you already own. What it changes is the denominator in your cost-per-lead math: when a bigger share of your spend lands on due roofs, your cost per qualified lead and your cost per job both fall, regardless of what the auctions are doing to your headline CPL.
A reasonable way to test it: take a street or a slice of your old estimate list where you already know the outcomes, and see whether the ranking matches what you know on the ground. You decide whether it earned a place in your spend.
Build channels you own, so the auction matters less
The deepest fix for rising cost per lead is to stop renting all of your pipeline. Purchased leads and auction clicks will always be subject to forces you don't control. Owned channels aren't. The more of your volume comes from sources you own, the less any single auction price increase can hurt you. Here are the owned channels worth building, roughly in order of cost-effectiveness.
Your existing customer base and referrals. A past customer who's happy is the cheapest job you'll ever sell, and they know other homeowners with similar-age roofs in the same neighborhood (houses built in the same wave tend to need roofs in the same wave). A deliberate referral program, even a simple one, produces leads at a fraction of any paid channel's cost and they close at a far higher rate because they arrive pre-trusted. Most roofers run referrals by accident; running them on purpose is free margin.
Your old-estimate and CRM list. Covered earlier, but it deserves its own line in any owned-channel plan. Every name you quoted and didn't close is an asset that appreciates: the roof gets older, and may take a storm, every year you wait. Re-scoring that list for which roofs have aged into the due range turns a dead file into recurring, near-free pipeline. The roofer who quoted 400 jobs last year and closed 100 is sitting on 300 roofs that are now a year more worn out, and almost none of their competitors are working that list.
Your own website and organic presence. A homeowner who finds you through search or your reputation and reaches out directly is an exclusive lead you didn't pay a marketplace for. It takes time to build, but it's the one channel where your cost per lead trends down over time instead of up, because the asset compounds. Reviews, a fast and clear website, and answers to the questions homeowners actually ask all feed this.
Geographic outbound aimed at due roofs. Mail and door-knocking are owned channels in the sense that no vendor controls the price of reaching a specific house. Their economics live or die on targeting. Blanket the ZIP and they're expensive and getting worse; aim them at the old, worn roofs and they become some of your most cost-effective acquisition, because you control exactly who receives the message.
The strategic point: when a storm hits and the auction surges, or when a marketplace ratchets its prices at renewal, the roofer who gets half their volume from owned channels barely flinches. The roofer who rents 100 percent of their pipeline takes the full hit. Building owned channels is the long game that makes every short-game cost-per-lead spike survivable.
A one-page audit you can run today
Before the 30-day plan, run this quick self-check. Score yourself honestly:
- Do you track cost per sale (not only cost per lead) for every channel? If no, that's your first gap.
- Do you separate raw leads from qualified leads? If no, your CPL is hiding a quality problem.
- Do you know your median speed-to-lead in minutes? If it's over five, you're losing paid leads to faster competitors.
- What share of your pipeline comes from owned channels (referrals, your list, your site) versus rented (marketplaces, paid ads)? If owned is under a third, you're over-exposed to auction inflation.
- Are you targeting outbound by actual roof condition, or by ZIP, year-built, or hail polygon? If the latter, most of your outbound spend is reaching roofs that aren't due.
- Do you re-work your old-estimate list on any cadence? If never, you're leaving your cheapest pipeline on the table.
Every "no" or weak answer is a lever. The plan below works through them in order of speed-to-payoff.
A 30-day plan to bring your cost per lead back down
Enough theory. Here's an operational sequence you can run starting this week. It's ordered so the fastest, cheapest wins come first.
Week 1: measure honestly
- Build the per-channel table from earlier (spend, leads, qualified leads, booked, signed, cost per sale, close rate) for the last four quarters. If you've never separated "leads" from "qualified leads," go back through a sample of 50 recent leads per channel and tag them by hand. It's tedious and it's the most valuable afternoon you'll spend this quarter.
- Calculate cost per sale, not only cost per lead, for every channel. Rank the channels by cost per sale, not by CPL.
- Flag any channel where CPL is flat but cost per sale is rising. That's a quality leak, and it's bleeding you quietly.
Week 2: cut the obvious waste
- Kill or shrink the worst channel by cost per sale. Often this is untargeted social lead-forms or a shared-lead marketplace where you can't win the speed race. Reallocate that budget; don't just bank it.
- On paid search, pull the search-terms report and add negative keywords for the junk. Tighten match types. Shift budget from broad terms to high-intent ones ("[service] quote [city]").
- On any instant-form channel, add qualification friction: a budget question, a timeframe question, a phone-verify step. Your CPL will rise and your cost per sale will fall. That's the trade you want.
Week 3: fix the speed-to-lead leak
- Measure your median time-to-first-contact on inbound leads. If it's over five minutes, you're losing winnable leads to faster competitors, and that inflates your effective cost per closed job on every channel.
- Put a system in place so every inbound lead gets a call attempt within two minutes during business hours. This is free and it's one of the highest-ROI changes in the building. A lead you already paid for that you fail to call fast is the most expensive lead of all.
Week 4: change who you spend on
- Re-score your own CRM and old-estimate list for which roofs are now due. Pull the homeowners you quoted two-plus years ago whose roofs have aged into the due range or taken a storm since. Build a re-engagement campaign aimed only at them. This is your lowest-cost pipeline and it requires zero new ad spend.
- Build your outbound (mail and knock routes) from a due-roof list instead of a ZIP or a hail polygon. Even a rough version of this beats blanketing.
- Feed your due-roof list into your paid channels as a custom audience and as an exclusion list, so you stop paying to advertise to new roofs.
Ongoing: defend the number
- Review the per-channel cost-per-sale table monthly, not the CPL dashboard. Make budget decisions on cost per job.
- Refresh creative on interruption channels (Meta) every three to four weeks before fatigue spikes your costs.
- Re-pull your due-roof list on a cadence (roofs age, storms hit) so your targeting doesn't go stale.
Edge cases and what pros get wrong
A few situations don't fit the general advice, and a few common beliefs are flat wrong. Worth naming them.
"My cost per lead spiked right after a storm. Is something broken?" No, that's expected and temporary. After a hail or wind event, out-of-area crews flood the market, ad auction prices spike for weeks, and shared leads get split among more contractors. Your cost per lead in a storm market goes up precisely when demand goes up. The counterintuitive move is to lean on your owned channels (your CRM, your due-roof mail list) during the spike, because those aren't subject to the auction surge, and to make sure you're targeting the roofs the storm actually wore out rather than fighting the swarm for every door in the ZIP.
"Between storms my cost per lead is terrible because volume dried up." This is the other half of the storm-market problem. Your fixed marketing costs spread over fewer leads, so cost per lead climbs in the quiet months. The fix is having a pipeline that doesn't depend on the weather: roofs age out every single month, storm or no storm, so a due-roof list of old roofs gives you something to work when the sky is clear. The roofers who only know how to sell after a storm have a feast-or-famine cost-per-lead chart by design.
Confusing cheap leads with good leads. Covered above, but it's the number one error, so it earns a second mention. A roofer who optimizes every decision toward lower CPL will systematically pick the worst channels, because the cheapest leads are almost always the lowest-intent ones. Optimize toward cost per job.
Ignoring close rate as a cost-per-lead lever. If your close rate goes from 1-in-10 to 1-in-7 on the same leads, your effective cost per job drops by 30 percent with zero change in lead spend. Sales training and faster speed-to-lead are "cost per lead" fixes even though they touch no marketing dollars. Owners who think of cost per lead as purely a marketing-department number leave this on the table.
Not counting the cost of rep churn. When you knock or canvass blind, green reps wash out fast, and every washout is real money: recruiting, training, and the deals a struggling rep didn't close before they quit. Routing reps to due roofs so they win early and stay is a cost-per-lead improvement that never shows up in the ad account.
Over-trusting attribution dashboards. After the privacy changes, platform-reported conversions are softer than they used to be. Meta and Google will both happily claim credit for sales they didn't drive. Trust your own closed-job data tied back to source over the platform's self-reported numbers, especially when deciding which channel to cut.
A note on storm and insurance leads specifically
If a chunk of your lead cost is tied to storm-restoration work, one clarification keeps you on the right side of the line, and it's about what you advertise and how you talk to homeowners.
You can absolutely build your targeting around which roofs likely took storm damage, inspect those roofs, document the damage thoroughly with dated photos, and write an accurate, Xactimate-aligned repair estimate for your own scope of work. That's normal, legitimate contracting, and it's where good storm targeting pays off: you spend your lead dollars on the roofs a storm actually wore out instead of the whole map.
What you cannot do, in your marketing or at the door, is the stuff that crosses into unlicensed public adjusting. Don't advertise a "free roof." Don't promise the deductible will be waived, absorbed, or made to disappear. Don't promise a specific payout or that a claim will be approved. Don't offer to negotiate, adjust, or "handle" the homeowner's claim for them, and don't interpret their policy or coverage. The clean division of labor: you document the damage and hand the homeowner an accurate estimate; the homeowner files the claim and the insurer decides coverage. Build your lead targeting and your documentation workflow around that, advertise it honestly, and the storm leads you do buy convert better because you're walking in with real evidence instead of a promise you can't legally make.
The targeting upside is the same as everywhere else: knowing which specific roofs likely took a damaging impact (modeled per roof, not read off a hail map) means your storm-season spend lands on roofs worth inspecting, which is exactly how you keep cost per qualified lead from blowing out when everyone else is fighting for the whole ZIP.
The bottom line
Your cost per lead is going up for reasons that are mostly not your fault: auction inflation, lead resale, privacy-driven targeting decay, tighter wallets, and storm swarm. You can't beat the auctions and you can't un-share a shared lead. What you can do is stop paying full price to reach roofs that don't need you.
Measure cost per job, not cost per lead. Cut the channels that look cheap and close nothing. Win the speed-to-lead race on the leads you already pay for. And aim every dollar of outbound, every ad audience, and your own old customer book at the roofs that are actually due, scored by real age and the storms each roof has actually taken. The headline CPL on your dashboard may even go up when you do this. The number that pays your bills, the cost to put a signed job on the board, comes down. That's the trade worth making, and it's the one you control.
FAQ
Why is my roofing cost per lead going up even though I haven't changed anything?
Because most of what drives it is outside your ad account. Paid channels are auctions, and more roofers bidding raises the floor every year. Shared-lead marketplaces sell each homeowner to more contractors, so the price rises while your odds of closing fall. Privacy changes made ad targeting blunter, so platforms charge more per conversion. None of that requires you to have done anything wrong. The fix isn't in your copy; it's in who you spend on and which number you optimize.
Is a lower cost per lead always better?
No, and chasing it is a common way roofers raise their real costs. The cheapest leads are usually the lowest-intent ones, so optimizing toward low cost per lead steers you into the worst channels. A roofer paying twice the cost per lead can have less than half the cost per signed job if their leads are qualified. Always rank channels by cost per sale, not by cost per lead.
What's the difference between cost per lead and cost per acquisition?
Cost per lead is spend divided by hand-raisers (form fills, calls). Cost per acquisition (or cost per sale) is spend divided by signed jobs. Cost per lead can stay flat while cost per acquisition explodes, because the leads got worse without getting more expensive per unit. Customer acquisition cost is the fully loaded version that also counts the labor, sales time, and overhead to chase the lead. The last two determine whether you're profitable; the first one is just the easiest to see on a dashboard.
Why are shared roofing leads getting more expensive and less valuable at the same time?
Because the marketplace's incentive is opposed to yours. As more contractors join, demand lets the platform charge more per lead, while each lead gets split among more buyers, lowering your odds of closing it. You're often paying for a lead and a race you can't win unless you dial within seconds. The effective cost per winnable lead is far higher than the sticker price, and the cost per closed job is higher still.
Did Apple's privacy changes really raise my Facebook lead costs?
Yes, meaningfully. App Tracking Transparency and the move away from third-party cookies stripped Meta of much of the signal it used to find your buyer cheaply. It now shows your ad to more people to find the same conversions, which raises cost per result, and platform-reported attribution got softer, so the dashboard overstates what the channel actually drove. Trust your own closed-job data tied back to source over the platform's self-reported numbers.
Should I just increase my budget to get more leads?
Usually not. In an auction channel, spending more to get more volume means buying the marginal lead, which is the worst and most expensive one, so your cost per lead and cost per sale both tend to rise. More volume at lower quality is how budgets balloon while margin shrinks. Fix targeting and channel mix first; add budget only to channels that already convert well.
How do I figure out whether I have a lead-cost problem or a conversion problem?
Pull spend, leads, qualified leads, booked inspections, and signed jobs per channel for the last year. If cost per lead is rising but close rate is steady, it's a lead-cost (auction) problem, so fix targeting and channel mix. If cost per lead is flat or falling but cost per sale is rising, it's a quality problem, so qualify harder or kill the channel. If both are rising, attack quality first because it's faster.
How does targeting by roof age and storm history lower my cost per lead?
It changes the denominator. A large share of every channel's spend lands on homeowners whose roofs aren't due, which you can't tell from year-built, ZIP, or a hail map. Scoring roofs by an age range (from aerial imagery) and the storms modeled on each specific roof lets you point mail, knock routes, and ad audiences at the roofs that are actually worn out. The per-piece or per-click cost is unchanged, but a bigger share reaches real prospects, so cost per qualified lead and cost per job both fall.
Can RoofPredict give me an exact roof age and guarantee a roof is damaged?
No, and be skeptical of anyone who claims that. Roof age comes back as a range, like 18 to 22 years, because that's what aerial imagery can responsibly support. The storm model gives odds that a roof was impacted, not proof, so a high-risk roof still needs an actual inspection to confirm. It isn't a lead service and won't hand you a stranger's contact info; it ranks the roofs most likely to be due so you can sharpen the outbound and old-customer list you already have.
My cost per lead spikes after every storm. Is that a problem I can fix?
The spike itself is normal: out-of-area crews flood the market, ad auctions surge for weeks, and shared leads split among more contractors. You can't stop the surge, but you can lean on owned channels during it, your CRM and your due-roof mail list, which aren't subject to the auction. And target the roofs the storm actually wore out instead of fighting the whole ZIP. To smooth the quiet months between storms, work a list of old roofs that age out regardless of weather.
The Roofline by RoofPredict
Stay Ahead of Roofing Market Changes
Join The Roofline by RoofPredict for weekly roofing intelligence: material price signals, storm demand, insurance and regulatory updates, sales tactics, and local contractor opportunities.
Sources
- NRCA - National Roofing Contractors Association — nrca.net
- IBHS - Insurance Institute for Business & Home Safety — ibhs.org
- NOAA Storm Prediction Center — spc.noaa.gov
- National Weather Service — weather.gov
- NOAA Storm Events Database — ncdc.noaa.gov
- FTC - Advertising and Marketing Basics for Business — ftc.gov
- Texas Department of Insurance - Public Insurance Adjusters — tdi.texas.gov
- U.S. Census Bureau - American Housing Survey — census.gov
- U.S. Bureau of Labor Statistics - Roofers — bls.gov
- USPS - Postal Prices and Notices — usps.com
- Apple - App Tracking Transparency — developer.apple.com
- Google - About Local Services Ads — support.google.com
- International Code Council - International Residential Code — iccsafe.org
- RoofPredict — roofpredict.com
Related Articles
Roofr Review for Roofing Contractors: Is It Worth It?
A practitioner's take on whether Roofr is worth it for your shop — what it does well, where it leaves gaps, and how to match the tool to your actual bottleneck.
How to Dispute Bad Local Services Ads Leads for Roofing (and Stop Paying for Junk)
A field-tested workflow for disputing bad Google Local Services Ads leads in roofing—what actually qualifies for a credit, the evidence to capture, and how to stop paying for junk in the first place.
Networx vs Hearth vs Thumbtack for Roofing Leads: What Each One Actually Sells You
Networx sells shared leads, Hearth sells financing, and Thumbtack sells a marketplace. Here's what each one really does for a roofing contractor, where the money leaks, and the targeting math that beats all three.