Section 01
Why This Matters
Campaign attribution is the foundation of every marketing decision we make.
Without it, we are flying blind.
! The Problem We Solved
▼
When we pulled 545 jobs from ServiceTitan, a significant number had "No Campaign" as their attribution source.
That means the team completed work, collected revenue, but we had zero idea which marketing channel drove the call.
⚠
Bad data = bad decisions. If we cannot tell which source generates a $2,000 sewer job vs. a $95 drain call,
we cannot optimize ad spend, cut underperformers, or double down on winners.
We built custom lookup logic to recover attribution for historical jobs, but the real fix is making sure
every job going forward has the correct campaign selected at the time of booking.
✓ What Perfect Data Unlocks
▼
ROI
By Source
CPL
Cost Per Lead
Rev
By Channel
LTV
By Source
- Revenue attribution: Know exactly how much each source earns
- Cancel rate by source: Find which sources send flaky leads
- Average ticket by source: Identify high-value channels
- Conversion rate tracking: Measure lead-to-job performance
- Smart budget allocation: Put dollars where they generate the best return
Every Single Job Gets Five Things
📢
Campaign Source
🔧
Job Type
🏢
Business Unit
✅
Status Update
💰
Revenue / Invoice
Section 02
Campaign Setup
Every lead source must have a matching campaign in ServiceTitan. This is how we connect marketing spend to revenue.
★ How to Access Campaign Settings
▼
Navigate to the campaign configuration screen:
Settings
▶
Marketing
▶
Campaigns
📷
Screenshot: ServiceTitan campaign list showing all active campaigns
Settings > Marketing > Campaigns page
💡
Only users with Admin or Office Manager roles can add or edit campaigns. If you do not see the Settings menu, contact your ServiceTitan admin.
☰ Current Active Campaigns
▼
These 13 campaigns are currently configured in ServiceTitan. Every inbound call should map to one of these sources.
| Campaign Name |
Source Type |
Status |
| Existing Customer | Repeat / Referral | Active |
| Google LSA | Google Local Services | Active |
| Google | Organic / Maps | Active |
| Pay Per Click (PPC) | Google Ads | Active |
| Service Direct - MRKT 1 | Lead Marketplace | Active |
| Service Local Pro - MRKT 2 | Lead Marketplace | Active |
| Networx | Lead Marketplace | Active |
| House Call Pro | Lead Platform | Active |
| Angie's List | Directory | Active |
| Voolt | Website / Directory | Active |
| Referral Group | Partner Referral | Active |
| BBB | Directory | Active |
| Inspector Nick | Partner Referral | Active |
+ How to Add a New Campaign
▼
When a new lead source is added, create the campaign before any calls come in.
- Navigate to Settings in the left sidebar
- Click Marketing to expand the submenu
- Click Campaigns to open the campaign list
- Click the "+ Add" button in the top-right corner
- Enter the Campaign Name exactly as the lead source is known (e.g., "Thumbtack" or "Yelp")
- Select the appropriate Campaign Category (Paid, Organic, Referral, etc.)
- If applicable, add the tracking phone number associated with this source
- Toggle the campaign to Active
- Click Save
📷
Screenshot: The "Add Campaign" form in ServiceTitan
Fields: Name, Category, Phone, Active toggle
⚠
Naming convention matters. Use the exact source name as it appears in contracts or invoices.
Avoid abbreviations that the CSR team will not recognize. If in doubt, ask the marketing team before creating.
⚠ Critical: CSR Must Select Campaign on Every Job
▼
🚨
This is the single most important step in the entire playbook.
When a CSR creates a job from a call or lead, they MUST select the correct campaign source. If this field is left blank or set to the wrong value, that revenue becomes invisible to our marketing reporting.
How to determine the correct campaign:
- Ask the customer: "How did you hear about us?" and map their answer to the campaign list
- Check the tracking number: If the call came through a tracked number, ServiceTitan may auto-populate
- Check the lead source: If the lead came through an integration (LSA, Service Direct), it should auto-tag
- When unsure: Ask the customer again. Do NOT default to "Existing Customer" unless they truly are one
Section 03
Job Type Configuration
50 job types are configured in ServiceTitan. Selecting the right one ensures accurate reporting and proper technician dispatch.
★ How to Access Job Types
▼
Settings
▶
Operations
▶
Job Types
📷
Screenshot: Job Types list in ServiceTitan
Settings > Operations > Job Types
📈 Top Job Types by Revenue
▼
These are the highest-revenue job types based on our ServiceTitan data pull. Understanding these helps prioritize CSR training and dispatch optimization.
💡
General Plumbing Service is a catch-all. Over time, encourage CSRs to select more specific job types when the issue is clear. This improves dispatching and reporting accuracy.
📋 Job Type Best Practices
▼
- Be specific: If a customer calls about a clogged drain, select "Drain Cleaning" rather than "General Plumbing Service"
- Match to business unit: Each job type should map to the correct BU (Service, Maintenance, Sales, or Install)
- Pricing templates: Confirm that each job type has a pricing template attached for accurate estimates
- Deactivate unused types: If any of the 50 job types are never used, deactivate them to reduce CSR confusion
- Naming clarity: Job type names should be immediately understandable. Avoid internal jargon that new hires will not recognize
⚠
Do not create duplicate job types. Before adding a new one, search the existing 50 to make sure the type does not already exist under a different name.
Section 04
Business Unit Setup
Four business units organize all work at Bright Side. Every job must be assigned to the correct BU for accurate P&L reporting.
🏢 Business Units and Revenue
▼
$212K
Service
$90K
Maintenance
$49K
Sales
$15K
Install
| Business Unit |
Revenue |
% of Total |
Typical Job Types |
| Residential Plumbing Service |
$212,000 |
58% |
General Plumbing, Drain Cleaning, Leak Detection, Faucet Repair |
| Residential Plumbing Maintenance |
$90,000 |
25% |
Maintenance Agreements, Annual Inspections, Preventive Work |
| Residential Plumbing Sales |
$49,000 |
13% |
Sewer Line Estimates, Repipe Estimates, Bathroom Remodel Quotes |
| Residential Plumbing Install |
$15,000 |
4% |
Water Heater Install, Repipe, Sewer Line Replacement |
Use these rules to determine which BU a job belongs to:
- Service: Customer has an active problem that needs to be diagnosed and repaired today. This is the default for most inbound calls.
- Maintenance: Customer is on a membership plan or requesting a scheduled preventive inspection. No active issue reported.
- Sales: Customer needs an estimate or quote for a larger project. The tech will assess, diagnose, and present options rather than repair on the spot.
- Install: Customer has already approved a quote and the job is scheduled for installation work. This is a follow-up to a Sales appointment.
⚠
When unsure, default to Service. If a job starts as Service but converts to a Sales estimate on-site, the tech or dispatcher should update the BU before closing the job.
Section 05
CSR Call Booking Checklist
This is the step-by-step process every CSR follows on every single call. No exceptions. No shortcuts.
📞 The 6-Step Booking Process
-
Ask "How did you hear about us?"
Listen to their answer and select the matching campaign from the dropdown. If they say "I Googled it," ask if they clicked an ad or found you in the regular results. "Ad" = PPC. "Regular results" = Google. "I saw the green checkmark" = Google LSA.
-
Confirm customer name, address, and phone number
For existing customers, verify the info on file is current. For new customers, spell back the name and read back the address to confirm accuracy. Always get a mobile number for text notifications.
-
Select the correct job type
Based on the customer's description, choose the most specific job type available. "My drain is clogged" = Drain Cleaning. "Water everywhere" = Leak Detection or Emergency Plumbing. When in doubt, ask clarifying questions before selecting.
-
Assign to the correct business unit
Most calls go to Service. If the customer specifically asks for a quote on a big project (repipe, sewer replacement, bathroom remodel), assign to Sales. If they reference their membership, assign to Maintenance.
-
Add a detailed job description in the notes
Write down what the customer said in their own words. Include: what the problem is, when it started, what they have already tried, and any access instructions. The more detail, the better the tech can prepare.
-
Set the proper priority level
Emergency (active flood, no water, sewage backup) = Urgent. Today or tomorrow request = High. Flexible scheduling = Normal. Estimate or consultation = Low.
💬 Campaign Selection Quick Guide
▼
When the customer answers "How did you hear about us?", use this mapping:
| Customer Says... |
Select This Campaign |
| "I Googled it" / "Found you online" / "Saw you on Google Maps" | Google |
| "I clicked an ad" / "Google ad" / "Sponsored result" | Pay Per Click (PPC) |
| "Green checkmark" / "Google Guaranteed" / "I saw your listing" | Google LSA |
| "I used you before" / "You did work for me last year" | Existing Customer |
| "My neighbor recommended you" / "A friend told me" | Referral Group |
| "I found you on Angie's List" / "Angi" | Angie's List |
| "Through Service Direct" | Service Direct - MRKT 1 |
| "My home inspector" / "Inspector Nick" | Inspector Nick |
| "Better Business Bureau" / "BBB website" | BBB |
| Not sure / Unclear | ASK AGAIN, do not guess |
❌ Common CSR Mistakes to Avoid
▼
🚨
Defaulting to "Existing Customer" for every call. This is the #1 data quality killer. Only select this if the customer confirms they have used Bright Side before.
🚨
Skipping the "How did you hear about us?" question. It takes 5 seconds. It is the difference between knowing our ROI and guessing.
⚠
Using "General Plumbing Service" for everything. Take 10 extra seconds to pick the right job type. It helps the tech prepare and gives us better data.
⚠
Leaving notes blank. A blank note means the tech walks in blind. Always include what the customer described, even if it is just one sentence.
Section 06
Technician Field Completion
The CSR gets the job started right. The technician finishes it right. Every field visit must end with a complete record in ServiceTitan.
🛠 The 5-Step Field Completion Process
-
Update the job status in real time
When you arrive, mark the job as "In Progress." When finished, set it to "Completed." If the customer cancels or reschedules on-site, set the appropriate status and add a note explaining why. Never leave a job in "Dispatched" status after you have been on site.
-
Add all line items with proper pricing
Every part, material, and labor charge must be added as a line item. Use the pricebook templates when available. Do not lump everything into a single "Plumbing Service" line item. Detailed invoices build customer trust and give us accurate cost-of-goods data.
-
Capture the customer's signature
Before leaving the property, have the customer sign off on the completed work. This protects both the customer and the company. No signature = no proof of service completion.
-
Add photos and technician notes
Take before and after photos. Document what you found, what you did, and any recommendations for future work. These notes feed into follow-up campaigns and help the next tech who visits this customer.
-
Complete and finalize the invoice before leaving
Do not drive to the next job with an open invoice. Close it out on-site. Incomplete invoices create billing delays, inaccurate daily revenue numbers, and extra office work for the team.
📷 Photo Documentation Standards
▼
Every job should have a minimum of these photos attached:
- Before photo: The problem area as the customer sees it when you arrive
- During photo: The work in progress (exposed pipes, equipment, diagnostic readings)
- After photo: The completed repair, clean and professional
- Equipment labels: Serial numbers, model numbers for water heaters, fixtures, or major components
- Wider context shot: Show the surrounding area so the next tech can find the work location
📸
Photos sell future work. When we follow up with a customer 6 months later about a recommended repair, the photo of the corroded pipe is worth more than 1,000 words.
📝 Job Status Definitions
▼
| Status |
When to Use |
Who Sets It |
| Scheduled |
Job is booked but not yet dispatched |
CSR / Dispatcher |
| Dispatched |
Tech has been assigned and is en route |
Dispatcher |
| In Progress |
Tech is on-site and actively working |
Technician |
| Completed |
Work is done, invoice is finalized, signature captured |
Technician |
| Canceled |
Customer canceled before or during the visit |
CSR / Tech |
| On Hold |
Waiting on parts, customer decision, or scheduling |
Technician / Dispatcher |
Section 07
Reporting & Data Quality Audit
Good data requires ongoing discipline. These audits catch gaps before they become blind spots.
📅 Weekly Data Quality Check
▼
Run these checks every Monday morning. Total time: approximately 15 minutes.
-
Jobs missing campaign attribution
Navigate to Reporting > Jobs. Filter by the past 7 days. Sort by Campaign. Look for jobs with blank or "None" campaign fields. For each one, check the call recording or lead source and update the campaign.
-
Jobs with "General Plumbing Service" type
Filter jobs by type "General Plumbing Service." Review each one. Could it have been categorized more specifically? If the tech notes say "cleared kitchen drain," update the type to "Drain Cleaning."
-
Incomplete invoices
Check for jobs marked "Completed" but with $0 revenue or missing invoices. These are lost revenue records. Follow up with the assigned technician.
-
Cancel rate spot check
Count how many jobs were canceled in the past week. If cancel rate exceeds 20%, dig into which sources are driving cancellations.
📊 Monthly Revenue by Source Report
▼
This is the most important monthly report. It connects every marketing dollar to the revenue it generated.
Reporting
▶
Marketing
▶
Campaign Performance
Key columns to review:
| Metric |
What It Tells You |
Target |
| Revenue by Source |
Which channels generate the most dollars |
Track monthly trend |
| Avg Ticket by Source |
Which channels send high-value customers |
> $300 avg |
| Cancel Rate by Source |
Which channels send flaky leads |
< 15% |
| Conversion Rate |
What percentage of booked calls become completed jobs |
> 75% |
| Cost Per Lead (CPL) |
How much each lead costs from each source |
Varies by source |
| ROI by Source |
Revenue divided by marketing spend for each channel |
> 5x |
🎯
The goal: Know the ROI of every marketing dollar within 30 days of spending it.
Perfect data makes this possible. Missing data makes it impossible.
Watch for these signals that data quality is slipping:
| Red Flag |
What It Means |
Action |
| Critical >10% of jobs have no campaign |
CSRs are skipping the source question |
Retrain CSRs, review call recordings |
| Critical "Existing Customer" is >40% of jobs |
CSRs are defaulting instead of asking |
Audit the "Existing Customer" jobs manually |
| Warning Cancel rate spikes above 25% |
A lead source may be sending low-quality leads |
Break down cancel rate by source, investigate |
| Warning Many jobs with $0 revenue |
Techs are not completing invoices in the field |
Reinforce the 5-step field completion process |
| Watch "General Plumbing" exceeds 30% of job types |
Job types are not being selected carefully |
Review with CSR team, provide quick reference card |
Section 08
Integration Checklist
Third-party lead sources and advertising platforms must be properly integrated so that attribution flows automatically.
✅ Google Local Services (LSA)
▼
Google LSA leads should flow directly into ServiceTitan with the "Google LSA" campaign pre-selected.
- Verify the LSA integration is active in Settings > Integrations > Google Local Services
- Confirm the campaign mapping: LSA leads should auto-tag as "Google LSA" campaign
- Check lead flow daily: Compare the number of leads in Google LSA dashboard vs. ServiceTitan
- Dispute invalid leads: If a lead is spam or outside service area, dispute it in Google LSA AND mark it in ServiceTitan
Settings
▶
Integrations
▶
Google Local Services
📞 Service Direct (MRKT 1)
▼
Service Direct leads come through a dedicated tracking number. That number must be mapped to the correct campaign.
- Verify the tracking number assigned to Service Direct is active and routing to the main line
- Confirm the campaign mapping: Calls from this number should auto-tag as "Service Direct - MRKT 1"
- Test the number monthly: Call it and verify it rings through and the attribution populates correctly
- Review lead quality: Compare Service Direct leads against other sources for cancel rate and avg ticket
💡
If Service Direct leads are not auto-tagging, check that the tracking phone number in ServiceTitan matches
the one in your Service Direct account exactly (including area code format).
📈 Google Ads (PPC) Call Tracking
▼
Google Ads uses forwarding numbers (Google Ads tracking numbers) that dynamically display on the website. These calls must route to the correct campaign.
- Google forwarding numbers are configured at the account level and are already active
- Calls from PPC ads should be tagged as "Pay Per Click (PPC)" campaign
- Verify call extensions in Google Ads are using the correct forwarding number
- Check for number mismatches: If you see unfamiliar numbers in ServiceTitan, they may be Google tracking numbers (this is normal)
💡
About mystery phone numbers: If you see an unfamiliar phone number as the source of a call in ServiceTitan,
it is likely a Google Ads tracking/forwarding number. These rotate regularly. Do not panic.
The call still came from a real customer who clicked your ad.
Every lead source with a unique tracking number must have that number mapped to its campaign in ServiceTitan.
-
Navigate to Settings > Phones > Tracking Numbers
Review the list of all tracking numbers and their associated campaigns.
-
Cross-reference with your lead source accounts
Log into Service Direct, Google LSA, Networx, etc. and confirm the forwarding numbers match what is in ServiceTitan.
-
Test each number quarterly
Call each tracking number from a cell phone. Verify: (a) it rings through, (b) the call appears in ServiceTitan, and (c) the correct campaign is auto-selected.
-
Document any new numbers
When a new lead source is added, immediately register the tracking number in ServiceTitan and map it to the campaign before the first call comes in.
Section 09
Quick Reference Card
Print this. Pin it next to your monitor. Tape it to the dashboard of the van. These are the rules that protect our data.
★ The Five Rules of Data Quality
📢
Every Job Gets a
Campaign Source
🔧
Every Job Gets a
Job Type
🏢
Every Job Gets a
Business Unit
✅
Every Job Gets a
Final Status
💰
Every Job Gets a
Complete Invoice
📞 CSR Quick Checklist (Every Call)
- "How did you hear about us?", Select the matching campaign
- Confirm name, address, phone, Spell it back, read it back
- Select the most specific job type, Not "General" unless truly unclear
- Assign the correct business unit, Service, Maintenance, Sales, or Install
- Write a detailed job description, Customer's words, not yours
- Set priority, Urgent, High, Normal, or Low
🛠 Tech Field Checklist (Every Job)
- Mark "In Progress" on arrival, Update status in real time
- Add every line item, Parts, materials, labor, all with correct pricing
- Capture customer signature, Before you leave the property
- Take before/after photos, Minimum 3 photos per job
- Finalize the invoice on-site, Do not leave with an open invoice
📊 Manager Weekly Audit (Every Monday)
- Check jobs with no campaign, Fix attribution retroactively
- Review "General Plumbing Service" usage, Reclassify where possible
- Spot-check incomplete invoices, Follow up with technicians
- Review cancel rate by source, Flag sources above 20%
- Verify integration health, Are LSA/Service Direct leads flowing in?
Data-Driven Findings
Configuration Gap Audit
Quantified analysis from 658 jobs over 90 days (Dec 15, 2025, Mar 13, 2026) via ServiceTitan API. Total revenue: $619,689.90. Each gap includes the data, the impact, and the fix.
🔴 GAP 1: "Existing Customer" Overuse (170 jobs / 26%)
170 jobs tagged "Existing Customer", inflated because HCP-migrated customers default to this tag, and SLP/SD customers get retagged on callbacks. This hides the true ROI of paid sources.
The Fix
- Create "Original Lead Source" custom field on customer profiles. First-touch attribution stays forever, even when callbacks get tagged differently.
- HCP Migration: When importing HCP customers, set Original Lead Source = "House Call Pro." New jobs still get current campaign tag, but acquisition source is preserved.
- CSR Training: Before selecting "Existing Customer," check the customer profile for their original source. If they came from SLP, tag the callback to SLP.
🔸 GAP 2: "General Plumbing" Catch-All (264 jobs / 40.3%)
264 of 655 jobs (40.3%) tagged as "General Plumbing Service." This masks the actual service mix, we can't tell if a job was drain cleaning, leak detection, faucet repair, etc. Makes it impossible to optimize by service type.
The Fix
- Tech verifies/updates job type on-site. CSR picks best-guess at booking, tech corrects on arrival based on actual work performed.
- Multi-service visits: Tag to the PRIMARY (highest-revenue) service. A $2,000 drain cleaning + $200 faucet repair = Drain Cleaning.
- Goal: Get "General Plumbing" below 15% of total jobs within 60 days.
🔴 GAP 3: 19 Dead Campaigns (Zero Jobs in 90 Days)
19 campaigns in ServiceTitan have generated zero jobs in 90 days. They clutter the CSR dropdown and increase the chance of mis-selection. Includes: Goodzer - MRKT 2, old/renamed campaigns.
The Fix
- Archive or deactivate all 19 dead campaigns. Fewer options = fewer CSR mistakes.
- Keep only campaigns that actively receive leads. Current active: Google LSA, Service Direct - MRKT 1, Service Local Pro - MRKT 2, Google Organic, Existing Customer, Networx, Voolt, Angie's List, House Call Pro, Google Ads (new 2026 campaigns).
- Review quarterly. If a campaign goes 60 days with zero jobs, archive it.
🔸 GAP 4: LSA 25.3% Cancel Rate (Highest of Any Source)
Google LSA: 182 jobs, 46 canceled (25.3%). Compare to Service Direct at 8.3%. LSA is the #1 volume source but a quarter of leads cancel. That's ~$23K/quarter in potential lost revenue.
The Fix
- Review canceled LSA jobs for patterns. Are they tire-kickers? Wrong service area? After-hours? Price shoppers?
- CSR qualification: Add 2-3 qualifying questions for LSA calls before booking (service needed, homeowner?, timeline).
- Target: Reduce LSA cancel rate to under 15% within 60 days.
🔸 GAP 5: 43 Stuck Jobs (Not Completed or Canceled)
43 jobs sitting in limbo, not Completed, not Canceled. These skew revenue reporting and clog the dispatch board. Some have active estimates awaiting customer decisions.
The Fix
- Weekly job audit (every Monday), review all jobs older than 7 days not in Completed/Canceled.
- Has active estimate? Set to HOLD. This keeps the sales pipeline alive, the estimate stays valid and the sales manager can follow up.
- No service, no estimate, customer declined? Cancel with reason code (e.g., "Customer Declined," "No Response," "Wrong Service Area").
- NEVER complete a job with $0 just to close it out. This breaks revenue metrics. Use Hold or Cancel instead.
🔴 GAP 6: Campaign Misattribution (Proven via API Audit)
Cross-referencing SLP customer names against ST campaign tags proved 7 SLP-acquired customers had jobs tagged as Service Direct. CSRs select campaign at booking based on what the customer says, not verified source. Callbacks default to "Existing Customer."
Fix Options (ranked by effectiveness)
- Option 1: Unique tracking numbers per Google Ads campaign. Auto-tags via ST phone integration. No CSR judgment needed.
- Option 2: Dynamic Number Insertion (DNI) on website. Different number per traffic source, auto-attributed in ST.
- Option 3: "Original Lead Source" custom field (see Gap 1). First-touch preserved even when callback campaign changes.
- Option 4: Nexus cross-reference script. Match inbound number against lead source database for automated verification.
🔵 GAP 7: No Job Closing Workflow
No documented process for closing jobs where no service was performed. Canceling jobs with active estimates breaks the sales pipeline (estimates become invalid, sales manager can't follow up on conversions).
Standard Job Closing Workflow
- Has active estimate awaiting decision? → Set to HOLD. Keeps estimate valid. Sales manager follows up.
- No service, no estimate, customer declined? → CANCEL with reason code.
- Service performed but $0 invoice? → FIX THE INVOICE. Never complete with $0.
- Estimate rejected by customer? → Cancel with "Estimate Declined" reason.
🔵 GAP 8: SLP-Specific Attribution Problem
SLP sends leads from 3 programs: "Brightside PLMB" ($155/call), "100 Year PLMB" ($155/call), "Low Cost Brightside" ($50/call). But all should map to one ST campaign: "Service Local Pro - MRKT 2" (ID: 56753933). Callbacks get scattered across other campaigns.
The Fix
- When SLP customer calls back: CSR checks customer profile, re-tags to SLP campaign, not "Existing Customer."
- 75% of SLP leads (53 of 71) never became ST customers. This is a conversion problem, not just attribution.
- Track SLP ROI monthly: Revenue from "Service Local Pro - MRKT 2" jobs vs. SLP billing charges.
🔵 GAP 9: Tech Job Type Verification
CSRs make a best-guess job type at booking, but this often stays as "General Plumbing" and never gets corrected. Techs see the actual problem on-site but don't update the job type.
The Fix
- Add to tech arrival checklist: "Verify job type matches actual work. Update if different."
- If job type is "General Plumbing," tech MUST change it to the specific service (Drain Cleaning, Leak Detection, Water Heater, etc.).
- Multi-service visits: Use the highest-revenue service as the primary job type.
🔷 GAP 10: Revenue Reporting Accuracy
ST's native Marketing ROI report exists but depends on correct campaign attribution (Gaps 1, 6, 8). With current misattribution, ST's own reports undercount some sources and overcount others.
The Fix
- Fix attribution first (Gaps 1, 6, 8). Then ST's native reports become trustworthy.
- Meanwhile: Use API-based revenue scripts (st_rev_breakdown.py) for accurate cross-referenced reporting.
- Revenue field: Use
job.total (float) from the Jobs API, this is the authoritative invoice amount. Do NOT use the invoices endpoint (returns total as string, causes calculation errors).
- Verified totals (90 days): $619,689.90 across 658 jobs, 249 with revenue.
Gap Audit Priority Matrix
FIX NOW (Week 1-2)
- Archive 19 dead campaigns
- Clear 43 stuck jobs
- Job closing workflow training
FIX SOON (Week 3-4)
- CSR attribution training
- Tech job type verification
- General Plumbing reduction
BUILD (Month 2)
- "Original Lead Source" field
- Tracking number auto-attribution
- LSA cancel rate reduction
Audit date: March 13, 2026 | Data: 658 jobs, 90-day window | Source: ServiceTitan API v2
🌟
The Bottom Line
Every piece of data we capture in ServiceTitan feeds our ability to make smarter marketing decisions,
identify the best lead sources, cut waste, and grow revenue. When the data is clean, we know exactly
where every dollar comes from and where the next dollar should go.
13 Campaigns
50 Job Types
4 Business Units
$620K Tracked