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
  1. "Website" is a place, not a source
  2. Evidence ServiceTitan can already hold
  3. What counts as a lead, and what slips past
  4. Pin a campaign to every lead before it reaches dispatch
  5. A sample monthly report that fits on one screen
  6. Pulling the figures out without tripping the limits
  7. When Google's dates and ServiceTitan's dates disagree
  8. 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.

A corkboard of snapshots of a phone, a laptop, a door, a van and cash, tied together with red string under a magnifying glass
Every job has a trail. The red string just has to be pinned up before the customer reaches the board, not after.

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

1

An ad or a search

Google Ads, Local Services Ads, Meta, or a tracked phone number.

2

A call or a booking

The click ID or the tracked number travels with the lead.

3

A job and an invoice in ServiceTitan

The lead's source stays attached to the revenue it produced.

4

Revenue goes back to the ad platform

The platform learns which clicks became paid jobs, not just form fills.

An ad or search brings a visitor; the call or booking carries the click ID or tracked number; ServiceTitan records the job and invoice; revenue goes back to the ad platform.
  1. 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. 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. 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. 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. 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. 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. 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.

Sample monthly ServiceTitan marketing report: one row per campaign, with spend, leads, booked jobs, completed revenue and the leak to check
Spend fromHow jobs get tied to itThe leak to check
Google Ads searchGoogle Ads, mapped by Auto-MapGCLID on calls, bookings and formsBookings arriving without a click ID
Local Services AdsLSA charges minus creditsLSA campaign, calls, bookings, message leadsCustomers saved under Google's tracking number
MetaMeta cost pulled by Marketing ProFacebook Click ID, phone or emailInstant Form leads typed in by hand
Organic search and Business ProfileSEO and local marketing feesDNI and web sessions with no paid clickOrganic visitors filed under paid
Direct mailPrint and postageA tracked number per dropCallers who dial the main line instead
Referrals and repeat customersUsually noneCSR question and existing customer recordRepeat 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

Free · No obligation

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.

CallGet a quote