Back to Blog

Marketing Campaign Analytics for Contractors: Which Ad Brought the $14K Install?

Pipeline Research Team
Blog

Key Takeaways

  • Only 23% of small businesses accurately track marketing ROI according to industry surveys
  • Home service CPL averages $90.92 in 2025 - roofing hits $228, cleaning sits at $47
  • Separating repair vs install Google Ads campaigns reveals 30-60% ROAS gaps that single-campaign accounts mask
  • Import offline conversions from your CRM to Google Ads within 90 days of the click - Smart Bidding then optimizes for booked jobs, lifting ROAS 20-40%

Only 23% of small businesses accurately track their marketing ROI, per industry survey data cited by JobNimbus.

The other 77% are running Google Ads, postcards, and LSAs without knowing which one paid for the new truck. The average home service cost per lead in 2025 is $90.92 according to LocaliQ’s analysis of 3,200+ home service campaigns. Roofing hits $228.15. Cleaning sits at $46.99.

Those numbers are useless without campaign-level analytics. You need to know which Google Ads campaign brought the $14,000 furnace install, not just that your overall CPL is $87.

What is marketing campaign analytics for contractors?

Campaign analytics is the system that connects ad spend to booked revenue at the campaign level.

Not the channel level. The campaign level. A channel report tells you Google Ads spent $4,200 last month. Campaign analytics tells you the “Furnace Replacement - North Suburbs” campaign spent $1,800 and produced two $14K installs.

Most contractors stop at channel reporting because that’s what the platforms show by default. Coalmarch’s 2026 home services ROI guide calls this the single biggest gap in contractor marketing measurement.

You need three layers working together: GA4 for behavior data, CallRail (or CallTrackingMetrics, WhatConverts) for call attribution, and offline conversion imports tying both back to closed jobs in your CRM.

Why channel-level data lies to you

Say your Google Ads account spent $4,000 last month and produced 50 leads.

Channel math says CPL is $80. Looks fine.

But inside that $4,000 sits a “24/7 Emergency Plumber” campaign at $52 CPL with 70% close rates, and a “Bathroom Remodel” campaign at $340 CPL with one estimate that ghosted. One is printing money. One is on fire. Channel-level reporting hides both.

ServiceTitan’s HVAC ads guidance is blunt about this: most HVAC contractors run one campaign for everything, and the fix is separating campaigns by service type - repair, install, maintenance - so you can track each independently.

If you can’t see campaign-level cost per booked job, you can’t kill the dead campaign or scale the winner. You’re just averaging your way into mediocrity.

How do you actually set this up?

Three tools, wired together. None of them work alone.

Layer 1: GA4 with conversion events

GA4 tracks behavior on your site. By default it ignores phone calls, which is 65% of your leads per Invoca’s consumer call data.

You need custom events for click-to-call, form_submit, and quote_request. Set them as conversion events in Admin. Link GA4 to Google Ads so the conversion data imports automatically.

See our GA4 setup guide for home services for the click-by-click on this.

Layer 2: CallRail (or equivalent) with dynamic number insertion

CallRail assigns a different tracking number to every campaign. Visitor from “Furnace Replacement - North Suburbs” sees one number. Visitor from “Emergency AC Repair” sees a different number. Organic search sees a third.

When the phone rings, CallRail knows exactly which campaign drove it. Pricing runs $45 to $100/month for most contractors, which the CallRail integration docs confirm pays back instantly when you can attribute a single install.

Set the minimum call duration to 60-90 seconds so wrong numbers and hangups don’t count as conversions. That’s standard advice from CallRail’s own help center.

Layer 3: Offline conversion imports

This is where most contractors stop, and it’s where the money lives.

A call isn’t a job. A form fill isn’t revenue. You need to push the actual booked-job outcome back into Google Ads so Smart Bidding optimizes for installs, not for ringing phones.

CallRail’s manual conversion import for Google Ads handles this. Or you wire it up through Zapier from your CRM. When the job closes in ServiceTitan, Housecall Pro, Jobber, or Workiz, the revenue gets sent back to Google Ads tagged to the original click.

ACHR News’ 2026 Google Ads guide calls offline conversion imports “non-negotiable” for HVAC advertisers serious about ROI.

Which Google Ads campaign brought the $14K install?

Here’s the actual question contractors care about. Walk through how the stack answers it.

Customer searches “furnace replacement near me” at 11pm in February. Clicks your ad. Lands on your install page. Sees a CallRail number. Hangs up because it’s late.

Three days later they call the same number during business hours. CSR books an estimate. Tech runs the appointment. Sells a $14,200 furnace install on a 5-year financing plan.

Without campaign analytics, you see “phone call lead, $14K job.” You don’t know the ad existed.

With the stack: CallRail attributes the call to the “Furnace Replacement - North Suburbs” campaign because the number was dynamically inserted from that source. Your CRM tags the job with that source. Offline conversion import pushes $14,200 revenue back to that campaign in Google Ads. Now you can see: campaign spent $1,800 last month, produced $28,400 in install revenue, ROI is 15.8x.

That’s the number you build budget decisions on. Not “Google Ads is working.”

What about postcards, LSA, and yard signs?

Same logic, different mechanism.

For Local Services Ads, Google’s own dashboard shows campaign-level lead data but not job revenue. You manually mark leads as booked inside LSA, then sync the close data from your CRM. Our LSA optimization guide covers this workflow.

For postcards, use a unique tracking number per mailing or a promo code that gets recorded at booking. Direct mail ROI data from ServiceTitan’s 2026 direct mail guide shows trackable postcards average 1-3% response, untracked ones average “you have no idea.”

For yard signs, a unique CallRail number per neighborhood works. One roofer on r/sweatystartup tracked $48,000 in revenue from yard signs alone in a season by using neighborhood-specific tracking numbers. Without the unique numbers he’d have credited it all to “word of mouth.”

What metrics actually matter?

Forget vanity metrics. Forget impressions and CTR for budget decisions.

These five run the business:

Cost per booked job by campaign. Total spend divided by closed jobs from that specific campaign. Not leads. Jobs.

Revenue per campaign. Total booked revenue tagged to that campaign source over a 30, 60, and 90-day window.

Close rate by campaign. Some campaigns produce tire-kickers. Some produce buyers. Same CPL can mean wildly different close rates.

Average ticket by campaign. Emergency repair campaigns produce $400 tickets. Install campaigns produce $8,000 tickets. Don’t average them.

ROAS by campaign. Revenue divided by ad spend. Below 3x is suspicious for home services. Above 8x is normal for well-targeted install campaigns.

The marketing metrics deep dive covers the math on each of these.

Common mistakes that gut your analytics

The fastest way to break campaign analytics is to stop being disciplined about source tagging.

Letting calls go to your main business number instead of a tracking number. Now you have no attribution. Forced first answer “I just Googled you” doesn’t tell you which Googling.

Not separating Google Ads campaigns by service type. Running one “HVAC” campaign with repair, install, and maintenance keywords mixed together means you can’t optimize. Anthony Louis Media’s 2026 HVAC ads breakdown calls this the #1 mistake.

Skipping offline conversion imports. Google’s Smart Bidding optimizes for whatever you tell it. If you tell it “phone call,” it’ll bid for tire-kickers. If you tell it “booked job worth $X,” it bids for buyers. The difference shows up in 60-90 days.

Looking at last week’s data on long sales cycles. An install lead from organic search might take 45 days to close. Looking at this week’s revenue against this week’s spend misattributes everything.

Not tagging the lead source in the CRM at the start. If the CSR doesn’t record the source during the booking call, the data is dead before it starts. See how to track lead sources for the CSR script.

Which platforms work for contractor campaign analytics?

You don’t need a Salesforce-scale stack. You need three things talking.

Tracking layer: CallRail, CallTrackingMetrics, or WhatConverts for calls. GA4 for site behavior. Pick one call tool and stick with it.

CRM/FSM layer: ServiceTitan, Housecall Pro, Jobber, or Workiz. Whichever you already use. The only requirement is a “lead source” field that follows the customer from first call to closed job.

Ad platforms: Google Ads with offline conversion import enabled. Meta Ads with the Conversions API installed. LSA with manual lead tagging.

Compare options in the CRM showdown for home service and paid ads analytics tools for contractors.

How long until you see useful data?

30 days for early signal. 90 days for decisions.

First 30 days you’ll see which campaigns produce calls and form fills. Useful, but incomplete. Don’t kill campaigns yet.

By day 60, the install jobs start closing and offline conversion imports start populating revenue data. Now you can see ROAS by campaign for the first time.

Day 90 is the decision point. Three months of revenue attribution is enough to kill dead campaigns, scale winners, and reallocate budget. JobNimbus’s contractor ROI guide recommends the same 90-day cadence.

Don’t make budget decisions on 14 days of data. You’ll kill campaigns mid-ramp and scale lucky outliers.

Marketing campaign analytics FAQ

Q: Do I really need CallRail if I have GA4?

Yes. GA4 tracks phone clicks on mobile. It doesn’t track desktop callers who dial manually, after-hours callers who come back the next day, or which campaign drove the call. CallRail’s dynamic number insertion is the only way to attribute calls to campaigns at scale.

Q: How much does this stack cost?

CallRail starts around $45/month. GA4 is free. Your CRM you already pay for. Offline conversion imports via Zapier add maybe $20/month. Call it $65 to $120/month total. One attributed install pays for two years of tracking.

Q: Can I just look at Google Ads’ built-in reporting?

No. Google Ads shows you cost per conversion where “conversion” is whatever you defined. If you defined it as “phone call,” Google will bid for callers. If you defined it as “booked job worth $X via offline import,” Google will bid for buyers. The difference between those two outcomes is your ROI.

Q: What about Local Services Ads, do they need the same setup?

LSA has its own attribution problems. You see leads inside LSA but Google doesn’t know the job outcome unless you mark it. Mark every LSA lead as booked, not booked, or junk - it trains the algorithm and gives you campaign-level ROAS.

Q: My ad agency says they handle all this. Do they?

Ask them for last month’s report broken down by campaign with cost per booked job and ROAS. If they can’t produce it, they’re not running campaign analytics - they’re running channel reporting. Big difference.

Start with the question, not the dashboard

Campaign analytics isn’t a software purchase. It’s a discipline.

The question is always: which specific campaign brought this specific job? If your stack can’t answer that for the last $14K install you booked, the rest of the data is noise.

Start with one campaign. Tag the leads. Import the offline conversion. Watch what happens over 60 days. Then expand.

For the bigger picture on connecting ad spend to closed revenue, read the marketing attribution guide for home service. For the granular how-to on call tracking specifically, check call tracking vs form tracking.

The contractors who measure right don’t always spend more. They spend on what works.