The Situation: Great Numbers, Bad Reality
A home services company (plumbing and heating) was running Google Ads across Search and Local campaigns. Their agency was reporting excellent results: 180 conversions per month at £34 CPL.
The business owner had a nagging problem: the phone wasn't ringing like the dashboard suggested. He booked a conversion audit.
What the Audit Found
Issue 1: Phone Click Counted as Conversion + Call Conversion = Double Count
Every mobile click on the phone number was firing TWO conversion tags:
- The Google Ads auto-collected "click-to-call" event
- A custom GTM trigger on the phone number click
Every call was being counted twice. This alone inflated conversions by ~40%.
Issue 2: Form Submit Tag Firing on Page Load
The "Quote Request" conversion tag was attached to a GTM trigger that fired on the thank-you page URL — but that URL was also being indexed by Google's bot crawler. Every Google bot visit to the thank-you page (for quality score purposes) was registering as a conversion.
Analysis of the conversion timestamps showed 22% of conversions were firing between midnight and 4am — the bot traffic window.
Issue 3: No Bot Traffic Filtering
Google Tag Manager's client-side container doesn't filter bot traffic. The conversion tag fired for any request that loaded the page — human or automated. Without server-side filtering, the tag had no way to distinguish a real visitor from a crawler.
The Real Numbers
After removing duplicates and bot-triggered conversions, the actual monthly conversion count was 72 (not 180). Real CPL: £86 (not £34).
The campaigns were burning £8,400/month on a false signal. Smart Bidding was optimising for bot traffic patterns — not real customers.
The Fix
Phase 1: Clean Up Existing Tags (Week 1–2)
- Removed duplicate phone click conversion — kept only the call duration conversion (calls > 60 seconds)
- Changed thank-you page trigger to fire only after DataLayer push from form submit event (not page load)
- Set conversion counting to "One per click" with 7-day lookback window
Phase 2: Server-side GTM Deployment (Week 3–5)
We deployed a server-side GTM container on Google Cloud Run to handle all conversion processing:
- All conversion events routed through sGTM server
- Bot user agents filtered server-side using request header inspection
- IP exclusion list for known crawler ranges
- Event deduplication via
transaction_idparameter
With server-side processing, conversion events are validated before being sent to Google Ads — eliminating the entire category of bot-triggered conversions.
Phase 3: Conversion Validation Logic
Added a server-side rule: conversions only pass through if:
- Session duration > 5 seconds
- User agent not in known bot list
- IP not in crawler/datacenter range
- Form event has valid
form_idparameter
Results at Week 8
| Metric | Before Fix | After Fix | Change |
|---|---|---|---|
| Monthly Conversions Reported | 180 | 74 | -59% |
| Actual CPL (real leads) | £86 | £28 | -67% |
| Monthly Real Leads | 72 | 74 | +3% |
| Monthly Wasted Spend | £8,400 | £0 | Eliminated |
With clean data, Smart Bidding retrained within 4 weeks. The campaigns started bidding on the right signals — real homeowners looking for plumbing services, not bot traffic patterns — and CPL dropped from £86 to £28.
Monthly savings: £8,400 per month in wasted budget that was previously funding bot-optimised campaigns.
What to Watch for in Your Account
These issues are more common than most agencies admit:
- Phone click + call conversion duplication — check your conversion actions for any event counted on both mobile click and call completion
- Thank-you page as trigger — always use DataLayer pushes, not URL-based triggers, for form conversions
- Missing bot filtering — if you're not on server-side GTM, you have no protection against crawler conversions

