Attribution, case by case
The Case of the Unattributed Furnace: Tracing Every ServiceTitan Job Back to What Paid for It
A furnace replacement closed last Tuesday. The customer record says the source was "website." That narrows it down to every ad, search result, postcard, review and truck wrap that ever pointed anyone at your home page. This guide is about replacing that shrug with an answer.
October 26, 2026 · 10 min read
The short answer
ServiceTitan attributes jobs to campaigns, so attribution starts there. Give every channel its own campaign, track calls with unique numbers and DNI, send each website booking and form with its web session (landing page, referrer, click IDs and UTM tags), record spend as campaign costs, and report booked jobs and completed revenue per campaign each month instead of "source: website."
On this page
- "Website" is a place, not a source
- Evidence ServiceTitan can already hold
- What counts as a lead, and what slips past
- Pin a campaign to every lead before it reaches dispatch
- A sample monthly report that fits on one screen
- Pulling the figures out without tripping the limits
- When Google's dates and ServiceTitan's dates disagree
- Who sets up the evidence trail
"Website" is a place, not a source
Nobody wakes up and decides to visit a contractor's website for its own sake. They arrive from somewhere: a Google ad, an unpaid search result, the Business Profile, a Local Services Ad, a Facebook video, a postcard, a neighbor's text message. Labeling all of them "website" is like a detective writing "the house" under cause of death. Technically accurate. Of no use to anyone deciding where next month's budget goes.
The usual substitutes are not much better. There is the agency report that counts clicks, multiplies by a hopeful average ticket and calls the result revenue. There is the dashboard with eleven charts that nobody has opened since the kickoff meeting. And there is the CSR asking "how did you hear about us?" while a customer who has seen you in four places picks one at random. ServiceTitan already holds the jobs and the invoices. Attribution is the work of getting the evidence attached to each lead before it reaches the board, so the report writes itself. The rest of this section, from booking to reviews, is mapped on our ServiceTitan integration hub.
Evidence ServiceTitan can already hold
ServiceTitan's data model has room for far more detail than most accounts use. These are the pieces, as its API reference and help center describe them as of October 2026.
Campaigns and their costs
The Marketing API covers campaigns, campaign categories, campaign costs and a campaign cost summary. ServiceTitan says campaigns "can be tracked by using unique phone numbers."
Tracked numbers and DNI
Dynamic Number Insertion shows each website visitor a tracked number, and Scheduling Pro bookings get a campaign "using the same logic as ServiceTitan DNI."
Web sessions
A web session carries the landing page and referrer, plus optional gclid, gbraid, wbraid, fbclid, msclkid, UTM tags and the Google Analytics client ID.
Attribution records
The Marketing Ads API attributes web bookings, web lead forms, external calls and jobs to a web session, and lists attributed leads.
Call tracking partners
CallRail's Marketplace listing says its calls sync to ServiceTitan "populated with source, medium, campaign, and keyword data." Details are in our call tracking guide.
Direct mail
ServiceTitan's Marketing Pro page promises to "Tie booked jobs and revenue directly to each postcard," which covers a channel no click ID ever will.
None of this needs to be invented by the website. It needs to be fed. A booking that arrives with its web session attached is evidence. A booking typed in from an email is an anonymous tip.
What counts as a lead, and what slips past
ServiceTitan's Google Ads integration article spells out what it treats as a Lead, and the list is a useful map of where attribution can attach. It includes booked calls, unbooked calls over 60 seconds that aren't excused, excused calls whose excused reason is set to "Is Lead," abandoned or excused calls followed by a booking within seven days, "Lead forms received from the API or Zapier," "Bookings received from the API or Zapier," and manual calls.

