Theory Road.
← PerspectivesSystems & Integration

ServiceTitan Integrations for Marketing That Close the Loop.

ServiceTitan can tell you which campaign booked every job and what it invoiced, but only if forms, calls and Google lead sources arrive with a campaign already set. Here is how we wire it.

By Theory RoadSeptember 21, 202610 min read

ServiceTitan integrations for marketing come down to one job: make sure every lead, from every channel, lands in ServiceTitan with the right Campaign attached, then get booked jobs and revenue by campaign back out to the ad platforms. ServiceTitan has an open API through its developer program, a marketplace of pre-built connectors, and a built-in module called Marketing Pro, and the work is choosing which of those carries each channel. This piece covers the fields that matter, how we wire web forms, CallRail, Local Services Ads and Google Ads lead forms, how the revenue loop closes, and the mistakes that quietly wreck attribution in most accounts we open.

What a ServiceTitan campaign actually is.

A ServiceTitan campaign is the record that names where a customer came from, and it is attached to the booking and the job, not to the customer. Every call, form, chat or manual booking that becomes a job gets a campaign, and every report that says revenue by source is really a report grouped by that field. Two consequences follow. If the campaign is wrong at booking time, it is wrong in every downstream report, and nobody goes back to fix it. And the campaign is set by whatever booked the job: a CSR on the phone, the online Scheduler, an API call from your website, or a marketplace integration. Attribution quality is an intake design problem, not a reporting problem.

Campaigns are organized under categories in Settings, and each campaign can own one or more tracking phone numbers that ServiceTitan issues. When a customer calls a tracking number, ServiceTitan matches it to the campaign and pre-fills the booking screen. That is what makes phone attribution work without asking the customer, and it is also what breaks when those numbers end up in places they should not be.

Where Marketing Pro fits, and where it does not.

Marketing Pro is ServiceTitan's own marketing module. It covers email campaigns to your customer list, direct mail triggered by job and equipment data, reputation management that requests reviews after a completed job, and an ads component that reports on paid campaigns tied to your tracking numbers. Because it reads directly from the Customer and Location records, it can mail every customer whose water heater is past a certain age or email everyone with an open estimate above a set amount, which a standalone email tool cannot.

What Marketing Pro does not do is intake. It will not book a web form into a job with a campaign set, it will not tell CallRail what to do, and it will not push offline conversions to Google Ads on its own. We treat it as the retention and reactivation layer for companies that live inside ServiceTitan, and we build the acquisition plumbing separately. For the intake pattern across trades, see our home services marketing system.

The three records that carry attribution.

Three objects in ServiceTitan do all of the attribution work, and everything else is reporting on top of them.

  • The Campaign on the booking and the job. This is the source of truth for where a job came from, and it should be set on every booked job without exception.
  • Tracking phone numbers issued per campaign. ServiceTitan provisions these and matches inbound calls to a campaign automatically. One number per campaign, never shared across channels.
  • The Customer and Location record. This is where lifetime value, equipment, service history and marketing consent live, and it is what Marketing Pro segments on. A customer's first campaign should survive on the record even after later jobs book under other sources.

When we audit an account, we pull booked jobs for the last ninety days grouped by campaign. If a large share sit under a catch-all name, the intake layer is the problem and no dashboard will fix it.

Wiring web forms to book with a campaign.

A website form that emails the office is not integrated. Someone reads the email, calls the customer back, and books the job by hand, and the campaign becomes whatever the CSR picks. There are two ways to fix it.

Decide between the native Scheduler and the API..
ServiceTitan's online Scheduler is an embeddable booking flow that creates the booking directly and lets you assign a campaign per embed. If you have one website and can accept its layout, use it. If you run multiple landing pages, need custom fields, or want the form to look like your site, build the form yourself and post to the API.
Set up developer access..
Apply through the ServiceTitan developer program, create an app, and record the app key. Your tenant id identifies your account, and access is granted per tenant with client credentials that return the token every API call carries. Keep the client secret in your server environment, never in front-end code.
Create the campaigns in ServiceTitan first..
Under Settings, Marketing, Campaigns, create one campaign per landing page or paid channel and note each campaign's id. This is the value your form will send.
Pass the source into the form..
Capture UTM parameters and the landing page as hidden fields, then map them to a campaign id on your server. A Google Ads click lands on a page whose form posts with the Google Ads campaign id; an organic visit posts with the organic campaign id. Do not let the customer pick.
Match the customer, then create the booking..
Look up the customer by phone or email so you do not create duplicates, create the Location if it is new, and create the booking with the campaign id, the preferred time window and a summary. It then appears on the Bookings board for a CSR to confirm.
Fire conversion events from the server response..
Only count a form as a lead in GA4 and Google Ads when ServiceTitan returns a success.

Calls: CallRail and ServiceTitan tracking numbers.

Companies arrive at ServiceTitan with one of two phone setups. Either they use ServiceTitan's own tracking numbers on every channel, or they run CallRail for dynamic number insertion on the website and keyword-level attribution and want that data to reach ServiceTitan. Both work. Mixing them without a plan does not.

If you use only ServiceTitan numbers, create one per campaign and place each number only where that campaign runs: the Google Ads call asset gets the Google Ads number, the direct mail piece gets its number, the truck wrap gets its number. The website should show a number that swaps by traffic source if you want paid and organic separated, which is the point where most companies add CallRail.

If you use CallRail, the call source, keyword and landing page live in CallRail, and ServiceTitan only sees the number the call was forwarded to. The connection is either CallRail's ServiceTitan integration, which writes call details to the customer record and aligns the CallRail source with a ServiceTitan campaign, or a Zapier flow that takes the CallRail call event and updates the booking's campaign after the CSR books it, matched by phone number. The Zapier route is slower but works where the direct integration is not available. For the keyword-level piece, see our CallRail and Google Ads guide.

