Client-side tracking is dying. iOS restricts it. Adblockers kill it. ITP shortens cookie lifespans. Consent banners block it. Browsers now strip URL parameters on cross-site navigation.
The accounts I've audited recently are losing 15-35% of their conversions to client-side tracking failures, and most don't even know.
Server-side GTM solves most of this. It moves your tracking from the user's browser to a server you control. Enhanced Conversions get more accurate. First-party cookies last longer. Ad blockers can't kill what they can't see.
Most advertisers have heard of server-side tagging. Almost none have set it up properly for Google Ads specifically. Here's the full implementation.
The TL;DR: Server-side GTM moves your tracking from the user's browser to a server you control. For Google Ads, the win is measurably more accurate Enhanced Conversions and longer-lived first-party cookies that survive ITP, ad blockers, and consent restrictions. Setup is half a day. The conversion uplift is permanent.
What server-side GTM actually is
In a normal (client-side) setup:
- A user visits your site.
- The browser loads GTM.
- GTM fires tags directly to Google Ads, GA4, Meta, etc.
Every tag is a network call from the user's browser. That call is visible to ad blockers, browser tracking protections, and consent management platforms.
In a server-side setup:
- The browser loads a single, lightweight script.
- That script sends data to your own server container (typically hosted at
sgtm.yourdomain.com). - Your server container then forwards the data to Google Ads, GA4, Meta, etc.
From the browser's perspective, only one call is made — to your own domain. From the destination's perspective, the data arrives cleanly with full server-controlled context.
Server-side GTM doesn't make ad blockers irrelevant. It dramatically reduces the surface area they can block.
Why this matters specifically for Google Ads
Three concrete wins:
1. Enhanced Conversions are dramatically more accurate
Enhanced Conversions match website conversions to logged-in Google users by hashing first-party data (email, phone, address) and sending it to Google. Client-side, that data has to be available on the conversion page and hashed in the browser.
Server-side, you can pull the hashed data from your CRM, your checkout flow, your booking system — at the moment of conversion, with much higher match rates.
2. First-party cookies last longer
Safari's ITP caps client-side cookies at 7 days. Server-side cookies (set via HTTP response headers, not JavaScript) can last much longer, up to the browser's hard limits.
For value-based bidding and long attribution windows, this is a big deal.
3. Better signal quality for Smart Bidding
More accurate conversions = better Smart Bidding decisions. The conversion uplift from properly-set-up server-side tracking is typically 8-20% reported in the accounts I've migrated.
Prerequisites
- A Google Cloud Platform account (free tier works for low-traffic sites, low-cost for higher traffic).
- An existing client-side GTM setup that's working.
- Access to your DNS to set up
sgtm.yourdomain.com. - A Google Ads account with at least one conversion action configured.
- For Enhanced Conversions: access to first-party data (email, phone) at the moment of conversion.
Step 1: Set up the server container
In GTM:
- Open your GTM account.
- Click Create container.
- Container type: Server.
- Name it (e.g.,
yourdomain.com server). - Choose Automatically provision tagging server.
- Pick a region close to your users.
- GTM will spin up an App Engine instance on Google Cloud Platform.
This takes about 5-10 minutes. You'll get a server URL like https://gtm-xxxxxx-yyy.uc.r.appspot.com.
Step 2: Set up a custom domain for your server container
You don't want to send tracking calls to gtm-xxxxxx.appspot.com. You want sgtm.yourdomain.com. First-party context = better tracking, longer cookies.
- In Google Cloud Console, open App Engine > Settings > Custom domains.
- Add
sgtm.yourdomain.com. - Update your DNS with the CNAME or A records Google provides.
- Wait for the SSL certificate to provision (usually within an hour).
Verify by visiting https://sgtm.yourdomain.com/healthy — you should see "ok".
Step 3: Configure the GA4 client and tag in the server container
Even if you're focused on Google Ads, you need a working GA4 setup in the server container first — it's the data backbone.
- In your server container, click Clients.
- Add the GA4 Client.
- Default request path:
/g/collect.
Then:
- Click Tags > New > GA4.
- Configure with your Measurement ID.
- Trigger: All GA4 events.
Step 4: Point your client-side GTM at the server container
In your web (client-side) GTM container:
- Open your GA4 Configuration tag.
- Click Fields to set.
- Add field name
server_container_urlwith valuehttps://sgtm.yourdomain.com. - Save and publish.
Now your client-side GA4 calls go to your server container first, which then forwards them to Google Analytics. Test with GA4 DebugView and the server container's preview mode.
Step 5: Add the Google Ads conversion tag to the server container
This is where the Google Ads-specific work happens.
- In your server container, click Tags > New.
- Tag type: Google Ads Conversion Tracking.
- Configure:
- Conversion ID: your Google Ads conversion ID (from the conversion action setup). - Conversion Label: from your conversion action. - Conversion Value: read from the data layer (e.g., {{Event - value}}). - Currency Code: {{Event - currency}}. - Order ID: {{Event - transaction_id}} (for de-duplication).
- Trigger: a custom event trigger that fires on
purchase(or whatever your conversion event is named). - Save.
Step 6: Add Enhanced Conversions data
This is the part that boosts match rates.
- In your server container tag, scroll to User-provided data.
- Select Manual configuration.
- Map each field:
- Email: hashed at the server from your data layer. - Phone: hashed. - First name / last name: hashed. - Address fields: hashed.
Server-side, you don't need to hash before sending — the server container can hash for you using the built-in helpers, or you can pull pre-hashed data from your CRM.
The match rate I see on server-side Enhanced Conversions is typically 15-30 percentage points higher than the equivalent client-side setup, because the data is cleaner and more complete at the server.
Step 7: Configure first-party cookies for longer attribution
In your GA4 client (server container), set:
- Cookie domain:
auto. - Cookie expiry: maximum allowed.
- Cookie path:
/.
In your client-side GTM, make sure your GA4 Configuration tag has the same cookie settings.
Test by inspecting cookies in your browser dev tools after visiting your site. You should see _ga cookies with HttpOnly and longer expiry dates than the standard ITP-capped 7 days.
Step 8: Test end-to-end
Critical and most-skipped step.
- Server container preview mode — open the server container, click Preview, paste your site URL.
- Make a test conversion on your site.
- Verify the GA4 event appears in the server container preview.
- Verify the Google Ads conversion tag fires in the same preview.
- Check Google Ads → Tools → Conversions for the test conversion appearing.
- Verify Enhanced Conversions diagnostics in Google Ads (it shows match rate).
- Repeat with ad blocker enabled in your browser — server-side should still capture the conversion.
Common mistakes
- Not setting up a custom domain. If you stay on the
appspot.comURL, you lose first-party context and most of the benefit. - Forgetting to point client-side at the server container. The most common cause of "I set it up but nothing changed."
- Sending unhashed PII to Google. Always hash server-side or pre-hash before sending.
- Skipping the order_id deduplication. Without it, you'll double-count conversions when both client-side and server-side fire.
- Trying to do too much in one go. Migrate GA4 first, then Google Ads, then Meta. One vendor at a time.
- Underestimating GCP cost. For high-traffic sites, App Engine costs can scale. Set up billing alerts.
Use case: a multi-location dental group
A composite based on patterns I've seen.
A dental group with 12 clinics was running Google Ads + GA4 + Meta with client-side tracking. Their Enhanced Conversions match rate sat at 38%. Smart Bidding was visibly inconsistent — high spend weeks didn't correlate with high booking weeks.
We migrated to server-side GTM with:
- Server container at
sgtm.theirdomain.com. - Google Ads conversion tag server-side with full Enhanced Conversions mapping from the booking system.
- First-party cookies via the server container.
- Old client-side tags disabled to prevent duplication.
Results over 60 days:
- Enhanced Conversions match rate climbed from 38% to 71%.
- Reported conversions in Google Ads up 19% (more accurate attribution, not actual new bookings).
- Cost per booking down 14% (Smart Bidding had better signal to work with).
- iOS Safari users — previously a tracking dead zone — now showed up properly in attribution.
The clinical booking volume didn't change. The visibility of what was driving bookings did.
Bottom line
If you're spending more than £20k/month on Google Ads and still running client-side tracking, you're leaving conversions on the table. The setup is half a day. The benefit is permanent.
- Move to server-side GTM with a custom domain.
- Get Enhanced Conversions working server-side for better match rates.
- Use first-party server-set cookies for longer attribution windows.
- Test end-to-end with ad blockers enabled before declaring victory.
Client-side tracking will continue to degrade. Server-side is the floor everyone serious will be standing on within the next year or two. Get there now.
Sources and further reading:
