- CallRail and ServiceTitan count conversions differently, and that difference is the point. One proves which channel produced net-new demand; the other proves what that demand was worth.
- Industry write-ups put the “unknown source” bucket at 30 to 60 percent of inbound calls in a typical ServiceTitan account. Fixing that sits at the tracking layer, above any bid change.
- The native CallRail to ServiceTitan integration is free, per CallRail’s documentation. It needs ServiceTitan’s Marketing Pro Ads Package, call tracking, and a website number pool.
- Google Smart Bidding and Meta’s delivery both learn to chase booked-job revenue once it flows back to them, instead of chasing phone calls and form fills.
- Every figure on this page that came from contractors, agencies, or vendors is labeled that way. None of it is a Magister client result, and none of it is a promise.
The Work That Happens Before the First Ad Runs
A home-services company books a solid install job. The CSR asks how the caller heard about them. The answer lands in ServiceTitan as “Google.” Which Google? Paid search? The map listing? A Local Services ad? Nobody can say, and next month’s budget gets planned on that shrug. At Magister Digital AI, closing that blind spot is where marketing for home-services companies actually starts. Before we run Meta or Google ads for an HVAC, plumbing, electrical, or garage door client, we don’t assume we already know what’s working. We build the measurement first. This post is the real pre-flight walkthrough: the attribution architecture we stand up for a multi-location home-services account, wired around CallRail and ServiceTitan, and how we decided to run the two together. One thing this post is deliberately missing: revenue promises. Where we quote figures, they’re contractor, agency, or vendor reported, and labeled that way every time. The build takes roughly four weeks from kickoff to a live closed loop across Google and Meta. What follows is what happens inside those weeks, and the honest limits we work within.What Has This Architecture Produced Elsewhere?
Contractors, agencies, and ServiceTitan have reported strong results from this closed-loop pattern, including cost per booked job dropping 30 to 50 percent within 90 days. We show these figures to describe what the architecture can do when it’s built correctly. They are third-party and vendor reported, and none of them is a Magister client result or a guarantee.| Reported outcome | Detail | Who reported it |
|---|---|---|
| 30 to 50 percent lower cost per booked job | Within 90 days on the full stack | Industry and vendor write-ups |
| Roughly 100 percent ROI lift in one month | Plumbing client using Ads Optimizer; lead quality moved from 44 to 60 percent | Vendor-reported case |
| $2M to $40M in attributed non-brand Google Ads revenue per year | Enterprise HVAC, plumbing, and electrical brands | Agency-reported case |
| $71 per booked job | $2,000 per month in Google Ads producing 28 booked jobs and $12,600 in booked revenue | Agency-reported case |
| 30 percent lead-conversion lift in two months | Denver HVAC company after restructuring | Agency-reported case |
Why Do We Run Both CallRail and ServiceTitan?
Because they count different things, and you need both counts. CallRail counts each caller once, at first touch, and proves which channel produced net-new demand. ServiceTitan tracks that same contact through Lead, Booked, Ran, Sold, and Revenue. Integrated, they put cost per new lead and cost per booked job on the same campaign in the same dashboard. Run alone, either tool gives you half an answer. Here’s the split.| The question | CallRail | ServiceTitan |
|---|---|---|
| Which ad, keyword, or channel made the phone ring? | Yes. Session-level source, medium, campaign, keyword, and the Google and Meta click IDs, stamped per visitor. | CSR-entered source at best. |
| Is this caller new demand or a repeat customer? | Yes. First-touch counting; repeat callers don’t re-count. | Matches the contact record, without channel proof. |
| Did the lead become a booked, run, and sold job? | No. CallRail stops at the call. | Yes. Staged funnel from lead through invoice. |
| What revenue did the campaign produce? | No. | Yes. Revenue on the job record, by campaign and keyword. |
How Big Is the “Unknown Source” Problem?
In a typical ServiceTitan account without dedicated tracking, 30 to 60 percent of inbound calls carry no usable source, per industry write-ups. Once every marketing surface has its own tracked number, the documented industry pattern shows “unknown” collapsing from around 40 percent to around 5 percent. That shift is scope, and it is nothing we present as a Magister result.
Every home-services business we onboard has the same blind spot: ServiceTitan shows the booked job, while the “how did you hear about us” field holds a blank, a “Google,” or an “internet search.” The unknown bucket hides which channels earn their budget and which waste it, and no amount of bid optimization inside Google or Meta repairs it. It has to be fixed at the tracking layer.
| Source of business | Without CallRail | With CallRail |
|---|---|---|
| Google Ads (paid search) | “Google” or unknown | Exact campaign, ad group, and keyword |
| Google Business Profile (Maps and organic Google) | “Google” or unknown | GBP calls specifically |
| Google Local Services Ads | Sometimes “LSA,” if the CSR notices | LSA with lead detail, via Google’s own LSA inbox |
| Organic search and SEO | “Google” or unknown | Organic sessions via the website pool |
| Meta and Facebook ads | “Facebook” or unknown | The specific Meta campaign |
| Bing and Microsoft ads | Almost always unknown | The Bing campaign |
| Print, direct mail, vehicle wraps | Almost always unknown | A dedicated number per channel |
| Referrals | Correctly attributed | Correctly attributed, unchanged |
How Does the Data Flow End to End?
Each layer has one job. Together they close the loop from ad click all the way back to bidding, on Google and Meta at the same time.
- Channels. Every marketing surface displays a CallRail number: Google Ads, the Google Business Profile, Meta, Bing, the website, print, direct mail. The one exception is Local Services Ads, covered below.
- CallRail. Captures the first-time caller’s identity and full attribution (source, medium, campaign, keyword, Google and Meta click IDs), records the call, and pushes it to ServiceTitan through the native integration.
- ServiceTitan. Matches the caller to an existing contact by phone number, or creates a new one with attribution already stamped, then tracks the staged funnel: Booked, Ran, Sold, Revenue.
- Parallel activation. Revenue signals fire to both ad platforms. Ads Optimizer sends daily closed-job revenue and projected job value to Google, plus a refreshed customer list. The Meta Conversions API receives booked-job and purchase events matched by click ID, with actual and predicted values attached.
- Both platforms optimize for revenue. Google Smart Bidding and Meta’s delivery bid up on the keywords and audiences producing high-value jobs, and pull back where the revenue isn’t. More revenue produces more signal, which produces smarter bids.
Why Does the Google Ads Funnel Come First?
Because the integration alone delivers nothing. A closed loop on top of a broken ad account just reports the damage in higher resolution. We rebuild the Google funnel first, then activate the loop on top of it. The reporting stack is what proves the campaign work is working, never a substitute for it. This is the step that most often gets skipped, and it’s the core of our Google Ads management work on these accounts:- Campaigns separated by intent: branded, non-branded, service-specific, and LSA competitor conquest.
- Disciplined match types and negative keyword lists at the account and campaign level.
- Each ad group pointed at a landing page that matches the specific search intent.
- An optimized tracking template at the account level, so campaign, keyword, and match-type data flows into every call record.
- One consistent UTM standard across every ad and landing page link. Garbage in, garbage out.
- Enhanced Conversions for Web enabled, to improve match rates on offline conversions.
- Imported ServiceTitan conversions re-configured by hand for count method, window, and primary versus secondary status.
- Bid strategy staged: manual or max-clicks while data accumulates, then value-based Smart Bidding once enough revenue has fed back.
How Does the Same Loop Teach Meta?
Most contractors dramatically under-track Meta because they only measure form fills. Optimizing on “leads” pushes Meta toward junk contacts. Optimizing on booked-job revenue, reported back through the Conversions API and matched by click ID, forces Meta’s delivery to find people who resemble real revenue customers. The mechanics run in six steps. A user clicks a Meta ad and lands with a click ID on the URL. CallRail’s script captures that ID during the number swap. When the visitor calls, the ID rides the call record into ServiceTitan. The job moves through Booked, Ran, Sold, and Revenue. We send the booked and revenue events back to Meta through the Conversions API, matched by that ID and deduplicated so each event counts once. Meta’s delivery then optimizes toward revenue lookalikes instead of cheap leads. On the setup side, our Meta Ads management builds cover the Pixel plus Conversions API with dedupe keys configured, custom booked-job and purchase events carrying revenue value, value-based lookalike audiences from ServiceTitan’s highest-revenue customers refreshed weekly, and retargeting exclusions built from the existing customer list so spend stops chasing people who already booked.Which Phone Number Goes Where?
The routing rule is strict: caller, then CallRail number, then ServiceTitan tracking number, then the CSR. CallRail stamps attribution before forwarding, and skipping the ServiceTitan hop breaks the revenue loop. Local Services Ads are the one deliberate exception.| Surface | Number type | Where it forwards |
|---|---|---|
| Website, all pages | CallRail pool, a unique number per visitor session; captures the Google and Meta click IDs | ServiceTitan tracking number |
| Google Business Profile, primary | Static CallRail number | ServiceTitan tracking number |
| Google Business Profile, additional | The client’s real office number, preserved as the canonical listing number | Straight to the business; no tracking layer |
| Google Ads call extensions | Dedicated static CallRail number, so ad calls separate from landing page calls | ServiceTitan tracking number |
| Local Services Ads | Google’s own forwarding number | The client’s original business number, directly |
| Meta and Facebook ads | Dedicated static CallRail number | ServiceTitan tracking number |
| Bing and Microsoft ads | Dedicated static number or its own pool, with an optimized tracking template | ServiceTitan tracking number |
| Print, direct mail, email signature | One dedicated CallRail number per channel | ServiceTitan tracking number |
How Do We Configure Google Local Services Ads?
LSA never routes through CallRail in our builds. Google’s LSA system already shows customers its own dynamic forwarding number, records the call, and files the lead in its own inbox. We set the LSA receiving number to the client’s original business line and read LSA results inside Google’s reporting. This is where LSA setups most often go wrong. Chaining LSA through a call tracker creates a double-forward pattern: Google’s number, then a tracking number, then the real line. We keep one forwarding layer, because the second one adds account risk without adding any reporting we need. What we give up is seeing LSA calls inside CallRail’s dashboard next to the other channels. What we keep is a clean setup and Google’s own lead-level detail. After configuring it, we verify with a live test call through the ad: the client’s real line rings, the call appears in the LSA lead inbox with recording and duration, and the CallRail dashboard does not claim it. One account-type note: on the legacy LSA dashboard, changing the receiving number can require contacting LSA support, while the newer Google Ads pay-per-lead version lets you edit it directly in campaign settings.What Happens With Web Forms?
The native CallRail to ServiceTitan integration pushes calls. In our evaluation, CallRail form submissions do not automatically become ServiceTitan contacts, a detail that often goes undisclosed. Since home-services traffic is heavily call-based anyway, we skip CallRail’s form tracking and keep every form inside ServiceTitan’s own tools. Booking-intent forms (“Schedule Service,” “Book Now”) run on ServiceTitan’s native booking widget, so submissions flow straight into ServiceTitan and become bookable conversions in Google Ads. Contact and quote forms run on a ServiceTitan native web form, or on a direct form-to-lead bridge our team builds against the ServiceTitan API. Either way, the small volume of form leads stays in the same attribution loop as the calls, with no dead end.How Do We Structure Conversion Actions?
Imported ServiceTitan conversions do not arrive configured correctly, and the defaults quietly train Smart Bidding on the wrong thing. The rule we hold: revenue-based actions count every occurrence, while contact-based actions count one per person. Get that backwards and bidding chases repeat callers instead of new revenue. On Google, our primary actions (the ones bidding trains on) are the projected-job-value events for website and call-extension leads, counted every time on a 90-day window, plus integrated bookings, lead calls from the website pool, and ad calls filtered to longer than 90 seconds, each counted once on a 30-day window. Booked-job, completed-job, and unqualified inbound calls stay secondary: completed-job revenue in particular runs 2 to 12 weeks behind the funnel, which is too slow to steer bids. On Meta, the purchase event fires when a ServiceTitan job hits Sold, carrying actual revenue, and the schedule event fires at Booked, carrying projected value. Both are primary. The plain lead event stays secondary, used for deduplication rather than optimization.What Do Ads Optimizer and JVP Add?
Ads Optimizer is what turns the closed loop from a reporting layer into an optimization layer. It imports closed-job revenue into Google Ads daily, pushes a refreshed customer list, auto-tests value-based bid strategies, and, through the Job Value Predictor, sends projected revenue the moment a job is booked. JVP matters more than actual revenue for one reason: timing. Take a garage-door install. The lead calls today, a tech consults next week, the door gets ordered, and revenue posts 8 to 12 weeks later. Without JVP, Google bids on data that far behind the funnel. With it, Google receives a projected revenue signal tied to today’s ad click, so Smart Bidding can double down on what’s working while it’s still working. On pricing, ServiceTitan currently lists a pay-as-you-go rate of $5.25 per qualified lead, or a flat monthly subscription; vendor pricing, subject to change.What Does the Stack Cost?
Costs below are vendor list figures at the time of writing; confirm current pricing before budgeting.| Component | Cost | Required? |
|---|---|---|
| CallRail call tracking plan | Around $50 per month base; realistically around $135 with usage | Yes |
| CallRail website number pool | Included in the plan | Yes |
| ServiceTitan Marketing Pro Ads Package | Quoted by ServiceTitan | Required for the integration |
| CallRail to ServiceTitan native integration | Free | Yes |
| Google Ads account and tracking template | The client’s existing ad spend | Yes |
| ServiceTitan Ads Optimizer | $5.25 per qualified lead, or a flat subscription | Recommended |
| Meta Pixel and Conversions API | Free | Yes, for Meta |
What Does the Rollout Look Like?
- Week 1, foundation. Confirm Marketing Pro Ads is in place, generate the ServiceTitan credentials, mirror every channel as a ServiceTitan campaign record, and provision CallRail.
- Weeks 1 to 2, the Google Ads rebuild. Restructure by intent, build the negatives, rewrite ads against landing page intent, deploy the tracking template and UTM standard, enable Enhanced Conversions, and start on clicks-based bidding while data accumulates.
- Week 2, CallRail configuration. Build the website pool and the static numbers, point every one of them at the ServiceTitan tracking number, and install the script that captures the click IDs. LSA gets its separate configuration.
- Weeks 2 to 3, integration activation. Connect CallRail to ServiceTitan with the tenant credentials, then verify a test call lands with source, campaign, and click IDs stamped.
- Week 3, conversion cleanup. Import the ServiceTitan conversions into Google Ads and set the count methods, windows, and primary versus secondary status per the framework above.
- Weeks 3 to 4, the Meta layer. Pixel plus Conversions API with dedupe, the custom revenue events, the value-based lookalikes, and the retargeting exclusions.
- Week 4, Ads Optimizer. Enable it, confirm revenue import activates, turn on JVP per campaign, and set a 30-day pre-optimizer baseline so the lift is measurable.
- Ongoing, the reporting rhythm. Weekly checks on lead volume, booking rates, and booked and sold trends by campaign; monthly cost per booked job and revenue by campaign across Google and Meta.
What Do Industry Benchmarks Say?
Benchmark data below comes from a January 2026 industry dataset covering 816 HVAC and plumbing contractors and 8,077 campaigns, plus published LSA figures. It’s context for judging results, and none of it is Magister data.| Metric | Figure |
|---|---|
| Google Ads blended cost per lead | $104, with branded around $34 and non-branded around $149 |
| Google LSA cost per lead, 2024 | $60.50, up 20 percent from $50.46 |
| Average plumbing booking rate | 41.5 percent |
| Booking rate at top-performing HVAC and plumbing companies | 75 to 80 percent |
| LSA cost per lead by trade | HVAC $45 to $85 · plumbing $40 to $75 · electrical $35 to $70 · roofing $50 to $95 |
The Gotchas We Watch For
- Attribution reassignment inside ServiceTitan Marketing Pro, where the look-back window can move credit off the campaign that generated the lead.
- A missing Google Ads tracking template, which silently drops keyword-level attribution even though calls keep appearing in ServiceTitan.
- Wrong count methods on imported conversions, which train Smart Bidding to chase repeat callers.
- Too many primary conversion actions, which muddies the optimization signal. Keep it tight.
- LSA chained through a call tracker. We route LSA to the client’s original number directly, every time.
- Relying on completed-job revenue alone, which runs 2 to 12 weeks behind the funnel. That lag is exactly why JVP exists.
- Meta Conversions API without dedupe configured, which double-counts every event and flatters the reporting.
- Assuming the integration alone does the work. On a broken funnel, the data just reports failure faster.
