🎯

BSP Google Ads Conversion Tracking Fix Plan

v2.0, CRITICAL Priority
Generated: 2026-03-04 | Author: Nexus AI Deep Dive Analysis
Fixing tracking unlocks Smart Bidding, target CPA, and offline revenue attribution. Estimated 30-50% CPL reduction within 90 days
Weekly Ad Spend
~$117 (LSA only, all Search paused)
LSA Conv (90d)
141
CPL: $75.04
Conversion Actions
15 (cleaned)
Values corrected, duplicates removed Mar 9
Search Conv (90d)
11 total across all paused campaigns (at terrible CPAs)
All campaigns PAUSED
🚨 LSA Does NOT Use Offline Conversion Import
LSA has its own internal conversion tracking. When a lead is marked 'booked' or 'completed' in ServiceTitan, LSA picks it up automatically through the native ST integration. You do NOT upload GCLID files or conversion data to LSA. The offline conversion import (Phases 3-5) only applies to Search, Display, Video, and PMax campaigns.
💡 To improve LSA: fix response time, add service categories, improve photos, grow reviews. See LSA Strategy tab.
🏢

Account Structure

MCC ID8449092450
Active Account7269555791, Bright Side Plumbing Google Ads & LSA
Canceled5822122013 (CANCELED, ignore)
NotePrevious plan referenced AW-404985988 and AW-242993149, both deactivated. The REAL account is 7269555791.
🔴

The Problem

Google Ads has 34 conversion actions but they're a mess: duplicates, wrong values ($1 instead of actual revenue), removed actions still listed. LSA is the only active campaign ($117/week, 141 conversions/90d at $75 CPL). All Search campaigns are PAUSED. Conversion tracking exists but is broken/misconfigured.

🔍 Root Causes

  1. #1: 34 conversion actions exist but many are duplicates (5 'Calls from ads' variants, 2 'Clicks to call', etc.)
  2. #2: Conversion values are wrong. Most set to $1 instead of actual service revenue ($350-$8,000)
  3. #3: Multiple REMOVED conversion actions still polluting the account
  4. #4: Offline conversion import types exist (UPLOAD_CLICKS) but pipeline isn't flowing data
  5. #5: No GCLID capture on website forms. Can't match form submissions to ad clicks
  6. #6: 3CX phone system completely disconnected from Google Ads
  7. #7: All Search campaigns paused, only LSA running
🔧

Implementation Phases

Phase 0: Conversion Action Cleanup

✅ Completed Mar 9
📅 Day 1, 30 minutes  |  👤 Robert (Google Ads UI)

Clean up the 34 existing conversion actions. Remove duplicates, fix values, disable noise.

Step 1
Open conversion actions list
Google Ads → Tools & Settings (wrench icon top-right) → Measurement → Conversions. You'll see 34 actions.
👤 Robert  |  ⏱ 1 minute
Step 2
Remove duplicate 'Calls from ads' variants
Keep ONLY 'Calls from ads' (ID 7476805672, ENABLED, DATA_DRIVEN attribution). Remove/disable: 'Calls from ads (1)' (881920526), 'Calls from ads (2)' (7206534392, miscategorized as SUBMIT_LEAD_FORM), 'Calls from ads (3)' (7242795564, already REMOVED), 'Calls from ads (4)' (7249894935). Click each → Edit → Status → Remove.
👤 Robert  |  ⏱ 5 minutes
Step 3
Remove duplicate 'Clicks to call' variants
Keep ONLY ID 7371984944 (value=$1). Remove ID 767111913 (value=$0, old). Click → Edit → Status → Remove.
👤 Robert  |  ⏱ 2 minutes
Step 4
Remove duplicate 'Local actions' variants
For each pair (Directions, Menu views, Other engagements, Website visits), keep the newer ID, remove the older one with $0 value.
👤 Robert  |  ⏱ 5 minutes
Step 5
Fix conversion VALUES on remaining actions
Click each ENABLED action → Edit → Value. Set: 'Book appointment' = $500. 'Click-to-Call' = $150 (currently $55). 'Website Contact Form' = $150 (currently $5). 'Submit lead form' (GA4) = $150. 'Contact page load' = $25 (low-intent). These should reflect actual lead value, not $1.
👤 Robert  |  ⏱ 10 minutes
Step 6
Set primary vs secondary conversion goals
Click each action → Edit → Goal → Primary or Secondary. PRIMARY (count toward bidding): 'Book appointment', 'Click-to-Call', 'Website Contact Form', 'Submit lead form (GA4)'. SECONDARY (observe only): 'Contact page load', 'Page view about', all 'Local actions'. This prevents Google from optimizing toward page views instead of real leads.
👤 Robert  |  ⏱ 5 minutes
Step 7
Verify cleanup. Count should be ~15-18 clean actions
After cleanup: ~8-10 PRIMARY actions (real conversions) + ~5-8 SECONDARY (informational). All with correct dollar values. Screenshot the final list for records.
👤 Robert  |  ⏱ 2 minutes

