💾 Notes saved!
🎯 💰 🔬 🚀

Revenue Pipeline War Room

6 Critical Actions Before Evelyn Call | $334K+ Revenue Attribution at Stake

💰 $334K Unattributed Revenue 🚨 Pipeline Broken at Step 4 ⏰ Evelyn Call: Wed Mar 11
$334K
Unattributed Revenue (6mo)
$132K
Lost from 110 Abandoned Calls
$0
Offline Conv Uploaded to Google
24.8x
LSA ROAS (Best Channel)
30x
ROAS Multiplier on the Table
🔴 Action #1: Fix Offline Conversion Pipeline CRITICAL BLOCKER #1 PRIORITY
🚨 WHY THIS IS #1: No new Google Ads campaigns should go live until this pipeline flows data. Smart Bidding without revenue signal = burning money. This unlocks 30x ROAS multiplier.
$0
Current Revenue Uploaded
$334K
Potential if Fixed
423
ST Jobs Available
0
GCLID Matches Found

🔧 Part A: Fix Systemd Timer Bug (5 minutes)

1

Open the broken service file

The timer calls --process which doesn't exist in argparse. Needs to be --days 7.

systemd/nexus-offline-conv.service
Nexus AI
2

Change --process to --days 7

Line 10: ExecStart=...nexus_offline_conversions.py --days 7

3

Deploy to VM and reload systemd

gcloud compute scp then sudo systemctl daemon-reload on VM

4

Verify: run the script manually

python nexus_offline_conversions.py --days 7 --dry-run should complete without error

🔧 Part B: Build GCLID Bridge (2-3 hours)

5

Create nexus_gclid_bridge.py (~300 lines)

Lightweight webhook receiver on VM port 8502. Receives WordPress form submissions, extracts GCLID, writes to ServiceTitan lead externalData.

Nexus AI
6

Create systemd service for the bridge

nexus-gclid-bridge.service: always-on, listening on port 8502, restart on failure.

systemd/nexus-gclid-bridge.service
7

Configure WordPress to POST form data

WPForms webhook or Zapier: on form submit, POST to https://morpheus.callbrightside.com:8502/gclid with GCLID + contact fields.

Robert
8

Test end-to-end: submit test form with GCLID

Fill out callbrightside.com form with test GCLID. Verify it appears in ServiceTitan lead's externalData.

9

Verify pipeline: run offline conversion script

python nexus_offline_conversions.py --days 7 --dry-run should now find GCLID matches and show upload candidates.

🔧 Part C: First Real Upload (After Bridge Works)

10

Run offline conversions with actual upload

python nexus_offline_conversions.py --days 30 (no --dry-run). Uploads matched GCLID+revenue to Google Ads UPLOAD_CLICKS actions.

11

Verify in Google Ads UI

Check account 7269555791 > Conversions > "Offline Revenue" action. Should show imported conversions with real dollar values.

Robert + Evelyn
💬 Executive Impact: Once this pipeline flows, Smart Bidding learns that "sewer repair Overland Park" drove an $8,500 job. It automatically bids more aggressively on high-value keywords and less on low-value ones. This is the 30x ROAS multiplier.
📞 Action #2: Fix Phone-to-Campaign Mapping HIGH PRIORITY
🚨 Problem: PHONE_TO_CAMPAIGN in nexus_attribution_engine.py line 109 is entirely commented out. Every phone-based attribution rule short-circuits. 110 abandoned calls in 6 months going untracked.
1

Identify BSP phone numbers from 3CX data

28,719 historical call records. Extract unique destination numbers and their call volumes.

nexus_attribution_engine.py:109-114
Nexus AI
2

⚠️ CONFIRM with Robert: phone number assignments

Proposed mapping needs verification:

Number3CX CallsProposed SourceConfirm?
(913) 276-492044PPC tracking number❓ VERIFY
(913) 297-994162Main line, Google organic❓ VERIFY
(913) 963-1029-Official BSP, existing customer❓ VERIFY
(913) 358-0252-Need identification❌ UNKNOWN
(913) 358-0380-Need identification❌ UNKNOWN
Robert
3

Uncomment and populate PHONE_TO_CAMPAIGN dict

After Robert confirms, update the mapping. Each number gets a campaign source string.

4

Verify: run attribution scan

python nexus_attribution_engine.py --scan --verbose --days 180. Check phone_stats section shows campaign mapping active.

🧠 Deeper Connection: Phone mapping + 3CX data + ServiceTitan = complete customer journey. When someone calls (913) 276-4920 from a Google Ad, we know: which keyword, which campaign, which agent answered, whether they booked, what service, what revenue. This feeds the Unified Attribution Engine (Phase 6 of the master plan).
💰 Action #3: Revenue Resolver (Invoice-Based Truth) $97K GAP
🚨 The Revenue Truth Gap: ST Jobs API job.total shows $227K for Jan-Feb. Kalen's verbal numbers are $334K. That's a $97K (30%) gap. Every ROI calculation is wrong because we're using quoted amounts, not invoiced amounts.
$227K
job.total (Quoted)
$334K
Kalen's Verbal
$97K
Gap (30%)
Invoice API
Source of Truth
1

Create nexus_revenue_resolver.py (~250 lines)

Shared module. Bulk-pulls invoices: GET /accounting/v2/tenant/{T}/invoices. Builds {job_id: invoice_total} lookup. SQLite cache (re-pull if > 24h). Exposes get_revenue(job_id) -> float.

nexus_revenue_resolver.py
Nexus AI
2

Update 4 scripts to use resolver

Replace job.get("total") with get_revenue(job_id) in:

ScriptLineCurrent
nexus_lead_roi_engine.py318job.get("total")
st_ticket_by_service.py71job.get("total")
nexus_attribution_engine.py328job.get("total")
nexus_cpl_monitor.py345job.get("total")
3

Update dashboard fallback values

Replace _FALLBACK_REVENUE_WEEKLY = 57_700 (line 102) and _ap_roi_map hardcoded values (line 4214) with invoice-based calculations. Every revenue panel shows "Source: ST Invoicing API" + staleness warning.

nexus_dashboard.py:102, 4214
4

Verify: compare totals

python nexus_revenue_resolver.py --test. Invoice totals should be > job.total. Output: revenue_truth_latest.json

🧠 Executive Panel Impact: The Monday Standup HTML and dashboard revenue panels currently show numbers derived from job.total. Once the resolver is live, EVERY revenue display auto-corrects to invoice truth. Stephanie and Kalen stop arguing about numbers; the system produces the definitive total.
📍 Action #4: LSA Profile Updates QUICK WIN
✅ Current LSA ROAS: 24.8x. Best-performing channel. These updates amplify what's already working.

➕ 4 New Service Categories to Add:

1

Log into LSA dashboard

Google Ads > Local Services Ads > Profile. Account 7269555791.

Robert
2

Add: Emergency Heaters

Seasonal (Nov-Feb), $1.5K avg ticket, Emergency Eric persona. Currently missing.

3

Add: Water Heater (expanded)

$2.5K avg ticket, 100% booking rate currently. Needs dedicated category.

4

Add: Leak Detection

Gateway service to larger jobs, $800 avg ticket. Research Robert persona.

5

Add: Sump Pumps

Seasonal (March-May), $1.2K avg, Emergency Eric persona. Spring storm season NOW.

📸 8 Priority LSA Photos (Audrey Assignment):

6

Send photo brief to Audrey

8 photos needed. LSA photo ranking is a massive signal since April 2025:

#PhotoPriority
1👨‍🔧 Team photo in branded shirtsHIGH
2🚽 Before/After sewer repairHIGH
3📹 Tech with camera inspectionMED
4🚚 Branded truckMED
5🌡️ Water heater install before/afterMED
6🔍 Leak detection equipmentLOW
7💧 Sump pump installationLOW
8🔥 Emergency heater repairLOW
Audrey
🚫 Action #5: Negative Keyword List from North Star NEXUS AI
💬 Context: The Keyword North Star has 234 keywords in 28 clusters. From this data + competitor analysis, Nexus AI generates a comprehensive negative keyword list to prevent wasted ad spend.
1

Pull negative keywords from North Star system

Cross-reference 234 keywords. Identify: DIY terms, career terms, competitor brand terms, irrelevant geo terms, informational-only terms.

Nexus AI
2

Build negative keyword list by category

CategoryExamplesEst. Count
🛠️ DIY / How-tohow to, DIY, tutorial, guide, yourself~25
💼 Career / Jobsjobs, salary, hiring, apprentice, career~15
🏢 Competitorsroto-rooter, mr rooter, a1 sewer~12
🌐 Wrong GeoKansas City MO (if targeting KS only), other states~10
📚 Informationalwhat is, definition, wikipedia, reddit~15
🏠 Non-ServiceHVAC, electrical, roofing, backflow, appliance~20
3

Export as Google Ads-ready CSV

Output: output/negative_keywords_google_ads.csv. Ready for bulk upload to all 5 new campaigns.

4

Give to Evelyn for campaign setup

Evelyn applies shared negative keyword list across all 5 new campaigns. Saves $100s/month on irrelevant clicks.

Evelyn
✍️ Action #6: Ad Copy Drafts per Service CONTENT ENGINE
🧠 Think Bigger: Most companies give their Google rep nothing and let them write generic ads. BSP gives Evelyn: persona-matched ad copy, keyword-researched headlines, field-intel-powered descriptions, and competitive differentiators. Zero competitors do this.
1

Generate 15 headlines + 4 descriptions per campaign

5 campaigns x (15 headlines + 4 descriptions) = 95 ad copy assets. Use content engine personas.

Nexus AI
2

5 messaging themes per campaign

ThemeHeadline StyleExample
🚨 EmergencyUrgency + Availability"KC Sewer Emergency? We're There in 60 Min"
🏆 TrustCredentials + Heritage"5th-Gen Master Plumber, 390+ 5-Star Reviews"
⭐ Social ProofReviews + Numbers"KC's Highest-Rated Sewer Repair Team"
📍 LocationHyperlocal"Overland Park Sewer Experts, Not a Franchise"
💰 ValueTransparency + Pricing"Free Sewer Camera Inspection, Upfront Pricing"
3

Export as Responsive Search Ad template

Output: output/google_ads_copy_drafts.json. Organized by campaign > ad group > headlines + descriptions. Ready for Evelyn to paste into campaign builder.

4

Include call-to-action extensions

Sitelinks, callout extensions, structured snippets per service. Pre-built so Evelyn can add immediately.

📊 Executive Panel + HTML Updates Needed DASHBOARD
💬 Think Bigger: Every action above feeds data into the dashboard and HTML deliverables. Here's what needs updating once each action completes.
DeliverableWhat ChangesWhen
📊 Nexus Dashboard
nexus_dashboard.py
• Phone Analytics page: replace "Enterprise Upgrade In Progress" with real 3CX data
• Attribution Health page: populate 7-step pipeline from real data
• Revenue panels: switch from job.total to invoice-based truth
• Replace _FALLBACK_REVENUE_WEEKLY with calculated value
After Actions 1-3
📄 BSP_Google_Ads_Conversion_Fix_Plan.html • Mark Phase 0 as COMPLETED (green)
• Update Phase 1 timeline (GCLID bridge this week)
• Add Phase 5 details from Evelyn call
NOW + Post-Evelyn
📄 BSP_Monday_Standup_March_2026.html • Update revenue numbers to invoice-based truth (after Action 3)
• Add Google Ads progress section (Phase 0 done, pipeline in progress)
• Add 3CX call metrics when available
After Action 3
📄 BSP_LSA_Strategy.html • Add 4 new service categories (Action 4)
• Update with post-Phase 0 conversion value corrections
• Add budget split recommendation from Evelyn call
After Action 4 + Evelyn
📄 BSP_Lead_Source_ROI_Report.html • Recalculate all ROI using invoice totals (not job.total)
• Revenue by source will shift significantly
• Verdict badges may change (Google could improve from KEEP to GROW)
After Action 3
✨ NEW: BSP_Revenue_Pipeline_War_Room.html
This document
Created tonight. Living action plan with saveable notes. DONE
✨ NEW: evelyn_meeting_agenda_20260311.html Created tonight. Meeting agenda with timer and saveable notes. DONE
📅 Execution Timeline SPRINT
WhenActionOwnerImpact
Tonight (Mar 10) 🔧 Fix systemd timer bug (5 min)
🔧 Build GCLID bridge script
🔧 Build revenue resolver script
Nexus AI Unblocks pipeline
Tue Mar 11 AM 📞 Confirm phone mapping with Robert
📝 Generate negative keyword list
✍️ Generate ad copy drafts
Robert + Nexus AI Assets ready for Evelyn
Wed Mar 11 10am 📞 Evelyn Call
• Present pipeline status
• Hand off keywords + ad copy
• Agree on 5 new campaigns
Robert + Evelyn Campaign plan locked
Wed-Thu (Mar 11-12) 🚀 Deploy GCLID bridge to VM
🔧 Configure WordPress webhook
🧪 End-to-end pipeline test
Robert + Nexus AI Pipeline flowing
Fri Mar 14 📊 First offline conversion upload
📄 Update all HTML deliverables
📍 Add LSA service categories
All Smart Bidding starts learning
📝 Master Notes AUTO-SAVES

