THE CURRENT STATE (Trust Engine Verified)
69% of jobs show $0 revenue. 76% have no tech assigned. The real weekly revenue is ~$113K but we can only prove $35K. Every metric downstream (CPL, ROAS, profitability) is wrong by 3.2x.
MEETING AGENDA (30 minutes)
1
Invoice Closure Gap (5 min), 69% of jobs show $0
2
Tech Assignment Gap (3 min), 76% have no soldById
3
Campaign Attribution (5 min), 0/42 jobs tagged to Google Ads
4
General Plumbing Overuse (3 min), 40.3% of jobs in catch-all
5
Dead Campaigns + Misattribution (3 min), 19 dead campaigns, SLP retagging
6
Membership Configuration (5 min), 3 tiers, ST setup needed
7
Marketing Pro Ads Optimizer (3 min), feed revenue back to Google
8
Google Workspace Security (3 min), 15 users missing 2SV
ISSUE 1: INVOICE CLOSURE GAP
29 of 42 jobs (69%) show $0 revenue
Techs complete jobs but invoices sit in Hold or Pending. $78,297 in invisible revenue this week alone. This is the #1 problem, every other metric is wrong because of this.
OPTION A: Same-Day Posting Workflow
Tech completes job ➡ creates invoice on-site ➡ Ashton reviews same day ➡ posts to QuickBooks. No job sits overnight without an invoice. Ashton checks at 4 PM daily for any unbilled completed jobs.
OPTION B: ST Automated Alerts
Configure ST notification: "Job completed with $0 invoice" ➡ alert Ashton automatically. ST can send email/push when a job closes without revenue posted. Ask ST rep how to configure this.
OPTION C: Weekly Audit Report
Nexus already tracks this (nexus_st_accuracy_monitor.py runs daily at 2:30 PM). We can send Stephanie a weekly report of all $0 jobs. But this is reactive, Option A is better.
ASK THE ST REP: Can we set up an automated notification when a job is completed but has $0 on the invoice? What's the fastest path to getting invoices posted same-day?
ISSUE 2: TECH ASSIGNMENT GAP
32 of 42 jobs (76%) have no tech assigned (soldById = null)
We can't track tech performance, commission accuracy, or who generated which revenue. The tech scorecard is blind.
OPTION A: Dispatch Auto-Assignment
When a job is dispatched to a tech, ST should auto-populate soldById with that tech's ID. Ask the ST rep if this is configurable in dispatch settings.
OPTION B: Tech Self-Assignment
Techs assign themselves to the job in the ST mobile app when they arrive on-site. Add to the tech checklist: "Step 1: Open job in app. Step 2: Assign yourself."
OPTION C: CSR Assignment at Booking
When a customer requests a specific tech (repeat customers often do), CSR assigns at booking time. For new customers, dispatch assigns.
ASK THE ST REP: Is there a setting to auto-populate soldById when a job is dispatched? Can we make it a required field before a job can be marked complete?
ISSUE 3: CAMPAIGN ATTRIBUTION
0 of 42 jobs tagged to Google Ads (PPC) this week
$401/week in ad spend with zero attributed revenue. The "Pay Per Click (PPC)" campaign (ID 1591) has only 17 jobs in 180 days. Most Google-sourced calls land in "Unattributed" because CSRs don't ask or don't know which campaign to select.
OPTION A: Dynamic Number Insertion (DNI) via ST Marketing Pro
ST assigns a unique tracking number to each Google Ads campaign. When a customer calls that number, ST auto-tags the job. No CSR action needed. This is the gold standard.
OPTION B: Google Ads Integration in ST
ST has a native Google Ads integration (Marketing Pro Ads). Connect Google Ads account ➡ ST imports campaign data ➡ auto-attributes calls to campaigns based on tracking numbers. Ask the ST rep to walk through setup.
OPTION C: CSR Training + Call Source Question
CSR asks every caller: "How did you find us?" and selects the matching campaign. Least accurate but cheapest. Current approach, clearly failing at 0/42.
OPTION D: Nexus Auto-Tagger (Already Running)
nexus_auto_tagger.py matches calls to sources using phone number patterns. Improved attribution from 0% to 58.9%. But can't distinguish Google Ads from organic Google calls because they use the same phone number.
ASK THE ST REP:
1. What does Marketing Pro Ads cost? Is it included in our plan?
2. Can we set up DNI tracking numbers for each Google Ads campaign?
3. How does the Google Ads integration work? Walk us through connecting our account (CID: 7269555791, MCC: 8449092450).
4. Can ST auto-tag jobs based on the tracking number that received the call?
5. Does ST support importing offline conversions back to Google Ads (for Smart Bidding)?
ISSUE 4: GENERAL PLUMBING CATCH-ALL
40.3% of jobs tagged as "General Plumbing Service"
264 of 655 jobs in the catch-all. Can't tell if it was a drain clean, leak detection, faucet repair, or water heater. Service mix analytics are blind.
FIX: Tech Verifies Job Type On-Site
CSR picks best-guess at booking. Tech updates the job type in the mobile app when they arrive and assess the actual problem. For multi-service visits, tag to the highest-revenue service. A $2,000 drain cleaning + $200 faucet repair = tag as Drain Cleaning.
ASK THE ST REP: Can we make job type a required field that the tech must confirm before completing the job? Can we add a validation step?
ISSUE 5: DEAD CAMPAIGNS + MISATTRIBUTION
19 dead campaigns active + SLP customers being retagged
19 campaigns with ZERO jobs in 90 days still clutter the dropdown. CSRs pick wrong campaigns because there are too many options. SLP customers calling back get retagged as "Existing Customer" instead of staying as SLP.
FIX A: Archive Dead Campaigns
Deactivate the 19 campaigns with zero activity. Fewer options = fewer CSR mistakes. Keep only campaigns that actively receive leads.
FIX B: "Original Lead Source" Custom Field
Create a custom field on the customer profile that captures their FIRST source. Callbacks keep the original source. CSR still tags the current campaign, but we preserve first-touch attribution.
FIX C: Campaign Dropdown Reorder
Put the top 5 most-used campaigns at the top of the dropdown: Google LSA, Existing Customer, Google, Service Direct, Pay Per Click. The other 14 active ones go below.
ASK THE ST REP:
1. Can we archive/deactivate campaigns that are no longer in use?
2. Can we create an "Original Lead Source" custom field on customer profiles?
3. Can we reorder the campaign dropdown to prioritize the top 5?
ISSUE 6: MEMBERSHIP PROGRAM IN ST
3 Tiers Approved by Kalen (Pending Brenda Research)
Stephanie wants clear contracts before selling more. One plan was already sold without terms defined. Need ST configured before launching.
ESSENTIALS
$15/mo
Annual inspection
Priority scheduling
10% off repairs
No trip charge
PREMIUM
$30/mo
Everything in Essentials
+ Sewer camera inspection
+ 15% off all services
+ Water heater flush
VIP
$45/mo
Everything in Premium
+ Emergency priority
+ Drain cleaning included
+ Whole-home audit
ASK THE ST REP:
1. How do we set up membership tiers in ST? (Membership module configuration)
2. Can ST auto-schedule annual inspections for members?
3. Can we auto-apply the member discount (10%/15%) at invoice time?
4. Can we track membership revenue separately in reporting?
5. Can we set up recurring billing through ST or does it need a separate tool?
6. Can we auto-enroll customers at job completion (tech offers membership)?
NOTE: Stephanie wants contract terms defined before launching. Membership is TABLED until Brenda research is complete. This meeting is about ST configuration only, not launch.
ISSUE 7: MARKETING PRO ADS OPTIMIZER
Feed Real Revenue Back to Google Ads (Smart Bidding)
Google Ads currently optimizes for "conversions" (phone calls, form fills). It has no idea which calls became $9,700 sewer jobs vs $0 hangups. Marketing Pro Ads Optimizer feeds REAL ST revenue back to Google, so Smart Bidding can prioritize high-value customers.
THE OPPORTUNITY:
Right now: Google sees "72 conversions" and optimizes equally for all of them (including 66 India bots).
With Ads Optimizer: Google sees "this click became a $9,700 sewer job" and bids more for similar customers.
Result: Google stops wasting money on low-value clicks and targets customers who actually book high-ticket jobs.
ASK THE ST REP:
1. Is Marketing Pro Ads included in our plan or is it an add-on?
2. How do we connect Google Ads account (CID: 7269555791)?
3. Does it feed job.total (actual revenue) or just "conversion" signals?
4. How long does it take for Smart Bidding to learn from the revenue data?
5. Can we run a bid experiment to test Ads Optimizer vs our current setup?
6. Does it work with LSA or only Search campaigns?
ISSUE 8: GOOGLE WORKSPACE SECURITY
15 Users Missing 2-Step Verification + 1 Unsafe Device
Stephanie forwarded Google Workspace security alert. Kalen's admin account owns the configuration. Robert cannot access Site Kit or Workspace security settings without Kalen's login.
ASK KALEN:
1. Log into admin.google.com and enable mandatory 2SV for all users
2. Check the 1 flagged unsafe device in Admin Console > Devices
3. In WP Admin > Site Kit > Settings: disconnect old Google Ads account AW-242993149 (dead agency tag still firing on every page)
4. Give Robert admin access to Google Workspace (or walk through the settings together)
DEEP DIVE: 113 STUCK JOBS + 227 COMPLETED AT $0
57 Jobs Stuck in "Scheduled" (7-90 days old)
These jobs were booked but never dispatched or completed. 50 of 57 show $0. Some are 90 days old. They clog the board and make the schedule look busier than it is.
Oldest 5:
Job #58216188: 90 days old, $0, Scheduled
Job #58232444: 87 days old, $0, Scheduled
Job #58232828: 87 days old, $0, Scheduled
Job #58246524: 83 days old, $0, Scheduled (HAS ESTIMATE)
Job #58318844: 76 days old, $0, Scheduled
ACTION PLAN FOR 57 SCHEDULED STUCK JOBS:
Step 1: ST > Jobs > Filter: Status = "Scheduled" + Created before March 16
Step 2: For each job, check:
• Does the customer still want the work? (Ashton calls to confirm)
• Was it already done under a different job? (Check customer history)
• Was it a no-show that was never canceled?
Step 3: Decision tree:
✅ Customer still wants it ➡ Reschedule with a real date
⚠ Customer undecided ➡ Set to HOLD, add follow-up task for Ashton
❌ Customer declined / unreachable / duplicate ➡ Cancel with reason
Target: Zero scheduled jobs older than 14 days. Clean the board this week.
56 Jobs Stuck in "In Progress" (7-84 days old, $269K in limbo)
These jobs were dispatched but never completed. 27 have pending estimates. 29 have revenue attached ($269K total) but the jobs aren't closed. This is where the big money hides.
Biggest revenue in limbo:
Job #58300670: 77 days old, $37,939, In Progress
Job #58252542: 83 days old, $14,780, In Progress (HAS ESTIMATE)
Job #58236415: 84 days old, $14,000, In Progress (HAS ESTIMATE)
Job #58266368: 82 days old, $9,150, In Progress
27 jobs have estimates pending customer decision
ACTION PLAN FOR 56 IN PROGRESS STUCK JOBS:
Step 1: ST > Jobs > Filter: Status = "In Progress" + Created before March 16
Step 2: Sort by revenue (highest first, recover the big money first)
Step 3: For each job:
IF work was completed and invoice exists:
1. Open the job > Invoice section
2. Verify line items + pricing
3. Post the invoice
4. Mark job as Completed
5. Revenue becomes VISIBLE immediately
IF estimate is pending customer decision:
1. Check the estimate date. How old is it?
2. If < 30 days: Set to HOLD. Ashton calls for follow-up.
3. If 30-60 days: Ashton calls with a "checking in" script (from Estimate Recovery Engine)
4. If > 60 days: Last attempt call. If no response, Cancel with "Estimate Expired"
5. Do NOT cancel jobs with active estimates under 30 days. Those are sales pipeline.
IF no work done, no estimate, customer ghosted:
1. Cancel with reason "Customer Unreachable" or "No Response"
2. Add a note with the date and number of contact attempts
PRIORITY ORDER:
1. First: Close the $37K, $14K, $14K, $9K jobs (post invoices = instant $75K+ visible revenue)
2. Second: Call the 27 estimate-pending jobs (potential $200K+ in pipeline)
3. Third: Cancel the dead ones (clean the board)
227 Completed Jobs at $0 (54% of all completed)
These jobs are marked "Completed" but show zero revenue. Either the invoice was never posted, or the work was free/warranty with no note explaining why.
ACTION PLAN:
Triage by category:
Category A: Invoice exists but not posted
Open job > Invoice section > Post Invoice. Instant revenue recovery.
This is likely the biggest category. Each one posted = revenue becomes visible.
Category B: Warranty / diagnostic / no-charge visit
These are legitimately $0. But they need a note: "Warranty repair" or "Diagnostic only, no charge."
Without the note, we can't tell these apart from Category A (missing invoices).
Category C: Invoice was never created
Work was done, customer was charged, but nothing was entered in ST.
This is the worst case. Revenue exists in QuickBooks but not in ST.
Fix: Ashton/Stephanie cross-references QuickBooks payments for these job dates.
REALISTIC TARGET:
Don't try to fix all 227 at once. Start with the last 30 days (most recoverable).
Going forward: ZERO completed jobs without a posted invoice. Same-day posting rule.
GOING FORWARD: WEEKLY JOB HYGIENE (Every Monday, 15 minutes)
Ashton's Monday checklist:
☐ Filter: Status = "Scheduled", older than 7 days. Call or cancel each one.
☐ Filter: Status = "In Progress", older than 7 days. Post invoice or set to Hold.
☐ Filter: Status = "Completed", revenue = $0, last 7 days. Post any missing invoices.
☐ Filter: Status = "Hold", older than 30 days. Follow up or cancel.
☐ Report count to Stephanie: "X jobs cleaned, $Y revenue recovered."
This runs automatically via Nexus (nexus_st_accuracy_monitor.py) and reports to the war room daily. Ashton just needs to ACT on it.
CLICK-BY-CLICK GUIDES (Tap any task for exact ST steps)
Close Open Invoices ($78K+ Hidden Revenue)
WHY THIS MATTERS: 69% of jobs show $0 revenue because invoices are open. Kalen cannot trust the dashboard until this is fixed. $78,297 in revenue is INVISIBLE this week alone.
STEP BY STEP:
1. ST > Reports > Open Invoices (or Dispatch Board > filter by status)
2. For each open invoice: click the job > scroll to Invoice section
3. Verify: Does the invoice have line items with correct pricing?
4. If YES: Click Post Invoice (green button, top right of invoice)
5. If NO line items: Add the services performed, then post
6. If job was free/warranty: Post with $0 but add a note WHY
7. NEVER leave an invoice unposted. It makes revenue invisible.
8. Target: Same-day invoice posting. Job done = invoice posted that day.
Stop Using "General Plumbing" (Currently 40.3% of Jobs)
WHY THIS MATTERS: When 40% of jobs say "General Plumbing," we cannot tell what services actually sell. Sewer revenue looks low because sewer jobs are hidden under General Plumbing.
STEP BY STEP:
1. When booking: pick the SPECIFIC service, not General Plumbing
2. Drain cleaning = Drain Cleaning (not General Plumbing)
3. Leak repair = Leak Repair or Water Line Repair
4. Water heater = Water Heater Repair or Water Heater Installation
5. Sewer jobs = use one of the 7 sewer types:
1. Sewer Camera Inspection
2. Sewer Line Repair
3. Sewer Line Replacement
4. Trenchless Sewer Repair
5. Sewer Cleanout Install
6. Sewer Backup / Emergency
7. Sewer Line Locate
6. Multi-service job: use the HIGHEST revenue service as the type
7. Example: $2K drain cleaning + $200 faucet = Drain Cleaning
Fix Campaign Attribution on Callbacks
WHY THIS MATTERS: When an SLP or LSA customer calls back, the job gets tagged as "Existing Customer." This breaks ROI tracking. We think SLP/LSA generated fewer jobs than they actually did.
STEP BY STEP:
1. When a returning customer calls:
2. Open their customer profile in ST
3. Check the FIRST job. What campaign was it tagged with?
4. If first job was Google LSA or Service Local Pro, tag the new job with THAT campaign
5. Only use "Existing Customer" if you genuinely cannot determine original source
6. If customer says "I found you on Google": ask "Did you call the number in the green badge?" (Green badge = LSA)
Weekly Stuck Job Audit (Every Monday)
WHY THIS MATTERS: 43 jobs sitting in limbo. Not Completed, not Canceled. They clog dispatch and make revenue invisible.
STEP BY STEP:
1. Every Monday: ST > Jobs > filter Status = In Progress or On Hold
2. Filter by date: older than 7 days
3. For each stuck job, pick ONE action:
A) Has active estimate customer is considering > Set to HOLD
B) Customer declined estimate, no work done > Cancel with reason "Estimate Declined"
C) Work was done but invoice not posted > Post the invoice, then Complete
D) Customer no-showed or unreachable > Cancel with reason "No Show"
4. NEVER complete a job with $0 just to clear it. That breaks revenue metrics.
5. Target: Zero jobs older than 14 days in any status except Hold
Archive 19 Dead Campaigns
WHY THIS MATTERS: 19 campaigns with ZERO jobs in 90 days still active. Every dead campaign is another option for CSRs to accidentally pick. Fewer options = fewer mistakes.
STEP BY STEP:
1. ST > Settings > Marketing > Campaigns
2. Sort by "Jobs" or "Last Used"
3. Any campaign with 0 jobs in 90+ days: click it > set to Inactive
4. Keep ONLY active campaigns: Google LSA, Google Ads (BSP), Service Local Pro, Service Direct, Networx, Existing Customer, Referral, Direct/Walk-in
5. Archive everything else (Goodzer, old renamed campaigns, etc.)
Tech Self-Assignment (soldById Fix)
WHY THIS MATTERS: 76% of jobs have no tech assigned. We can't track who generated what revenue.
STEP BY STEP:
1. When tech arrives on-site: open the job in ST mobile app
2. Tap "Job Details" or "Edit"
3. Set "Sold By" to your name
4. This must happen BEFORE marking the job complete
5. If multiple techs: the lead tech (who diagnosed and sold) gets the assignment
6. Target: 100% of completed jobs have a tech assigned
30 QUESTIONS FOR THE ST REP (Best Practices)
📋 INVOICE CLOSURE
☐ 1. Can we make invoice posting a REQUIRED step before a job can be marked Complete?
☐ 2. Is there a way to auto-generate a draft invoice with line items when a tech marks work done in the mobile app?
☐ 3. Can we set up a daily automated report that shows all completed jobs with $0 invoices?
☐ 4. What do your most successful clients do to enforce same-day invoice posting?
☐ 5. Can we set up an alert that fires when a job sits in Completed status for 24+ hours with no posted invoice?
🚨 STUCK JOBS
☐ 6. What's the best practice for jobs that sit in "Scheduled" for 30+ days? Bulk cancel or individual review?
☐ 7. Can we set up an auto-notification when a job has been in "In Progress" for more than 7 days?
☐ 8. Is there a bulk status-change tool for cleaning up old jobs, or does each one need to be handled individually?
☐ 9. For jobs with pending estimates over 60 days, what do your top clients do? Auto-expire or manual follow-up?
☐ 10. Can we create a custom dashboard tile that shows "Jobs older than 7 days not Completed/Canceled"?
👷 TECH ASSIGNMENT (soldById)
☐ 11. Can soldById auto-populate from the dispatch assignment?
☐ 12. Can we make it a required field before a tech can complete a job in the mobile app?
☐ 13. What's the best practice for multi-tech jobs? Does the primary tech get the assignment?
🎯 CAMPAIGN ATTRIBUTION
☐ 14. How does Dynamic Number Insertion work with your Marketing Pro module? What's the cost?
☐ 15. Can the system auto-tag a job based on which tracking number received the call?
☐ 16. Do your top plumbing clients use DNI or CSR-based attribution? What works better?
☐ 17. Can we feed ST job revenue back to Google Ads for Smart Bidding via Marketing Pro Ads?
🔧 JOB TYPES
☐ 18. Can we make job type a required field that the tech must confirm in the mobile app before completing?
☐ 19. What's your recommended job type structure for a residential plumbing company? How granular should sewer types be?
☐ 20. Can we restrict "General Plumbing" so it can only be selected at booking but must be changed by the tech on-site?
👑 MEMBERSHIP
☐ 21. Walk us through configuring 3 membership tiers in ST (Essentials $15, Premium $30, VIP $45)
☐ 22. Can ST handle recurring billing for memberships or do we need a separate tool?
☐ 23. Can the system auto-schedule the annual inspection when a member enrolls?
☐ 24. Can we auto-apply the member discount percentage at invoice time?
☐ 25. How do your top clients track membership ROI (subscriptions + upsell revenue from inspections)?
💡 GENERAL BEST PRACTICES
☐ 26. What do your most profitable plumbing clients do differently in ST that we're not doing?
☐ 27. What's the #1 configuration mistake you see plumbing companies make?
☐ 28. Are there any ST features we're paying for but not using?
☐ 29. Can you run a health check on our account and flag configuration issues?
☐ 30. What's the typical timeline for a plumbing company to go from "data mess" to "clean data" in ST?
MEETING CHEAT SHEET
THE ONE-LINER: "We have $78K in revenue every week that we can't see because invoices aren't closed and techs aren't assigned. Fix those two things and our data becomes trustworthy."
IF ST REP ASKS "WHAT'S YOUR BIGGEST PAIN POINT?":
"We can't prove our Google Ads ROAS because calls aren't attributed to campaigns. We need DNI tracking numbers or the Marketing Pro Ads integration."
IF KALEN PUSHES BACK ON COMPLEXITY:
"Two changes fix 80% of the problem: (1) Ashton posts invoices same-day, (2) techs assign themselves in the app. Everything else is configuration that the ST rep does for us."
IF STEPHANIE ASKS ABOUT MEMBERSHIP:
"We're getting the ST configuration ready so when we launch, it works. No launch until Brenda research is done and contracts are written."
WHAT WE WALK AWAY WITH:
☐ Invoice closure workflow agreed
☐ Tech assignment process agreed
☐ Marketing Pro Ads timeline
☐ Dead campaigns archived
☐ Membership tiers configured (not launched)
☐ Google Workspace 2SV enabled
☐ Site Kit AW-242993149 disconnected
BONUS: SEWER IS ON FIRE TODAY
Kalen said the phones are ringing. Here's why:
Sewer campaign today: 6 conversions, $3,000 value, $141 spend = 21.3x ROAS
Two broad match keywords drive 76% of sewer conversions: "sewer line replacement cost kansas city" + "main sewer line replacement near me"
This is the campaign to scale. But we can only scale if we can PROVE the revenue in ST. Right now, 69% of those sewer jobs show $0 because the invoices aren't posted. Fix Issue #1, and we can justify doubling the sewer budget to Kalen with real data.