📦 Deliverables

  • ✅ Duplicate actions removed
  • ✅ Conversion values corrected
  • ✅ Primary/secondary goals set
Completed by Robert on March 9, 2026. All 6 conversion values updated (Lead form=$150, Calls from ads=$150, Click-to-Call=$150, Clicks to call=$150, Book appointment=$500, customer match list=$150). Secondary changes deferred to Evelyn call (actions already show 0/41 campaigns, not affecting bidding). NOTE: Conversions managed at MCC level (844-909-2450), not child account.

Phase 1: Offline Conversion Pipeline (GCLID → ServiceTitan → Google Ads)

⏳ Not Started
📅 Day 2-5  |  👤 Nexus AI + Robert

Build the offline conversion pipeline. Since ServiceTitan has no native Google Ads integration, Nexus builds: (1) GCLID capture via GTM cookie + hidden form fields, (2) A matching script that connects ad clicks to ServiceTitan booked jobs, (3) Automated upload to Google Ads via the API using existing UPLOAD_CLICKS conversion actions.

⚠️ Correction (Mar 9): ServiceTitan Marketing Integrations page only offers Scheduling Pro, Google Local Services, Reserve With Google, and ServiceChannel. There is NO native Google Ads integration toggle. Nexus builds this pipeline instead.
Step 1
Confirm auto-tagging is ON in Google Ads
Google Ads → Settings (gear icon) → Account Settings → Auto-tagging → Verify 'Tag the URL that people click through from my ad' is checked. Already confirmed ON as of Mar 9.
👤 Robert  |  ✅ Confirmed ON Mar 9
Step 2
Nexus deploys GCLID capture tag via GTM
Nexus AI creates a Custom HTML tag in GTM that reads the gclid parameter from the URL and stores it in a 90-day cookie. Trigger: All Pages. This ensures the gclid persists across sessions even if the user returns later without the URL parameter.
👤 Nexus AI  |  ⏱ 15 minutes
Step 3
Nexus adds hidden gclid field to website forms
Add a hidden field named 'gclid' to all contact/booking forms on callbrightside.com. JavaScript reads the gclid cookie and populates the field on page load, so every form submission includes the original ad click ID.
👤 Nexus AI (via WP API or GTM)  |  ⏱ 20 minutes
Step 4
Nexus builds matching script (gclid cookie → ServiceTitan job → revenue)
Nexus builds a Python script that: pulls form submissions with gclid values, matches them to ServiceTitan booked jobs by customer email/phone, attaches the actual invoice revenue to each matched conversion. This creates the gclid-to-revenue mapping Google Ads needs.
👤 Nexus AI  |  ⏱ 2-3 hours
Step 5
Nexus uploads matched conversions to Google Ads via API
Using the Google Ads API, Nexus uploads offline conversions with gclid, conversion time, and revenue value. Targets the existing UPLOAD_CLICKS conversion actions already in the account. Runs on a daily schedule via the Guardian system.
👤 Nexus AI  |  ⏱ 1-2 hours
Step 6
Verify data flowing in Google Ads after 48 hours
Google Ads → Tools → Conversions → check for 'Offline' conversion source with UPLOAD_CLICKS type. Verify conversion count and revenue values appear. If data shows, the pipeline is working end-to-end.
👤 Robert + Nexus  |  ⏱ 5 minutes (after 48hr wait)

