Privacy-First Measurement: Server-Side Tagging, Consent Mode and Conversion APIsConversion APIs: Meta, Google, TikTok and LinkedIn · Lesson 8 of 14

Google enhanced conversions, offline imports and Data Manager

Article · 8 min · 8 min lecture

Video lecture

Google enhanced conversions, offline imports and Data Manager

13 chapters · about 8 min · full transcript

Coming soon

Chapter 1 of 13

Google's conversion toolkit

  • Enhanced conversions (web, leads)
  • Offline imports
  • Data Manager
  • Consent in uploads

The narrated lecture is in production

Every chapter is scripted and ready. Browse the chapters and read the full transcript now — the video will appear here when it’s published.

Chapters

The Google conversion toolkit

Google offers several ways to send richer, more durable conversion data:

ToolWhat it doesTypical use
Enhanced conversions for webSends hashed first-party data (email, phone, name, address) collected on the conversion page with the conversion tagE-commerce, sign-ups
Enhanced conversions for leadsCaptures hashed email/phone when a lead form is submitted; later you upload the conversion (e.g., "qualified") matched on that hashed dataLead gen with CRM follow-up
Offline conversion import (click-based)Upload conversions with a click ID (gclid, gbraid, wbraid)Phone sales, CRM stages
Store sales / other first-party importsUpload offline transactions matched on user dataRetail
Google tag gateway / server-side GTMFirst-party delivery of Google tagsDurability
Data Manager (in Google Ads) and API optionsConnect first-party data sources (CRM, warehouses, CDPs) and manage uploadsScaling uploads

All of these depend on consent: for EEA/UK users, send ad_user_data consent status with uploads where the API supports it, and only upload data you are permitted to use.

Enhanced conversions for web with gtag

Set user data before the conversion event fires. Google's tag normalizes and hashes it (you can also send pre-hashed SHA-256 values).

// On the order confirmation page, after consent for ads measurement is granted
gtag('set', 'user_data', {
  email: order.email,            // or sha256_email_address: '<hex>'
  phone_number: order.phoneE164, // e.g. '+971501234567'
  address: {
    first_name: order.firstName, last_name: order.lastName,
    city: order.city, country: order.countryCode // 'AE'
  }
});
gtag('event', 'conversion', {
  send_to: 'AW-XXXXXXXXX/AbCdEfGhIjK',
  value: order.value, currency: order.currency, transaction_id: order.id
});

In Google Tag Manager, the Google Ads conversion tag has a "user-provided data" option; you can use automatic detection (less reliable), CSS selectors, or a data layer variable (recommended). Check the Diagnostics tab in Google Ads for enhanced conversion coverage and errors.

Offline conversion import with click IDs

  1. Capture the click ID from the landing page URL (gclid, or gbraid/wbraid from iOS app contexts) and store it with the lead in your CRM. The Conversion Linker tag also stores it in the _gcl_aw first-party cookie.
  2. When the lead reaches a stage (qualified, closed-won), upload a conversion with the click ID, conversion action, time (with time zone), value and currency.
  3. Upload via scheduled file (Sheets/HTTPS), a CRM integration (e.g., HubSpot, Salesforce), Data Manager, or the Google Ads API.

A minimal Google Ads API example using the official Python client:

# pip install google-ads   (configure google-ads.yaml or env vars; never hard-code credentials)
from google.ads.googleads.client import GoogleAdsClient

client = GoogleAdsClient.load_from_env()  # reads GOOGLE_ADS_* environment variables
customer_id = "1234567890"
svc = client.get_service("ConversionUploadService")
ca_path = client.get_service("ConversionActionService").conversion_action_path(customer_id, "987654321")

conv = client.get_type("ClickConversion")
conv.gclid = "Cj0KCQ...stored_with_lead"
conv.conversion_action = ca_path
conv.conversion_date_time = "2026-09-20 14:05:00+04:00"
conv.conversion_value = 12000.0
conv.currency_code = "AED"
conv.consent.ad_user_data = client.enums.ConsentStatusEnum.GRANTED

req = client.get_type("UploadClickConversionsRequest")
req.customer_id = customer_id
req.conversions.append(conv)
req.partial_failure = True
resp = svc.upload_click_conversions(request=req)
if resp.partial_failure_error:
    print("Partial failure:", resp.partial_failure_error.message)

Check the Google Ads API documentation for the current API version and any newer upload options (Google has been consolidating first-party data ingestion under Data Manager).

Enhanced conversions for leads flow

  • Form submit: tag captures hashed email/phone (with consent).
  • CRM: lead progresses; when qualified, you upload the conversion with the same email/phone (hashed) instead of a gclid.
  • Google matches the upload to the original ad interaction.

This is more robust than gclid-only flows when click IDs are lost (e.g., forms on other domains, Safari link protections).

Worked example: a Dubai real-estate brokerage

Leads come from Search and PMax; deals close offline weeks later. They implement enhanced conversions for leads on the enquiry form, store gclid and hashed email in the CRM, and upload "viewing booked" (value = expected commission × viewing-to-deal rate) and "deal closed" (actual commission) conversions daily. Bidding shifts to value-based once enough conversions accumulate; campaigns stop optimizing for low-intent enquiries.

Pitfalls

  • Uploading conversions older than the click-through window of the conversion action.
  • Wrong time zone formats, causing rejected rows.
  • Primary vs secondary conversion actions misconfigured, so bidding optimizes to the wrong goal.
  • Uploading users who did not consent where consent is required.

How to measure success

Enhanced conversions "active" with good coverage in Diagnostics, upload success rate near 100%, offline conversions appearing in reports within the expected delay, and bidding goals aligned to qualified outcomes.

Key takeaways

  • Enhanced conversions add hashed first-party data to Google conversions for better matching.
  • Enhanced conversions for leads and click-ID offline imports close the loop on CRM outcomes.
  • Store gclid/gbraid/wbraid with each lead and upload stages with values and correct time zones.
  • Send consent status (ad_user_data) with uploads and only upload permitted data.
  • Monitor Diagnostics and upload success; align primary conversion actions with bidding goals.

Check your understanding

Quick questions to lock in the lesson. They don’t count towards your certificate.

  1. A lead form sits on a different domain and click IDs are often lost. Which Google approach is most robust for importing qualified leads?
  2. In gtag enhanced conversions, when must user_data be set?
  3. Why include consent.ad_user_data in an offline conversion upload?

Put it into practice

Design your Google offline loop: which stages you'll upload, their values, where gclid and hashed email are stored, upload method and schedule, and how consent is recorded.

Enrol for free to save your progress

Reading is always free. Enrol to keep your place, take the final assessment and earn a verifiable certificate.