foco
Back to Blog

Server-Side Tracking for Google Ads: Enhanced Conversions Setup

April 14, 2026 7 min read

The Enhanced Conversions setup looks clean in your Google Ads account. First-party data is flowing. The match rate dashboard shows 85% coverage.

Then you compare the server-side numbers to your CRM. Google is claiming credit for 40% more conversions than actually exist. The Enhanced Conversions implementation is double-counting, and nobody noticed because the inflated numbers looked like better performance.

This happens when you run both client-side Enhanced Conversions (through gtag or the Google Ads tag in GTM) and server-side Enhanced Conversions (through sGTM) without proper coordination. Google receives the same conversion twice -- once from the browser, once from your server -- and counts both.

Why Server-Side Enhanced Conversions

Client-side Enhanced Conversions has reliability problems. Ad blockers strip the data before it reaches Google. iOS users with tracking restrictions block the requests entirely. Safari's Intelligent Tracking Prevention randomizes or blocks customer data.

Server-side tracking bypasses all of that. The conversion data flows from your server directly to Google's servers. No browser restrictions. No ad blocker interference. Higher match rates and more reliable attribution.

But the implementation has to account for deduplication with any client-side tracking you're still running. Most teams configure server-side Enhanced Conversions as an addition to their existing setup, not a replacement. That creates the double-counting problem.

The Technical Setup

Step 1: Configure the Google Ads Tag in sGTM

In your server-side GTM container, create a new Google Ads tag. Set the Conversion Action to match your existing client-side conversion action -- same Conversion ID and Label. This is critical for deduplication.

The tag configuration needs these parameters:

Conversion ID: AW-123456789
Conversion Label: abc123def456
Order ID: {{Event - transaction_id}}
Conversion Value: {{Event - value}}
Currency Code: {{Event - currency}}

The Order ID field is your deduplication key. It must match the transaction_id sent with any client-side conversion tracking for the same purchase.

Step 2: Map Enhanced Conversions Data

Enhanced Conversions requires first-party customer data. The Google Ads tag in sGTM has specific fields for this:

Email Address: {{Event - email}}
Phone Number: {{Event - phone_number}}
First Name: {{Event - first_name}}
Last Name: {{Event - last_name}}
Street Address: {{Event - address.street}}
City: {{Event - address.city}}
Region: {{Event - address.region}}
Postal Code: {{Event - address.postal_code}}
Country: {{Event - address.country}}

The data must come from your ecommerce platform or CRM, not from form fields or URL parameters. Google requires server-side validation that this is first-party data you own, not scraped information.

Data quality matters more than data volume

Google's matching algorithm prioritizes data accuracy over completeness. A conversion with just email and postal code but clean, validated data will match better than one with all fields populated but containing typos or formatting inconsistencies.

Step 3: Handle Data Layer Events

Your web container needs to send the conversion event to the server container with the Enhanced Conversions data included. This typically happens on the purchase confirmation page:

dataLayer.push({
  event: 'purchase',
  ecommerce: {
    transaction_id: '12345',
    value: 149.99,
    currency: 'USD'
  },
  user_data: {
    email: 'customer@example.com',
    phone_number: '+1234567890',
    first_name: 'John',
    last_name: 'Smith',
    address: {
      street: '123 Main St',
      city: 'Anytown',
      region: 'CA',
      postal_code: '12345',
      country: 'US'
    }
  }
});

Your sGTM client (Web or GA4) parses this event and makes the customer data available to the Google Ads tag through event data variables.

Common Implementation Problems

Mismatched Conversion Actions

The biggest mistake I see: teams create a new conversion action in Google Ads for the server-side implementation instead of using the existing one. This breaks deduplication completely.

Google deduplicates conversions based on three factors: Conversion Action, Order ID, and timestamp. If your client-side tag fires for Conversion Action A and your server-side tag fires for Conversion Action B, Google sees two separate conversions even if they have the same Order ID.

