The Problem
The client — a US-based SaaS startup — was running Google Ads across multiple campaigns targeting mid-market buyers. Their tracking setup was entirely browser-side: a standard GTM container with a GA4 tag and a Google Ads conversion tag firing on a thank-you page.
The issues compounding over time:
- iOS and Safari users were being missed due to ITP blocking first-party cookies
- Ad blockers were suppressing the GTM container for a significant portion of traffic
- Demo bookings that came through HubSpot CRM were never being reported back to Google Ads as conversions
- The Google Ads account was optimising on incomplete data, inflating CPA estimates and under-bidding on high-intent audiences
Their Google Ads account manager flagged that reported conversions were around 40% below what HubSpot was recording in closed deals — a significant modelling gap.
What We Did
1. Server-Side GTM Setup
We provisioned a server-side GTM container on Google Cloud Run (minimal cost, auto-scaling) and pointed the GA4 measurement protocol and Google Ads conversion pings through it. This meant tracking requests were no longer visible to browser-level blockers, and cookies were set as first-party server-side — extending their effective lifetime beyond ITP limits.
2. Enhanced Conversions for Google Ads
We pulled hashed email from the HubSpot form submission and passed it through the server container as part of the Google Ads conversion hit. This allowed Google to match logged-in users back to their Google accounts — improving match rates and attributing conversions that the click-based tag would have missed entirely.
3. HubSpot Offline Conversion Upload
For deals that closed days or weeks after the initial ad click, we built a Zapier workflow triggered on HubSpot deal stage change. When a deal moved to "Closed Won", the workflow:
- Pulled the original GCLID stored on the HubSpot contact record
- Formatted and uploaded it to Google Ads via the offline conversion import API
- Tagged the conversion with the deal value for value-based bidding
This closed the loop between ad spend and actual revenue — not just form fills.
4. GTM Audit and Deduplication
Before go-live, we audited the existing container and removed duplicate tags, fixed misfiring triggers, and ensured the browser-side and server-side tags weren't double-counting. A GA4 DebugView and Google Ads conversion path report were used to validate clean data post-launch.
Results
Within 60 days of full deployment:
- +34% increase in reported conversions — primarily recovered from Safari/iOS users and ad-blocked sessions
- -22% reduction in CPA — Google's Smart Bidding had more data to work with and reallocated spend toward higher-converting segments
- 100% GCLID capture rate on HubSpot form submissions (previously 0% for offline deals)
- Offline conversion upload matching 78% of closed deals back to a Google Ads click
- Client paused their GA4 app+web property migration — the server-side setup resolved the data gaps they were planning to fix with a full platform rebuild
The Google Ads account is now optimising on accurate, complete conversion data — including deal value — for the first time since launch.