📦 Deliverables

  • ✅ Auto-tagging confirmed ON
  • ✅ GCLID capture deployed via GTM
  • ✅ Offline conversion upload script running
  • ✅ Ad clicks matched to booked jobs with revenue

Phase 2: GTM Conversion Tag Verification & GCLID Capture

⏳ Not Started
📅 Day 2-3  |  👤 Nexus AI + Robert

Verify GTM tags are firing correctly and add GCLID capture for form submissions on the website.

Step 1
Verify existing GTM tags
Go to tagmanager.google.com → Container GTM-M3L9374 → Tags. Check if Google Ads Conversion Tracking tags exist. If yes, verify they reference the CORRECT conversion IDs from our cleaned-up Phase 0 actions.
👤 Robert (check) / Nexus AI (fix)  |  ⏱ 10 minutes
Step 2
Add GCLID capture tag to GTM
Nexus AI creates a Custom HTML tag that: reads gclid from URL params, stores in a 90-day cookie, pushes to dataLayer. Trigger: All Pages. This ensures the gclid persists even if the user comes back later.
👤 Nexus AI  |  ⏱ 15 minutes
Step 3
Add hidden gclid field to website forms
WordPress → Contact Form 7 → Edit each form → Add: [hidden gclid default:get]. This auto-captures the gclid when someone submits. If using a different form plugin, add a hidden field named 'gclid' that reads from the URL parameter.
👤 Robert (or Nexus via WP API)  |  ⏱ 10 minutes
Step 4
Add JS to populate gclid from cookie
Nexus AI adds a small JavaScript snippet (via GTM) that reads the gclid cookie and populates the hidden form field, even if the user arrived days ago and the gclid is no longer in the URL.
👤 Nexus AI  |  ⏱ 15 minutes
Step 5
Test end-to-end GCLID flow
Visit callbrightside.com/contact?gclid=test12345. Submit the form. Check Contact Form 7 submissions in WordPress admin and verify 'gclid' field shows 'test12345'. If it does, the pipeline works.
👤 Robert + Nexus  |  ⏱ 5 minutes
Step 6
Add Google Ads Remarketing tag
GTM → New Tag → Google Ads Remarketing. Fires on All Pages. Builds remarketing audiences for future display/video campaigns. No additional setup needed, just deploy.
👤 Nexus AI  |  ⏱ 5 minutes
Step 7
Publish GTM container
Preview in GTM Debug mode first (Preview button top-right). Navigate callbrightside.com, verify all tags fire. Then Publish and name version 'Nexus v2, Conversion tracking + GCLID + Remarketing'.
👤 Nexus AI  |  ⏱ 10 minutes

📦 Deliverables

  • ✅ GTM tags verified/fixed
  • ✅ GCLID capture live
  • ✅ Remarketing tag deployed
  • ✅ End-to-end gclid test passed

Phase 3: Enhanced Conversions for Leads

⏳ Not Started
📅 Day 3-5  |  👤 Nexus AI + Robert

Set up Enhanced Conversions for Leads, Google's upgraded offline conversion method using hashed email/phone instead of just GCLID. Higher match rates, works even when cookies are blocked.

