Roofing has the highest customer LTV and the most competitive paid acquisition of any home service category. It also has, in our audit data, the highest rate of Google Ads accounts hemorrhaging money. After running through several dozen roofing accounts (some ours, some prospects), the same four configuration errors appeared in roughly 90% of them. Here's the diagnosis.
Error #1: Broad match keyword bidding
Default Google Ads behavior — and what most contractors set up — is to bid on keywords in broad match. Broad match means your ad shows for 'related' queries Google decides are relevant. For 'roof replacement Kansas City,' broad match will trigger your ad on: 'how to install roofing nails,' 'roof rake removal,' 'is roof replacement tax deductible,' 'roofing jobs in Kansas City' (job seekers, not customers), and dozens more queries with no buying intent.
Error #2: Empty or shallow negative keyword list
Every roofing account should have at least 200 negative keywords on day one and 500+ within 90 days. Mining the search-term report weekly is non-optional. Common negative buckets that go unfilled:
- Career/job seekers: 'jobs,' 'careers,' 'hiring,' 'apprenticeship,' 'salary'
- DIY queries: 'how to,' 'DIY,' 'replace yourself,' 'tutorial'
- Wholesale/supplier queries: 'wholesale,' 'supplier,' 'manufacturer,' 'parts'
- Irrelevant materials: if you don't do metal, negative 'metal'; if you don't do flat, negative 'flat'
- Out-of-area cities: explicit list of cities you don't service
- Pure information queries: 'definition,' 'meaning,' 'what is'
Error #3: Missing or broken conversion tracking
If you can't measure cost per phone call and cost per form submission, you can't optimize. Yet conversion tracking is missing or broken on the majority of accounts we audit. Calls fire on the wrong threshold (a 5-second call counts as a conversion — it shouldn't), form tracking doesn't actually fire on submit, or both are wired to GA4 but not to Google Ads itself so Smart Bidding can't use the data.
Proper setup: call tracking that fires conversion only on calls 30+ seconds (qualified), form tracking that fires on success page load only, both linked to Google Ads via the conversion linker, both visible in the Conversions report. If you can't see weekly conversion volume per campaign, your account is operating blind.
Error #4: Ad-to-landing-page mismatch
Ad copy promises 'free roof inspection in Kansas City.' Click. Landing page is the homepage, which is about gutter cleaning, siding, and replacement windows, with the roof inspection offer buried three scrolls down. Conversion rate plummets. Cost per acquisition skyrockets. Google's Quality Score drops, which makes every future click more expensive.
Each ad group should have a dedicated landing page that matches the ad copy promise. Headline mirrors the ad. Primary CTA is the conversion action (call or form). No global nav distractions. One offer per page. We build 5-15 of these per roofing account at launch.
What 'fixed' looks like in numbers
Typical pre-fix roofing account in KC: $4,500/mo ad spend, ~18 booked-job leads, cost per qualified lead around $250. After applying the four fixes above, same spend, ~32-40 booked-job leads, cost per qualified lead around $115-140. That's not a marginal improvement — it's the difference between a paid acquisition channel that loses money and one that prints it.