Local Services Ads and Google Ads lead forms.

Two Google sources deserve their own section because both arrive by email unless you connect them. Local Services Ads leads show up in the LSA dashboard and as email notifications, and create nothing in ServiceTitan by themselves. Google Ads lead form assets behave the same way: the lead sits in Google Ads, and you get an email or a CSV download.

For Local Services Ads, ServiceTitan has offered a booking connection that lets a customer pick a time from the ad and have it land as a booking with the LSA campaign set. Check current availability in your ServiceTitan account and your LSA category, since the connection has rolled out by trade and region. Where it is not available, the practical answer is a Zapier or Make flow that reads the LSA lead notification and creates a booking with the LSA campaign id, plus a ServiceTitan tracking number assigned to the LSA campaign so phone leads match automatically. For how LSA leads differ from search ads, see what LSA means in marketing.

Google Ads lead forms should post to a webhook. In the lead form asset, set the webhook URL and key to an endpoint you control, then create the booking in ServiceTitan with the Google Ads campaign id and the Google click id stored on the booking or the customer as a custom field. That click id is what lets you send an offline conversion later.

Closing the loop: booked revenue back to Google Ads.

Everything above exists so that this step can happen. The API exposes jobs and invoices, each carrying the campaign, the customer, the job status and the invoice total. A scheduled process pulls invoiced jobs since the last run, joins them to the click id captured at intake, and uploads them to Google Ads as offline conversions with the invoice value. Google Ads then optimizes toward campaigns that produce revenue rather than form fills.

The join is the hard part. A form lead carries its click id from the landing page. A call lead carries it only if CallRail captured it and wrote it to the customer record. A Local Services Ads lead has no click id at all, so its revenue is reported inside the LSA dashboard rather than uploaded, and we report LSA separately. Our offline conversions guide walks through the upload format and the matching rules.

How each lead channel reaches ServiceTitan and what sets the campaign
ChannelDefault behaviorHow we wire itWhat sets the campaign
Website formEmail to the officeNative Scheduler embed or API bookingCampaign id mapped from UTM and landing page
Phone callRings the office lineServiceTitan tracking number per campaign, CallRail for website number swapsTracking number match, or the CallRail integration
Local Services AdsEmail and the LSA dashboardLSA booking connection where available, otherwise a Zapier or Make flowLSA campaign id plus an LSA tracking number
Google Ads lead formEmail or CSV downloadLead form webhook to your endpoint, then an API bookingGoogle Ads campaign id and the stored click id
Chat and textDepends on the chat vendorVendor's ServiceTitan integration or an API bookingChat campaign id
Marketing Pro email and direct mailNativeNothing to wireMarketing Pro campaign, set automatically
If the campaign is wrong when the job is booked, every report you run for the rest of the year is wrong, and nobody goes back to fix it.

Mistakes that wreck ServiceTitan attribution.

  • One Website campaign for everything. Paid search, organic, Business Profile and referral traffic all book under the same name, so the revenue report cannot tell you which one to fund. Create one campaign per channel and map the form to it.
  • Dispatchers not asking, or overriding the campaign. When a tracking number pre-fills the campaign and the CSR changes it to what the customer said, the phone attribution is lost. Train the team that the pre-filled campaign wins unless the customer names a specific referral.
  • Tracking numbers copied onto the Google Business Profile as the primary line. The profile is a citation, not a channel test. Keep the verified main line as primary and track profile calls separately.
  • API tokens shared with vendors without scoping. A marketing vendor who needs to create bookings does not need invoices, payroll or the pricebook. Create a separate app per vendor, grant only the scopes the job requires, and revoke it when the engagement ends.
  • Booking through the API without matching the customer first, which creates duplicate customers and splits service history across records.
  • Counting the form submit as the conversion instead of the successful booking, so Google Ads optimizes toward forms that never became jobs.

Does ServiceTitan have an open API?

Yes. ServiceTitan runs a developer program that issues an app key and tenant-scoped credentials for its public API. The API covers customers, locations, bookings, jobs, invoices, campaigns and more, which is enough to create bookings with a campaign set and to pull booked revenue by campaign for offline conversion uploads. Apply through the developer program and scope each app to only the data it needs.

What does ServiceTitan Marketing Pro do?

Marketing Pro is ServiceTitan's built-in module for email campaigns, direct mail, reputation management and ads reporting. It reads directly from customer, location and job data, so it can target by equipment age, service history or open estimates. It does not handle lead intake from web forms or Google lead sources, so it sits alongside the integration work rather than replacing it.

How do I get CallRail data into ServiceTitan?

Use CallRail's ServiceTitan integration where your plans support it, which writes call details to the customer record and aligns the CallRail source with a ServiceTitan campaign. Where it is not available, a Zapier flow can take the CallRail call event and update the booking's campaign by matching the caller's phone number. Either way, one ServiceTitan tracking number per campaign remains the foundation.

Can ServiceTitan send conversions to Google Ads?

Not on its own. The loop closes when a scheduled process pulls invoiced jobs by campaign through the API, joins them to the Google click id captured at intake, and uploads them to Google Ads as offline conversions with the invoice value. Form and webhook leads carry a click id, call leads need CallRail to capture it, and Local Services Ads leads are reported inside the LSA dashboard instead.

Work with us

Let’s talk about what’s next.

A short note on where the business is and where it needs to go. A senior partner replies within one business day.

t@theoryroad.com

Your briefUnder a minute

Tell us what you need.

Read by a person. Never sold, never added to a list.