💾 All notes auto-save to localStorage every 2 seconds. They persist between sessions. Click Export to download as text file.

Not saved yet

🚨 UPDATE β€” $4.88M Open Estimates Found (Apr 14)

NEW DISCOVERY β€” 2026-04-14. During the zeus_st_module_sync.py repair tonight, the sync pipeline shift from the /estimates/export endpoint (archival, stopped Jun 2025) to the live /estimates endpoint with modifiedOnOrAfter filter revealed 1,749 Open estimates worth $4,887,216 sitting untouched in ServiceTitan.

What This Means For the Pipe-Fix Effort

Up to now this battle plan focused on customer acquisition β€” finding more opportunities and filling the top of the pipe. That framing is incomplete. The pipe has a hole at the close, not at the top. 1,749 prospects already invited a Bright Side tech, received a quote, and never closed. The sales job is done. Only the follow-up is missing.

Immediate Implications For This Plan

Verification

Logged via nexus_html_logger.py at 2026-04-14T05:33:48.414607 UTC

πŸ”§ POST-APR-14 β€” Sales-Close Pipe Found + Monday Dashboard Spec

Post-Apr-14 context (reorders this entire plan). Tonight we discovered $4.88M in Open estimates that were invisible because the data pipeline had been returning archival data for 9 months. The Fix-the-Pipes framing expands.

πŸ”§ The Pipe We Missed

This plan has focused on operational pipes β€” plumbing ops, communication chains, data flows. Tonight revealed a sales-close pipe nobody was watching: 1,749 quotes sitting at Open, worth $4,887,216, with nothing in ServiceTitan flagging them for follow-up. Of those, $553K is in the hot 0-7 day window right now.

πŸ—ΊοΈ Roadmap Reorder

Before tonight, this plan prioritized acquisition: weather landing pages, Google Ads volume increase, Daniel tuning. After tonight, recovery comes first:

  1. πŸ”₯ Estimate Recovery Engine (Ashton owns HOT bucket, this week)
  2. πŸ“Š Open Estimate dashboard at Monday standup
  3. πŸŽ–οΈ Membership pilot (277 pre-qualified high-LTV customers)
  4. πŸ“§ Pure-HCP ghost reactivation (247 legacy customers, $401K)
  5. 🎨 Weather landing pages (parallel track, Audrey dep)
  6. πŸ’° Sewer ads hold at $500/day (applied live tonight)
  7. πŸ€– Daniel AI tuning (after #5)
  8. πŸ“‘ ServiceTitan webhook registration audit (Smart Bidding unblock)

πŸ› οΈ Config Audit Scope (Decision #4 in the capstone)

Ashton + Kalen, 2 hours: configure ServiceTitan so every new estimate creates an auto-follow-up task at day 3, day 7, day 14. This is the structural fix preventing future quotes from going dark. Goes into the Pipe-Fix plan as an operational discipline, not a one-off.

πŸ“Ž The Canonical Strategic View

This plan is an operational document. For the full Stephanie-facing strategic view including all four pain points, the nine decisions, and supporting documents, see: BSP_Strategic_Synthesis_Apr14.html (the Apr 14 session capstone).

Verification

Logged via nexus_html_logger.py at 2026-04-14T06:04:38.008772 UTC