How to fix ServiceTitan lead-source attribution
By Jeremiah Ballew · June 27, 2026 · 8 min read
Here's a test. Open ServiceTitan and pull booked, paid revenue by campaign for last month. Can you trust it enough to move budget on Monday? For most contractors the honest answer is no — and that means every dollar of ad spend is a guess.
Attribution isn't broken because ServiceTitan is bad at it. It breaks because of a handful of specific, fixable configuration and process gaps. I've cleaned these up in my own shop and in plenty of others. Here's where the leaks are.
1. Call tracking without dynamic number insertion
The attribution chain from ad click to phone call to booked job only closes when dynamic number insertion (DNI) is running on your site. Without it, ServiceTitan has no way to know which campaign produced a caller — the call lands on a generic number and gets bucketed wrong. If you're paying for call tracking but DNI isn't wired to your campaigns, you're collecting call data you can't attribute.
2. Outbound callbacks polluting inbound DNIS data
This one is subtle and it wrecks call-based attribution. When a CSR calls a customer back from a tracked line, that outbound call can get logged against the inbound campaign's DNIS. Now your 'Google call' campaign shows twice the volume it earned, and your booking percentage on it looks worse than reality. The fix is to treat web-booking data as the source of truth where you have it, and to separate outbound activity from inbound lead counts before you judge a channel.
3. Web leads landing in the wrong campaign
Web form and scheduler leads only attribute correctly if the UTM parameters make it into ServiceTitan. Scheduling Pro can auto-assign a campaign when the utm_campaign value in the URL matches an existing campaign name exactly — and 'exactly' includes spaces. A campaign named Google Search - AC won't match a URL parameter with spaces stripped or encoded. Standardize your campaign naming (no spaces, or a consistent slug) and confirm your web forms pass UTMs through hidden fields into the lead.
4. Judging channels on leads instead of revenue
Even with clean tracking, lead count lies. A channel can flood you with cheap, unbookable leads and look like a winner on a cost-per-lead report. The only number that decides budget is booked, paid revenue per campaign next to spend. That requires reconciling leads to jobs to payments — which ServiceTitan can do, but usually needs the API and a proper reporting pipeline to tie out cleanly.
The cleanup, in order
- 1Audit your lead sources and campaigns. Kill duplicates and rename to a consistent, space-free convention.
- 2Confirm DNI is live on every paid channel and every tracked number maps to one campaign.
- 3Separate outbound callbacks from inbound lead counts so DNIS data isn't inflated.
- 4Verify web forms and scheduler URLs pass UTMs into ServiceTitan as hidden fields.
- 5Rebuild reporting around revenue per campaign vs. spend, not lead count.
This is exactly the work in our lead generation and tracking and optimization and audit engagements. We hand you a prioritized fix list, do the configuration, and leave you with an attribution model you can actually spend against.
What clean attribution is worth
When attribution is real, two things happen fast: you cut the campaigns quietly burning cash, and you pour more into the ones producing booked jobs. That reallocation usually pays for the cleanup many times over in the first quarter.
Spartan Command ships a lead-and-attribution module that reconciles web vs. call leads and flags wasted spend automatically. Or book a strategy call and we'll audit your attribution live.