Now look at what is missing from that list: a form that emails a shared inbox, a lead pasted in from Facebook's Instant Forms (which ServiceTitan's Meta integration says it does not track), and any booking made from a page that reloaded and dropped its tracking. These leads still become jobs. They just become jobs without a campaign, and every one of them makes the report less true.
- Retyped web forms lose the web session entirely. Our web forms page covers sending them through the API instead.
- Link-style booking installs reload the page, and ServiceTitan says that "can disrupt lead source tracking." See online booking.
- Instant Form leads need their own path, laid out on our Meta ads page.
- Local Services Ads message leads arrive with a Google tracking number rather than the customer's own, as our LSA guide explains.
- Sister-brand domains need their own DNI configuration, because ServiceTitan sets DNI up per website.
Pin a campaign to every lead before it reaches dispatch
An ad or a search
Google Ads, Local Services Ads, Meta, or a tracked phone number.
A call or a booking
The click ID or the tracked number travels with the lead.
A job and an invoice in ServiceTitan
The lead's source stays attached to the revenue it produced.
Revenue goes back to the ad platform
The platform learns which clicks became paid jobs, not just form fills.
- 1
Write the campaign list first
One ServiceTitan campaign per channel and offer you want to judge: Google search, LSA, Meta, each direct mail drop, organic search, referrals. Use Auto-Map for Google Ads so names match the ad account.
- 2
Give offline channels their own numbers
Postcards, yard signs and vehicle wraps each get a tracked phone number tied to their campaign, so a call from the truck is not filed under "website."
- 3
Put DNI on every website you own
Each domain gets its own DNI configuration, and the number on the page is text a phone can tap, not a picture of a number.
- 4
Send every booking and form with its web session
The site saves landing page, referrer, click IDs and UTM tags on arrival and sends them to ServiceTitan with each booking or lead form through the attribution calls.
- 5
Attribute calls from outside call tracking
If you use call tracking software, connect it so calls are attributed to a web session, using the external call attribution route ServiceTitan publishes.
- 6
Record spend against each campaign monthly
Enter campaign costs by hand or through the Marketing API's
POST /costs, so every campaign has a cost beside its jobs. - 7
Keep the CSR question as a fallback
"How did you hear about us?" is still worth asking, for word of mouth. It should fill gaps, not override a tracked number.
A sample monthly report that fits on one screen
The report below is a layout, not a result. Every number in it comes from ServiceTitan or the ad platform, and each row tells you where that row usually breaks. Fill it in on the same day each month and the trend will tell you more than any single month.
| Spend from | How jobs get tied to it | The leak to check | |
|---|---|---|---|
| Google Ads search | Google Ads, mapped by Auto-Map | GCLID on calls, bookings and forms | Bookings arriving without a click ID |
| Local Services Ads | LSA charges minus credits | LSA campaign, calls, bookings, message leads | Customers saved under Google's tracking number |
| Meta | Meta cost pulled by Marketing Pro | Facebook Click ID, phone or email | Instant Form leads typed in by hand |
| Organic search and Business Profile | SEO and local marketing fees | DNI and web sessions with no paid click | Organic visitors filed under paid |
| Direct mail | Print and postage | A tracked number per drop | Callers who dial the main line instead |
| Referrals and repeat customers | Usually none | CSR question and existing customer record | Repeat customers credited to the last ad they saw |
For each row, carry five figures across the page: spend, leads, booked jobs, completed revenue, and revenue per dollar spent. Booked jobs divided by leads shows the office's work; revenue per dollar shows the channel's. Keep them apart. A channel with weak revenue per dollar and a strong booking rate needs a different ad. A channel with the reverse needs a different phone script. Our marketing plan guide covers what to do with the answers, and what Google Ads costs gives the spend side some context.
Booking rate grades the office. Revenue per dollar grades the channel. Never let one hide behind the other.
Pulling the figures out without tripping the limits
ServiceTitan's own reports cover much of this inside the product. When a contractor wants the figures in a spreadsheet, a data warehouse or a custom screen, the API has rules worth respecting. Its rate limit FAQ allows "600 calls per 10 seconds per application per tenant for all APIs except reporting APIs," and reporting APIs allow "1 of the same report per minute per tenant." Release ST-78 (July 2, 2026) deprecated the synchronous reporting data endpoint in favor of an async .../data/query endpoint, so older scripts may need attention.
For volume, the export APIs are the right tool. They are GET only, page through results with from and continueFrom tokens, and show changes 15 minutes after they happen unless includeRecentChanges is set to true. A nightly pull of jobs, invoices and attributed leads is plenty for a monthly report. Polling every minute buys nothing but a closer look at the rate limit.
We built exactly this kind of single screen for HomeService WebApp, a contractor command center whose API layer "syncs jobs and estimates bidirectionally with ServiceTitan" and pulls every open estimate, customer and overdue follow-up onto one screen. The technical side of that work is on our API integration page.
When Google's dates and ServiceTitan's dates disagree
Sooner or later someone puts the Google Ads report next to the ServiceTitan report and finds that last month's numbers do not match. Some of that is by design. ServiceTitan's help center notes that Google Ads dates a conversion to the ad impression while ServiceTitan shows the transaction date, so a job booked on the first of the month from an ad seen on the thirtieth lands in two different months.
Large jobs add their own lag. A replacement quoted in March and sold in May belongs to the campaign that found it, not to May's ads. That is why the report tracks booked jobs and completed revenue separately, and why the setup on our Google Ads conversion tracking page sends both.
Who sets up the evidence trail
DataCram is a web studio in San Antonio, Texas that builds custom Next.js sites with our own content system, Athena CMS, and runs PPC advertising and local marketing for businesses across the US. Our integrations follow the same rules every time: field mapping agreed before code, server-side validation, queues and retries, idempotent writes, logs a person can read, and the contractor's own credentials. For Bleuwave Home Services in Phoenix, "an on-page assistant books straight into ServiceTitan." Both projects are on our work page.
The measurement work is our conversion tracking setup service, and a reporting connection is an API integration, typically one to three weeks for two systems. Work on an existing site is quoted after a free review; a free site audit is the quick first look. A new site with online booking is about $9,000 on our web design pricing page, with website financing at 0% and 25% down. Home service companies can see how we build on our home services page, and our launch checklist lists every connection to test. Or call (210) 346-0848.
Questions contractors ask about ServiceTitan integration
Through campaigns. Each lead and job can carry a campaign, set by a tracked phone number, Dynamic Number Insertion on the website, Scheduling Pro's DNI logic, a web session sent with an API booking or form, or a call tracking partner. Campaign costs sit beside the jobs, so revenue per campaign can be reported.
Usually because the lead reached ServiceTitan without its evidence: a form that emailed the office and was retyped, a booking link that reloaded the page and lost its tracking, or a second domain without its own DNI. Sending each booking and form through the API with its web session gives the job a real campaign.
One row per campaign with spend, leads, booked jobs, completed revenue and revenue per dollar, plus the booking rate as a separate figure for the office. Use ServiceTitan's transaction dates. Check each row's usual leak, such as bookings without click IDs or Instant Form leads typed in by hand.
Yes, through the API, if your ServiceTitan package allows API access and your admin approves the app. Export APIs page through large volumes, and reporting APIs allow one of the same report per minute per tenant. A nightly pull is plenty for a monthly report. See our API integration page.
Give each one its own tracked phone number tied to its own campaign. ServiceTitan says campaigns can be tracked using unique phone numbers, and Marketing Pro's direct mail feature is built to tie booked jobs and revenue to each postcard. A QR code that lands on a page with DNI helps too.
Google Ads dates a conversion to the ad impression, while ServiceTitan shows the transaction date, so the same job can fall in different months. Jobs that close weeks after the first call add more lag. Report on ServiceTitan's dates and check that the two move in the same direction.
Keep reading
- Google Ads and ServiceTitanWhy Google Ads Keeps Buying Phone Taps, and How ServiceTitan Revenue Changes Its MindSend booked jobs and invoice revenue from ServiceTitan back to Google Ads: the exact conversion actions, click IDs, enhanced conversions and setup steps.
- Calls, matched to revenueOne Number per Source, One Campaign per Number, One Invoice at the End of the LineHow tracked numbers, ServiceTitan DNI and CallRail tie each call to a campaign, a booked job and its invoice, and what your website has to get right.
- Facebook, Instagram and the boardFour Things ServiceTitan Tells Facebook, and the Leads It Leaves OutWhat ServiceTitan's Meta Ads integration sends to Facebook, the Instant Forms gap, the pixel it still needs, and where a server-side Conversions API fits.
- Online bookingThe Customer Picked Thursday at 10. Does the Dispatch Board Know?ServiceTitan's Scheduling Pro or a custom booking flow on your own site: how each installs, tracks and shows availability, and when each one wins.
- Web formsThe Lead Nobody Has to Retype: Website Forms That Arrive in ServiceTitan WholeSend estimate, callback, contact and emergency forms to ServiceTitan as bookings with the source attached. Field map, spam filtering, retries, prices.
- Custom site, server-side linkIf a Visitor Can Read Your API Secret, So Can Everyone: Custom Next.js Sites That Book Into ServiceTitan From the ServerA custom Next.js site that sends bookings to ServiceTitan from its own server: credentials hidden, click IDs kept, pages fast. How it works, limits, prices.
- Everything in ServiceTitan IntegrationSee the section
Replace "source: website" with a real answer
Tell us which channels you pay for. We will show where leads lose their campaign on the way into ServiceTitan and quote the fix.
Which of these sounds like you? (pick any)
Rather talk now? Call (210) 346-0848.