Demand Performance
Conversion Funnel — Utah has a landing page problem, not a traffic problem
Spend Status
- $4,912 in Google Ads spend with zero conversions. Every dollar wasted.
- 6 landing pages getting 770 sessions/month with zero leads — ad black holes eating the budget.
- 11 pages that DO convert at 5–16% prove the model works — city+service pages are the answer.
- Phase 1 (stop the bleeding) takes 2 hours today. Phase 2 (fix site) takes 2 weeks. Phase 3 (scale) starts when conversion rate hits 5%.
Site Health Board
Stop the Bleeding — Do Today
No-brainer actions. Every day delayed costs real money. Total: ~2 hours in Google Ads. Zero additional budget required.
This campaign spent $12K at $239 CPA. Benchmark is $65. Every day it runs = ~$174 overpaid per lead. PMax Plumbing runs alongside it at $85 CPA and should absorb the budget.
Steps (Greg or MediaSpark, ~5 min):- Open Google Ads →
448-550-2333account - Campaigns → find "Utah-Plumbing-Search"
- Toggle status to Paused
- Go to Utah-PMAX-Plumbing → increase daily budget by the amount freed from Plumbing Search
- Confirm PMax Plumbing is absorbing spend within 48 hours
Google counts YouTube subscriptions and page views as "conversions." The algorithm optimizes toward video watchers instead of people who need a plumber. This single issue corrupts every campaign's bidding.
Steps (Greg or MediaSpark, ~20 min):- Google Ads → Goals → Conversions → Summary
- Find "YouTube Channel Subscriptions" → Edit → Change to Secondary
- Find "Page View: Book Urgent Repair" → Edit → Change to Secondary
- Find "YouTube Follow-On Views" → Edit → Change to Secondary
- Create NEW Primary conversions:
- "Service Request Submitted" (form submission on contact/booking pages)
- "Phone Call from Ad" (call extension clicks, 60s+ duration)
- "Schedule Service Booking" (booking widget completion)
- Wait 48 hours for Smart Bidding to recalibrate against real signals
AI Max is enabled with minimal delivery. Low delivery + unpredictable behavior = risk of surprise spend spikes that blow the daily budget with no return.
Steps (Greg or MediaSpark, ~3 min):- Google Ads → Campaigns → each active campaign
- Settings → "AI Max" or "Automatically created assets"
- Toggle OFF
- Re-evaluate only after conversion tracking is clean (Phase 2 complete)
$4,912 total spend across 100 search terms with ZERO conversions. Breakdown: $2,415 on competitor names (Smedley, Genuine Comfort, Anytime, etc.), $980 on your own brand name (Golden Rule, Golden Rule Plumbing — you're paying for clicks you should own organically), and $346 on supply/parts searches (HVAC supply, Goodman distribution, etc.).
Steps (Greg or MediaSpark, ~30 min):- Google Ads → Keywords → Search Terms tab
- Sort by cost, descending — see the full list in the Search Terms Deep Dive section
- Create shared negative keyword list: "Golden Rule Negatives"
- Add all competitor names as negatives: Smedley, Genuine Comfort, Anytime, Comfort Systems, SOS, Anderson, Jerry's, Standard Plumbing, Lennox, Royal Plumbing, One Hour, etc.
- Add supply/parts terms: HVAC supply, Goodman distribution, Rheem, HVAC parts, plumbing supply, Daikin, Johnstone supply, carrier
- Apply list to ALL active campaigns
No campaign bids on "Golden Rule" or "Golden Rule Plumbing." Competitors can bid on your brand name and steal traffic for pennies. You're paying for brand awareness through other channels and competitors harvest it at the search level.
Steps (Greg or MediaSpark, ~45 min):- Google Ads → New Campaign → Search → Leads
- Campaign name: "Utah-Brand-Protection"
- Budget: $10/day ($300/month) — brand clicks cost $1–2
- Ad group keywords:
- [golden rule plumbing] (exact match)
- [golden rule heating] (exact match)
- [golden rule hvac utah] (exact match)
- "golden rule plumbing salt lake" (phrase match)
- Write 3 responsive search ads emphasizing: family-owned, 27 years, no surprise fees
- Expected: 30–40% CTR at $1–2 CPC. Cheapest insurance in the account.
Right now, Utah visitors see the Iowa number (515) 393-4526 on every page except /location/utah/. Every misrouted call is a lost lead. Hard-code (801) 218-2225 in header, footer, CTA buttons, and mobile sticky bar on all Utah landing pages.
Pages shared across markets (service pages, about, etc.) need geo-detection or at minimum a Utah-specific variant. Until ServiceTitan call tracking is live, hardcode the Utah number on Utah-targeted pages.
The main landing page and top city pages have zero forms. Add a Gravity Form above the fold on /utah-urgent-repair/, /location/utah/, and the 5 highest-traffic city pages. Match the Iowa booking form pattern.
$2,415 spent on competitor name searches (Smedley, Genuine Comfort, Anytime, etc.) with zero conversions. Pause all competitor keyword ad groups immediately. Reallocate budget to brand protection and city-specific campaigns.
Create a shared negative keyword list covering: all competitor names, supply/parts terms (HVAC supply, Goodman, Rheem, Lennox, etc.), DIY searches, job searches, and review-only queries. Apply across all active campaigns to prevent future bleed.
Phase 1 Summary — Same Day, ~2 Hours Total
Who does it: Greg Romans or MediaSpark in the Google Ads account (448-550-2333).
Total new spend: $300/month (brand campaign only — everything else is pausing waste).
Expected savings: $1,870+/month in wasted CPA from Plumbing Search pause alone.
Expected CPA improvement: 20–40% within 2 weeks from conversion tracking fix.
Confirmation: Check back in 48 hours — Smart Bidding needs time to recalibrate. CPA should start dropping within 5–7 days.
Fix the Site & Tracking — Week 1–2
Rebuild the broken landing pages and fix the data pipeline. Don't scale spend until conversion rates confirm the foundation works.
/location-utah-urgent-repair — 2,560 sessions, 15 conversions. Iowa pages convert at 13%. This single page is the biggest leak in the funnel. 43% of all Utah ad traffic lands here and bounces.
- Model the rebuild after
/location/utah/north-salt-lake(5.64% conversion, 48s engagement) - Above the fold: Utah phone number (801) 218-2225 as click-to-call button, NOT Iowa number
- Hero section: "Utah's Family-Owned HVAC Experts — No Surprise Fees, Guaranteed"
- Add scheduling widget or form (ServiceTitan booking embed)
- Trust badges: BBB, Google Guaranteed, "Family-Owned Since 1999"
- 3 localized testimonials from Utah customers (pull from GBP)
- Service cards with pricing transparency: "Diagnostic: $49 | AC Tune-Up: $49 | Gold Club: $99/yr"
- Sticky mobile CTA bar (phone + schedule) — 85.5% of ad traffic is mobile
- Duplicate structure for
/location-utah-urgent-repair-plumbing-ppc(409 sessions, same issues)
These pages receive real traffic and produce zero conversions. Every visit is wasted ad spend or wasted organic opportunity.
Steps (Web developer in WordPress, ~2–3 hours):/location-utah-hvac-estimate(194 sessions, 0 conv) → 301 redirect to rebuilt urgent repair page/utah-hvac-system-check(154 sessions, 0 conv) → 301 redirect to rebuilt urgent repair page/sump-pump-inspection-utah(119 sessions, 0 conv) → 301 redirect to/location/utah//utah-pe(114 sessions, 0 conv) → DELETE or redirect to main Utah page/location-utah-urgent-repair-plumbing(102 sessions, 0 conv) → redirect to PPC plumbing page- 5 additional city pages with traffic but 0 conversions → rebuild with city+service model (see #8)
Use Redirection plugin in WordPress for 301s. Check Google Ads to make sure no ads point to the deleted URLs.
Data proves localized pages convert 3–10x better: Kaysville plumbing 16.1%, Eden 15%, North Salt Lake 5.64%. The generic "urgent repair" pages fail because they're not specific to any city or service.
Steps (Web developer or AI-assisted, ~1 hour per page):- Template:
/location/utah/{city}/{service}-services - Priority cities (highest traffic + population): Salt Lake City, Ogden, Layton, Bountiful, Sandy, West Jordan, Provo, Draper
- Each page: city name in H1, local landmarks/neighborhoods, city-specific weather callouts, (801) number prominent
- Services per city: plumbing, HVAC, electrical, drain (4 pages per city)
- Phase 1 batch: top 8 cities × 1 primary service each = 8 pages. Expand to 32 pages in Phase 3.
- Use AI (Claude/ChatGPT) to generate 800–1,200 word content per page. Human review for accuracy.
(801) 218-2225 only appears in body text on /location/utah/. No geo-detection. Utah visitors see Iowa number (515) 393-4526 on every other page, header, and footer. Every misrouted call is a lost lead.
- Option A (Quick): Hard-code (801) 218-2225 on ALL Utah landing pages — header, footer, CTA buttons, mobile sticky bar
- Option B (Better): Add JavaScript geo-detection snippet:
- Use
fetch('https://ipapi.co/json/')to detect visitor state - If Utah → swap all phone number elements to (801) 218-2225
- If Iowa → keep (515) 393-4526
- Add to WordPress header via Code Snippets plugin or theme functions.php
- Use
- Verify: test from Utah VPN/mobile to confirm number swaps correctly
19,577 sessions labeled "Unassigned" with 13,707 key events. Normal channels run 2–9%. Almost certainly misconfigured tracking — internal traffic, bots, or duplicate tags counted as conversions. Until this is clean, no conversion metric is trustworthy.
Steps (Greg or web developer in GA4 admin, ~1–2 hours):- GA4 Admin → Data Streams → check for duplicate Google Tags on the site
- Use Google Tag Assistant (Chrome extension) on goldenrulephc.com to verify single clean tag fire
- GA4 Admin → Data Settings → Data Filters → Create "Internal Traffic" filter:
- Add office IP addresses for Iowa and Utah offices
- Filter state: Active
- Check GA4 → Events → verify no custom events are auto-logging page_views as key events
- DebugView: test from a clean browser to confirm events fire correctly
- Mark "Unassigned" data as unreliable in all reports until fixed
104 leads over 11 months. Low for SLC market size. GBP optimization and review velocity directly impact LSA ranking and lead flow.
Steps (Greg, ~1 hour):- LSA Dashboard → Utah account (189-035-6117) → ensure ALL service categories are active (HVAC, plumbing, electrical, drain)
- Update business hours to match Avoca AI coverage (Mon-Sat 7am-9pm, emergency 24/7)
- Upload 5+ professional photos (trucks, team, completed jobs)
- Review and dispute invalid leads within 30-day window for credits
- Increase weekly budget from current to $500/week once landing pages are fixed
Zero impressions Sunday, 450 Saturday. Ads run Mon–Fri 7am–5pm only. Emergencies don't follow business hours — competitors capture every weekend burst pipe. Avoca AI already covers weekends.
Steps (Greg or MediaSpark, ~15 min — AFTER items 6–9 complete):- Google Ads → Campaign Settings → Ad Schedule
- Add Saturday 8am–4pm as test window
- Start with 50% bid adjustment (conservative test)
- Monitor for 2 weeks — if CPA stays under $100, expand to Sunday and full Saturday
- Verify with Avoca that weekend call handling is active and bookable rate ≥ 70%
Phase 2 Summary — Weeks 1–2
Who does it: Web developer (WordPress backend access), Greg Romans (GA4/LSA admin).
Access needed: WordPress admin for GRPHC site, GA4 admin for Golden Rule PHC property, LSA accounts (189-035-6117 for Utah, 274-787-7158 for DSM).
Total cost: Dev time only (web developer hours). No additional ad spend until Phase 3.
Expected impact: Landing page conversion from 0.59% → 5%+ (8x improvement). If achieved on 2,560 monthly sessions, that's ~128 leads instead of 15.
Gate check: Landing page conversion rate ≥5% for 7 consecutive days before moving to Phase 3.
Graduate the Dollars — Week 3+ (gated on Phase 2)
Once landing page conversion rates hit ≥5% and tracking is clean, re-enable and scale. Do NOT start Phase 3 until the gate check passes.
360 conversions at $45.71/lead — best campaign in the entire account by far. It was paused and that single decision caused CPA to explode from $49 to $260+ in Q3 2025.
Steps (Greg or MediaSpark, ~5 min):- Google Ads → Campaigns → find "Utah-PMAX-HVAC"
- Toggle status to Enabled
- Set daily budget: $50/day ($1,500/month) to start
- Monitor: CPA should be under $60 with clean conversion tracking. If above $80 for 7 days, check conversion actions.
- Scale to $100/day ($3,000/month) after 14 days of clean data
Gate: Landing page conversion rate ≥5% + Primary conversion actions confirmed.
MediaSpark projects 46 leads/mo at $5K spend once campaigns are restructured. Only worthwhile if conversion tracking is clean and landing pages convert.
Steps (Greg, incremental over weeks 3–6):- Week 3: Increase total daily budget by $20/day across PMax campaigns
- Week 4: Review CPA trend — if holding under $80 blended, add another $20/day
- Week 5: Budget should be at ~$5K/month. Monitor impression share (target: 25%+)
- Week 6: Evaluate MediaSpark management proposal ($1,500/mo). Only if their optimizations show measurable CPA improvement beyond what Phase 1 fixes achieved.
Gate: 30 days of clean conversion data with ≤5% CPA variance from target.
Currently invisible for 85% of searches. Budget increase + quality score improvement from clean tracking will push share up. But budget without conversion = throwing money at the same broken funnel.
Steps (Greg/MediaSpark, ongoing):- Increase budget in $1K/month increments as CPA allows
- Quality Score improvements from new landing pages will naturally boost share
- Target milestones: 25% by month 2, 40% by month 4, 60%+ by month 6
- Track via Auction Insights report — monitor rank vs. Any Hour, S.O.S., Whipple
Gate: Phases 1 & 2 fully complete.
Golden Rule has 800 reviews. Top competitor Any Hour has 26,808. Review velocity directly impacts LSA ranking, Map Pack position, and customer trust. Target: 50–70 new reviews/month by Month 3.
Steps (Mark + ops team, ~1 week setup):- Deploy NiceJob ($75/mo) — integrates with ServiceTitan for auto-review requests 2 hours after service
- Launch tech bonus: $10 per 5-star Google review tied to tech's name. Monthly leaderboard: #1=$250, #2=$150, #3=$100
- Order QR stickers (1,000 @ $200) for equipment placement
- Train techs on the verbal ask: "If you're happy, I'd really appreciate a Google review. It helps me out!"
- LEGAL: Never incentivize customers for reviews (Google prohibition, FTC $51,744/violation). Incentivize technicians only.
Timeline: Month 1: 20–30 new reviews. Month 3: 50–70. Month 12: 100+/month.
Connect all 4 Google APIs to replace stale CSV exports with live data. Current status:
Phase 3 Summary — Weeks 3–6+
Who does it: Greg Romans (campaign management), Mark (review program), Web developer (ongoing page builds), Diraj/GetFresh (dashboard wiring).
Monthly investment increase: $1,500–3,000/mo additional ad spend + $575–1,500 review program + optional $1,500/mo MediaSpark management.
Expected outcome: 46+ leads/month (vs ~17 today), $23K/month revenue on $6.5K spend (3.55x ROAS), 50+ new reviews/month, impression share from 14.59% → 40%+.
The sequence matters: Stop bleeding → Fix foundation → Then spend. Skipping to Phase 3 without completing Phase 2 = pouring money into the same broken funnel.
| Date | Property | Action | Status | By |
|---|