Step 1
Enable Enhanced Conversions in Google Ads
Google Ads → Tools → Conversions → Settings (top-right gear) → Enhanced conversions → Turn ON → Select 'Enhanced conversions for leads'. Accept terms.
👤 Robert  |  ⏱ 3 minutes
Step 2
Configure Enhanced Conversions tag in GTM
GTM → New Tag → Google Ads → Enhanced Conversions. Set up user-provided data variables: email (from form field), phone (from form field). Trigger: Form Submission. This sends hashed (SHA-256) customer data to Google for matching.
👤 Nexus AI  |  ⏱ 20 minutes
Step 3
Verify matching in Google Ads
After 48 hours: Google Ads → Tools → Conversions → Diagnostics. Check 'Enhanced conversions' section. It should show match rate. Target: 60%+ match rate. If lower, check that email/phone fields are being captured correctly.
👤 Robert  |  ⏱ 5 minutes

📦 Deliverables

  • ✅ Enhanced Conversions enabled
  • ✅ Hashed email/phone matching live
  • ✅ Match rate >60%

Phase 4: 3CX Phone Call Integration

🔄 In Progress
📅 Day 5-10 (after Enterprise upgrade completes)  |  👤 Robert (3CX admin) + Nexus AI

Connect 3CX phone system to track which ad clicks generate phone calls. Stephanie approved Enterprise upgrade Mar 6. David Kite (LawnPhone) confirmed Enterprise 8SC (+$30/mo) gives Call Control API access.

✅ Blocker resolved: Stephanie approved Enterprise 3CX upgrade Mar 6. LawnPhone processing. API access incoming.
Step 1
Get 3CX Enterprise API credentials
Stephanie approved Enterprise upgrade Mar 6. LawnPhone (David Kite, support@lawnphone.com, 208-881-4040) processing upgrade from 8SC Pro to 8SC Enterprise (+$30/mo). Once complete, get API URL and API key from David.
👤 Stephanie/Robert  |  ⏱ Waiting on LawnPhone
Step 2
Set 3CX API credentials in Nexus .env
Add to config/.env: THREECX_API_URL=https://your-3cx-url THREECX_API_KEY=your-key THREECX_EXTENSION=main-extension
👤 Robert  |  ⏱ 5 minutes
Step 3
Nexus builds call tracking script
Nexus AI creates a script that pulls 3CX call logs, matches call timestamps to Google Ads click windows using GCLID cookies, and maps calls to ServiceTitan jobs.
👤 Nexus AI  |  ⏱ 2-3 hours
Step 4
Consider Google forwarding number (future)
For 100% call attribution: use a Google forwarding number that replaces the static phone number on callbrightside.com when visitors come from ads. This is a future enhancement. The offline conversion pipeline handles most attribution already.
👤 Robert (decides)  |  ⏱ Future phase

📦 Deliverables

  • ✅ 3CX API connected
  • ✅ Call-to-ad matching
  • ✅ Phone conversion attribution

Phase 5: Search Campaign Relaunch (After Tracking is Clean)

⏳ Not Started
📅 Week 3-4 (after Phase 0-2 verified working)  |  👤 Robert + Evelyn (Google Rep)

Relaunch Search campaigns ONLY after conversion tracking is clean, values are correct, and data is flowing. This ensures Smart Bidding has real data to optimize against.

Step 1
Verify conversion data is flowing
Google Ads → Campaigns → Conversions column should show real numbers (not 0). Check that conversion values show dollar amounts, not $1. If data is flowing, proceed.
👤 Robert  |  ⏱ 5 minutes
Step 2
Create new Search campaigns by service (see LSA Strategy tab)
Do NOT un-pause old campaigns, they have bad history. Create NEW campaigns: 'BSP: Sewer Repair', 'BSP: Water Heater', 'BSP: Drain Cleaning', 'BSP: Emergency', 'BSP: Gas Line'. Use ad copy from LSA Strategy.
👤 Robert + Evelyn  |  ⏱ 1-2 hours
Step 3
Add negative keyword list
Shared negative keyword list across all campaigns: DIY, how to, jobs, salary, wholesale, parts, training, school, YouTube, reddit, amazon, home depot, lowes, rental. This prevents wasted spend on non-buyer queries.
👤 Robert  |  ⏱ 15 minutes
Step 4
Start with Manual CPC, switch to Maximize Conversions after 15 conversions
Week 1-4: Manual CPC to build data. Week 5-8: Switch to Maximize Conversions. Week 9-12: Add Target CPA per service. See bidding timeline in Budget Strategy.
👤 Evelyn configures  |  ⏱ Ongoing