Fix: Use the same Conversion ID and Label for both client-side and server-side tracking. The server-side implementation should supplement the client-side one, not replace it with a different conversion action.

Missing Order IDs

Enhanced Conversions requires an Order ID for deduplication. Without it, Google cannot tell whether a server-side conversion is the same as a client-side one it received earlier.

I audited a Shopify Plus implementation where the client-side Google Ads tag was firing with transaction_id from the purchase confirmation, but the server-side implementation was generating its own unique ID for each conversion. Every purchase was being double-counted.

Fix: The Order ID must be identical between client-side and server-side implementations. Use your ecommerce platform's transaction ID, not a generated UUID or timestamp.

Data Formatting Issues

Google's Enhanced Conversions matching is sensitive to data format. Phone numbers need to be in E.164 format (+1234567890, not (123) 456-7890). Email addresses need to be lowercase and trimmed. Postal codes need to match the country's format standards.

The most common formatting problem is addresses. Street addresses with apartment numbers, suite numbers, or other secondary address lines often fail to match if they're formatted inconsistently between your client-side and server-side data sources.

Fix: Normalize the data before sending it to Google. Hash email addresses if you're concerned about PII transmission, but ensure the hashing is consistent across both implementations.

Test with Google's Enhanced Conversions diagnostic

Google Ads has a diagnostic tool under Tools → Conversions → Summary → Enhanced Conversions. It shows match rates and common formatting errors in your data. Use this to identify data quality issues before they affect conversion tracking.

If you're running Consent Mode v2, the server-side Enhanced Conversions need to respect the same consent signals as your client-side tracking. But sGTM consent enforcement is more complex than browser-based consent.

The consent state needs to be passed from the browser to the server container. If a user rejects analytics consent in your CMP, but your server-side Google Ads tag doesn't check for that consent signal, you're sending Enhanced Conversions data for users who opted out.

Fix: Configure consent-based triggers in sGTM that mirror your client-side consent logic. The Google Ads tag should only fire when analytics_storage consent is granted.

Verification and Testing

Check Event Match Rate

Google Ads shows Enhanced Conversions match rates under Conversions → Summary. Look for the "Customer data" column. Match rates below 70% indicate data quality problems or configuration issues.

Low match rates usually mean:

  • Email addresses or phone numbers are formatted incorrectly
  • You're sending fake or test data instead of real customer information
  • The data is being modified or corrupted between your source system and Google

Test Deduplication

Fire a test conversion that should be tracked by both client-side and server-side implementations. Use the same transaction ID, same conversion value, same customer data. Check Google Ads reporting after 24 hours.

If you see two conversions instead of one, deduplication is broken. The most likely causes are mismatched Conversion Actions or missing/different Order IDs.

Monitor Conversion Timing

Enhanced Conversions can be sent to Google up to 7 days after the original conversion, and Google will still deduplicate them correctly. But most server-side implementations should be sending the data within minutes or hours of the conversion.

Long delays between conversion and Enhanced Conversions data usually indicate problems with your data pipeline -- either the server-side event is being queued/batched when it should be real-time, or there's a processing delay in your ecommerce platform.

The Integration Reality

Getting Enhanced Conversions working through sGTM is not a 30-minute tag configuration. It requires coordination between your ecommerce platform, your web analytics implementation, your server-side container, and your Google Ads account setup.

The data quality requirements are higher than most teams expect. The deduplication logic is unforgiving -- one mismatched field can result in double-counting that inflates your conversion reporting by 50-100%.

But when implemented correctly, server-side Enhanced Conversions delivers more reliable attribution than client-side implementations, especially for iOS traffic and privacy-conscious users. The match rates are consistently higher, and the data reaches Google even when browser-based tracking fails.

The complexity is in the details: data formatting, consent handling, and ensuring your server-side implementation coordinates with, rather than duplicates, your existing tracking.

Still seeing server-side tracking issues?

Get a measurement review

Share this article