Google Ads says you got 42 leads last month. Your CRM shows 18 booked jobs, 9 of which came from "direct" or "unknown." Your office manager's spreadsheet says something completely different. Somewhere in there is the truth about what your campaigns are actually doing. You just have no idea where it is.
The Problem: Google Is Optimizing on the Wrong Thing
Here is what Google Ads actually "knows" about your business right now, out of the box:
- Someone clicked your ad
- They called the number on your landing page
- The call lasted more than 60 seconds (or 30, or whatever you set)
That is it. Google counts that as a conversion. A homeowner calls, gets routed to voicemail, leaves a 90-second message about needing their AC looked at, hangs up without ever getting a callback — and Google just lit up its dashboard like you closed a deal. Conversion count: 1. Campaign looking great.
"Our Google Ads account showed 47 conversions last month. I called my CSM and asked how we booked 47 jobs from Ads. She said 'oh those are calls, not jobs.' I had 11 booked jobs from Google Ads. We were paying $4,200 to optimize on phone calls that apparently weren't converting."
And here is where it gets expensive. Google's Smart Bidding — Target CPA, Target ROAS, Maximize Conversions — is constantly adjusting how much it bids on every auction. It raises bids on searches that tend to convert, lowers bids on searches that do not. The problem is it only knows what you tell it. If you tell it "a 90-second call is a conversion," it will go find you more 90-second calls. Some of those will be good leads. Plenty will be tire-kickers, wrong numbers, and people who wanted a quote for a job you do not do.
"I paused my lowest CPL campaign because I thought it was underperforming. Revenue from Google Ads didn't change at all that month. Turns out that campaign had the lowest CPL because it was generating service calls at $450 average job value. My 'high CPL' campaign that I kept running was generating replacement installs at $6,000 average job value. I had it completely backwards."
The fix is connecting what happens in your field software back to what Google is spending money on. When a job closes in your CRM, that revenue needs to flow back to the specific ad click that started it. That process is called closed-loop attribution, and it changes how your campaigns run at a fundamental level.
GCLID: The Invisible Thread That Ties Everything Together
Every time someone clicks your Google ad, Google attaches a unique identifier to the URL. It looks like this:
https://yourdomain.com/hvac-service?gclid=CjwKCAiA0bWvBhBjEiwAtEsoW...
That string is the GCLID — Google Click ID. It is unique to that specific click, from that specific ad, at that specific moment. No two clicks share the same GCLID.
If you capture that GCLID when the person fills out your contact form, and store it in your CRM against that customer record, then when the job closes six days later you can send that GCLID back to Google with the actual job revenue. Google then knows: the search "emergency HVAC repair near me" on Tuesday at 2pm, from this specific ad, generated $1,840 in revenue. Now it has something real to optimize on.
Without capturing the GCLID, there is no link. The job closes. The revenue goes into your CRM. Google has no idea it happened. The loop never closes.
How GCLID Capture Actually Works
Go to Google Ads → Settings → Account Settings → Auto-tagging. Make sure it is turned on. Without this, no GCLIDs are appended to your URLs. This is the most common setup mistake and the most expensive one.
Add a hidden input to every form on your Google Ads landing pages: <input type="hidden" name="gclid" id="gclid_field">. A small JavaScript snippet reads the gclid URL parameter and populates that field when the page loads.
Your CRM needs to receive and store the GCLID on the lead or customer record. How this works depends on your CRM — more on each below.
When a job is marked complete in your CRM, a conversion record — with the GCLID and job revenue — gets sent to Google Ads. Google matches it to the original click and updates campaign data with real revenue figures.
Curious what Google Ads could generate with properly tracked conversions? Run the numbers on your trade and market.
Try the Google Ads ROI Calculator →Dynamic Number Insertion: The Foundation of Phone Call Tracking
About 70-80% of contractor leads come through phone calls, not form fills. A perfect GCLID setup still misses most of your leads unless you also track calls.
Dynamic Number Insertion (DNI) is a JavaScript snippet from your call tracking platform that swaps the phone number on your website based on the visitor's traffic source.
- Visitor from Google Ads → sees Tracking Number A (routes to your real number)
- Visitor from organic search → sees Tracking Number B
- Direct visitor → sees your real business number
Every call to Tracking Number A gets logged as a Google Ads call conversion. The call is recorded, you see the caller's name and number, and the data flows into your reporting stack. When that caller books a job, you can match it back to their original ad click.
ServiceTitan + Google Ads: The Native Integration
ServiceTitan has a built-in Google Ads integration most contractors using both platforms are not fully using. It is called the Marketing Pro Ads Optimizer. When set up correctly, it does something most contractor software cannot: it sends actual closed job revenue back to Google as a conversion value, not just a call signal.
What ServiceTitan Ads Optimizer Actually Does
When a customer calls from a Google Ad and books through ServiceTitan, Ads Optimizer captures the GCLID from that call and associates it with the customer record. When the job is marked complete, it fires an offline conversion to Google with the job's invoice total. Smart Bidding now knows that "water heater not working" generated a $1,420 job, while "water heater cost" generated a $0 conversation.
Over time, this trains Google to bid more on high-intent searches that produce booked, high-value jobs, and bid less on research queries that consume budget without converting. The improvement in cost per booked job is typically 20-35% over three to four months compared to optimizing on raw call volume.
ServiceTitan Native Call Tracking
ServiceTitan also includes native call tracking through Marketing Pro. This provisions phone numbers tied to your campaigns directly inside ServiceTitan, handles DNI on your website, and connects inbound calls to customer records automatically. When someone calls your Google Ads tracking number, ServiceTitan creates or matches a customer record, logs the call, and if a job gets booked, tags the job to the campaign.
- Enable Marketing Pro in your ServiceTitan account
- Connect your Google Ads account under Marketing → Integrations
- Enable auto-tagging in Google Ads
- Set up campaign tracking numbers in Marketing Pro → Call Tracking
- Add the ServiceTitan DNI snippet to your website
- Create a "Booked Job" or "Closed Revenue" conversion action in Google Ads and link it to the Ads Optimizer import
The ServiceTitan Booking Form Question
If you use ServiceTitan's online booking form on your website, make sure the form is embedded on your landing pages — not redirecting to a separate ServiceTitan-hosted URL. When someone submits a form on a third-party URL, the GCLID from your landing page gets dropped. The job books but Google never gets credit. This happens constantly with contractors who use ServiceTitan's hosted booking pages for Google Ads traffic.
ServiceTitan Verdict
If you are on ServiceTitan and running Google Ads, native Ads Optimizer is the right path. It captures revenue from both calls and form submissions in one system, and it keeps everything inside ServiceTitan without adding another vendor. Setup takes about two to three hours and your ServiceTitan success manager can walk you through it.
Housecall Pro + Google Ads: UTMs and Zapier
Housecall Pro does not have a native Google Ads revenue integration. The best approach is UTM parameters, landing page form capture, and a Zapier automation that fires offline conversions to Google when jobs close.
The UTM Approach
UTM parameters are tags you add to your ad destination URLs:
https://yourdomain.com/hvac?utm_source=google&utm_medium=cpc&utm_campaign=hvac-emergency
When someone lands on your page, your website reads those UTM values and stores them. If they submit a form, those values get passed to Housecall Pro with the lead. You know the form lead came from Google Ads, from the hvac-emergency campaign. The limitation: UTM attribution does not give you keyword-level tracking the way GCLID does, and it does not send revenue back to Google automatically.
The Zapier Bridge
Set up a Zap that fires when a job reaches "Completed" status. The trigger data includes job total, customer name, and source tag.
Add a filter step so the Zap only continues if the job's source is tagged as "Google Ads." This prevents every closed job from being imported as a Google Ads conversion.
Use Zapier's native Google Ads integration to fire an offline conversion upload with the conversion action name, the GCLID (if captured on the form), and the job total as conversion value.
Housecall Pro Verdict
The UTM + Zapier approach works but has gaps. Phone call GCLID capture requires CallRail on top of the Zap setup. Budget for a few hours of setup and expect some attribution gaps for phone-heavy campaigns. Still significantly better than tracking nothing but raw calls.
Jobber + Google Ads: CallRail Is Your Bridge
Jobber is excellent field service software with a straightforward interface that smaller contractors love. It is not built for deep ad attribution. There is no native Google Ads integration, no GCLID capture, and the form handling is basic. If you are running Google Ads and using Jobber, you need an external call tracking platform to close the loop.
CallRail is the most practical choice for several reasons: it has a native Jobber integration that logs call data and contact info directly into Jobber, it captures GCLIDs from Google Ads calls, it can send offline conversions to Google Ads via their Zapier integration, and it handles DNI on your website with a simple JavaScript snippet.
The CallRail + Jobber Setup
Create a number pool in CallRail for DNI, or a single tracking number assigned to Google Ads. Connect your Google Ads account to CallRail under Integrations. Enable auto-tagging in Google Ads.
Add CallRail's JavaScript snippet to your landing pages. This handles the dynamic number swap for Google Ads visitors and captures GCLIDs from the URL when calls come in.
Enable the Jobber integration in CallRail under Integrations → Jobber. When a call comes in, CallRail creates or updates a contact in Jobber with the caller's info and tags the call source as Google Ads.
When a job is marked complete in Jobber with a Google Ads source tag, a Zap fires a Google Ads offline conversion using the GCLID stored in the CallRail record.
Jobber Verdict
CallRail bridges most of the gap for phone-heavy campaigns, and the CallRail-to-Jobber integration is solid. For contractors getting 80%+ of their leads by phone, this setup captures what matters. For contractors with significant form traffic or long-cycle commercial leads, Jobber's lack of native Google Ads integration is a meaningful limitation.
Offline Conversion Imports: Training Google on Real Revenue
Once you have the GCLID flowing into your CRM and jobs are being tagged, the final step is getting that data back into Google Ads via offline conversion imports. There are two methods: batch upload and API-based.
Batch Upload (Simpler)
Once a week or daily, export a CSV from your CRM or Zapier log with two columns: the GCLID and the job revenue. Upload this to Google Ads under Tools → Conversions → Uploads. Google matches the GCLIDs to the original clicks and updates conversion data retroactively. The downside is the delay — Smart Bidding does not see the revenue signal until days after the job closes, which is fine for most contractors running campaigns with steady weekly volume.
API-Based (Automated)
ServiceTitan's Ads Optimizer and properly configured Zapier automations both use Google's offline conversion import API, which means the signal hits Google within a few hours of the job closing. Smart Bidding picks it up faster, especially useful during high-volume seasonal periods where your campaign mix is changing week to week.
What Changes When Smart Bidding Has Real Revenue Data
The improvement is not immediate and it is not magic. It takes roughly 30 to 60 days of revenue signals before Smart Bidding materially adjusts its behavior. Over 90 days after closing the attribution loop, here is what typically happens:
- Bid pressure on high-intent keywords ("not working," "emergency," "broken") increases because those searches produce booked jobs
- Bid pressure on informational queries ("how much does X cost") decreases because those produce calls that do not convert
- Cost per booked job drops 15-30% while total lead volume stays flat or increases slightly
- Your agency stops being able to hide behind CPL numbers that do not reflect actual revenue
That last point is worth saying plainly. A lot of contractor Google Ads management is optimized on cost per lead because that is easy to measure. If your agency reports that CPL dropped from $85 to $62, that looks great. But if those cheaper leads average $400 per job versus the $1,400 average from the leads they stopped sending you, lower CPL is actually worse performance. Revenue-based attribution makes the real picture visible.
CallRail vs. Native CRM Tracking: The Honest Breakdown
| Feature | ServiceTitan Native | CallRail | HCP + Zapier | Jobber + CallRail |
|---|---|---|---|---|
| GCLID capture (calls) | Yes | Yes | Via CallRail | Yes |
| GCLID capture (forms) | Yes | Requires setup | Manual setup | Manual setup |
| Revenue sent to Google | Yes (Ads Optimizer) | Via Zapier/API | Via Zapier | Via Zapier |
| Multi-channel attribution | Google Ads only | Yes (all sources) | UTM-based only | Yes |
| Call recordings | Yes | Yes | No | Yes |
| Monthly cost | Included in Marketing Pro | $45-$150/mo | ~$50/mo Zapier | $45-$150/mo + Zapier |
The main reason to use CallRail even if you are on ServiceTitan is multi-channel attribution. ServiceTitan Ads Optimizer tracks Google Ads very well. But if you also want to know which organic calls convert, what LSA calls produce versus paid search, and how your Yelp or Angi spend compares — CallRail gives you a single dashboard for all of it. ServiceTitan's native tracking is Google Ads only.
For most residential service contractors running Google Ads and LSA, ServiceTitan's native tracking plus the LSA reporting inside the LSA dashboard gives you what you need without extra expense. If you run complex multi-channel campaigns or manage multiple locations, CallRail is worth the monthly fee.
The Full Attribution Stack (What Good Looks Like)
Complete Revenue Attribution Flow
Common Mistakes That Break the Loop
- Auto-tagging is off in Google Ads. The GCLID never appends to the URL. Nothing works. This is the most common reason attribution fails completely.
- Landing pages redirect before the form loads. If your ad destination URL redirects to a different page, the GCLID in the original URL gets dropped. Keep ad traffic on the exact page the ad promises.
- ServiceTitan booking form hosted on a subdomain. Forms at
book.yourdomain.comor on ServiceTitan's own domain lose the GCLID from your main landing page. Embed the form directly, or use a redirect that preserves the GCLID parameter. - Zapier automation breaking silently. Zaps fail all the time and free plan Zapier does not alert you about failures. Check your Zap history monthly. A broken automation can quietly lose attribution data for weeks.
- CSRs not tagging the job source. If your pipeline depends on a "Google Ads" source tag applied during booking, and CSRs are not applying it consistently, large portions of closed jobs never get imported as conversions. Build the source tag into your intake process and train on it specifically.
- Importing booked appointments instead of closed jobs. Import on invoice paid or job complete — not appointment booked — for the cleanest revenue signal to Google.
gclid= parameter. Submit a test form. Check your CRM — the test record should have a GCLID field populated. If it does, the first half of your loop is working.
CRM Summary: Which Setup Is Right for You
ServiceTitan
Native IntegrationUse Marketing Pro + Ads Optimizer. Captures calls and forms. Sends real job revenue to Google. Best attribution accuracy without adding third-party tools. Recommended if you are already on Marketing Pro.
Housecall Pro
UTM + ZapierUse UTM parameters on ad URLs, add GCLID capture to landing page forms, and build a Zapier automation that fires offline conversions when jobs close. Add CallRail for phone GCLID capture. Solid for phone-heavy campaigns.
Jobber
Requires CallRailCallRail handles call GCLID capture and integrates natively with Jobber. Use Zapier to fire offline conversions when jobs close. Works well for call-heavy campaigns. Form attribution requires extra manual setup.
Frequently Asked Questions
Does ServiceTitan integrate directly with Google Ads?
Yes. ServiceTitan has a native Google Ads integration called Ads Optimizer that sends actual job revenue back to Google. When a booked job closes, the real revenue value is imported into Google Ads as an offline conversion. This trains Smart Bidding on what campaigns actually generate revenue, not just phone calls.
What is GCLID and why does it matter for contractor attribution?
GCLID stands for Google Click ID. Every time someone clicks your Google Ad, Google appends a unique GCLID to the URL. If your website captures that ID and passes it through to your CRM when the lead books, you can later import that conversion back to Google with the actual job value. Without GCLID capture, there is no way to connect a closed job back to the specific ad that generated it.
Should I use CallRail or ServiceTitan's native call tracking?
If you are a ServiceTitan user, native call tracking inside ServiceTitan plus Ads Optimizer is the better path. It keeps everything in one system and sends revenue data (not just calls) to Google. CallRail is a better fit for Housecall Pro and Jobber users, or any contractor who needs multi-channel attribution across Google Ads, LSA, and organic simultaneously.
Can Housecall Pro connect to Google Ads for revenue tracking?
Housecall Pro does not have a native Google Ads revenue integration. The best approach is UTM parameter tracking on your landing pages, combined with a Zapier automation that fires a Google Ads offline conversion import when a job is marked as complete in Housecall Pro. This requires some setup but gives you closed-job attribution without a third-party call tracking platform.
What is Dynamic Number Insertion and do I need it?
Dynamic Number Insertion automatically swaps the phone number on your landing page based on the traffic source. Visitors from Google Ads see a unique tracking number. Visitors from organic search or direct traffic see your real number. This lets you track calls by channel without maintaining separate landing pages for each source. Since 70-80% of contractor leads come through calls, DNI is essential if you want accurate attribution.
How do offline conversion imports affect Smart Bidding?
Smart Bidding works best when the conversion data you feed it reflects real business outcomes. If you import closed job revenue as the conversion, Google's algorithm learns to bid more aggressively for searches that produce high-value customers and pull back on searches that produce low-quality leads. This directly improves cost per booked job over time compared to optimizing on raw call volume.
Want to see what your Google Ads spend could generate with proper tracking in place?