📦 Deliverables

  • ✅ 5+ new Search campaigns live
  • ✅ Negative keyword list applied
  • ✅ Bidding strategy timeline active

Immediate Wins (Do This Week)

⚡ Most conversion actions have $1 value. Google thinks every lead is worth $1

Fix: Update values in Phase 0 Step 5. Sewer=$500, Water Heater=$500, Emergency=$300, Drain=$150, General=$150

Impact: Smart Bidding will optimize toward high-value services instead of treating all leads equally

👤 Robert (Google Ads UI)  |  ⏱ 10 minutes

⚡ 5 'Calls from ads' variants, 2 'Clicks to call', 2 'Local actions' of each type, confusing Google's optimization

Fix: Remove duplicates in Phase 0 Steps 2-4

Impact: Google stops double-counting conversions and optimizes correctly

👤 Robert (Google Ads UI)  |  ⏱ 12 minutes

⚡ When Search campaigns relaunch, DIY/jobs/wholesale queries will waste budget

Fix: Add shared negative keyword list before relaunch (Phase 5 Step 3)

Impact: Estimated $50-100/week saved on irrelevant clicks

👤 Robert  |  ⏱ 15 minutes

🏆

Expected Outcomes

Week 1 DONE: Conversion values corrected. Book appointment $500, phone leads $150, form leads $150. Auto-tagging confirmed ON.
Week 2 Offline conversion pipeline live. GCLID capture deployed, matching script running, ad clicks tied to booked jobs with revenue
Week 3 Enhanced Conversions live. Form submissions traced to specific keywords
Week 4 New Search campaigns launched with clean tracking from day one
Month 2 15+ conversions recorded. Switch to Maximize Conversions bidding
Month 3 Target CPA bidding active. Google optimizes toward $75-150 CPA per service. Full attribution: every dollar maps to a booked job.
📊

KPIs to Track

MetricCurrentTargetTimeline
Clean Conversion Actions 34 (messy) 15-18 (clean) Day 1
Offline Conversions Flowing No Yes (via ServiceTitan) Week 2
Enhanced Conversion Match Rate 0% >60% Week 3
Tracked Conversions/Month (Search) 0 (all paused) 15-30 Month 2
Cost Per Conversion (Search) $530-$1,390 (before pause) $75-150 Month 3
LSA CPL $75.04 $60 (maintain excellence) Ongoing
ROAS Unknown 5x-8x Month 3

Live Performance Data April 2, 2026

Real-time conversion tracking, keyword deployment, and attribution status

Conversions
21
yesterday
CPL
$14
sewer campaign
Clicks
48
yesterday
Spend
$462
yesterday

115 Keywords Pushed Today Across 3 Campaigns

28
Sewer Keywords
Highest ticket value cluster
30
Emergency Keywords
High urgency, fast conversion
57
Water Heater Keywords
Largest cluster by volume

Total keyword arsenal: 1,554 keywords now live in Google Ads out of 40,847 researched (3.8%). Remaining keywords feed SEO content strategy and future campaign expansion.

Attribution: Source-to-Revenue Traceability

11,766
Completed ST Jobs
$7.9M
Total Revenue Traced
24
Campaign Sources

Every conversion is traced from ad click through ServiceTitan job completion to invoice. Only jobs with job_status = completed are counted. This eliminates phantom revenue from unclosed or cancelled jobs.

QuickBooks Financial Context (90 Day)

$331K
Income
$149K
Expenses
54.9%
Margin

Full Attribution Dashboard

View neighborhood-level customer data, revenue by campaign source, and technician attribution.

Open Customer Intelligence Dashboard