server-track-labby Canada Site Ops

Google Ads enhanced conversions for leads, sent server-side

By Canada Site Ops · Based on Google's official Data Manager API, Google Ads API and Google Ads Help pages, checked Oct 22, 2026 · Sources linked inline

Most B2B leads don't convert on the page where they clicked an ad. Someone fills in a demo form, sales qualifies them a week later, and the deal closes a month after that. Enhanced conversions for leads is Google's way to report those later steps: your server uploads the conversion with hashed user data (usually the email address from the form), and Google matches it to the ad interaction[6][7]. This guide covers what you need to send it from your own backend in late 2026: which API, how to hash, when a click ID matters, the consent fields, and the timing windows.

Honest status: server-track-lab's Google path is a validate-only preview today. We build the Data Manager API request from your event and Google checks it, but no conversions are recorded in Google Ads. Meta Conversions API is our only live destination. Everything below is about Google's API itself and applies whatever tool you use.

1. Pick the API: Data Manager, not the legacy upload

For years the server-side path was the Google Ads API's UploadClickConversions with a ClickConversion per lead[5][6]. That is changing. Google Ads Help says that starting June 15, 2026, offline conversion imports and enhanced conversions for leads uploads are migrated to the Data Manager API and blocked in the Google Ads API; developer tokens that didn't send such requests between January and June 2026 aren't allowlisted for legacy access[4]. The Google Ads API upload guide now carries the same warning and points new integrations to the Data Manager API[5].

So for a new integration, use the Data Manager API's events:ingest. The destination is a Google Ads conversion action whose type is UPLOAD_CLICKS ("Website (Import from clicks)" in the Google Ads UI), identified by the 10-digit customer ID without hyphens and the conversion action ID[1]. If you already run the legacy upload and your token is allowlisted, it keeps working for now, but plan the move.

2. Shape of a request

A minimal Data Manager API request for one lead looks like this (values are placeholders; hashes shown as names)[1]:

{
  "destinations": [{
    "operatingAccount": {"accountType": "GOOGLE_ADS", "accountId": "1234567890"},
    "loginAccount": {"accountType": "GOOGLE_ADS", "accountId": "1234567890"},
    "productDestinationId": "CONVERSION_ACTION_ID"
  }],
  "encoding": "HEX",
  "consent": {"adUserData": "CONSENT_GRANTED", "adPersonalization": "CONSENT_GRANTED"},
  "events": [{
    "eventTimestamp": "2026-10-22T12:30:00-04:00",
    "transactionId": "lead_48213",
    "eventSource": "WEB",
    "adIdentifiers": {"gclid": "GCLID_FROM_LANDING_PAGE"},
    "userData": {"userIdentifiers": [
      {"emailAddress": "SHA256_HEX_OF_NORMALIZED_EMAIL"},
      {"phoneNumber": "SHA256_HEX_OF_E164_PHONE"}
    ]}
  }],
  "validateOnly": true
}

Required on each event: eventTimestamp and eventSource (for example WEB). Optional but important: transactionId, which Google uses to deduplicate within the same conversion action, including against conversions your website tag already recorded[1]. Use a stable ID from your system (lead ID, opportunity ID) and send the same one on every retry.

The API is fast-fail: if any event in a request fails validation, the whole request fails and nothing is processed. Setting validateOnly: true runs the same checks without ingesting anything, which is exactly how server-track-lab's preview works[1].

3. Normalize and hash user data

User identifiers must be SHA-256 hashed and sent as hex or Base64, with the request's encoding set to match[1][2]. Normalize before hashing, or the hash won't match Google's:

Common errors are plain-text emails (INVALID_HEX_ENCODING) and values that are hex but not a SHA-256 hash (INVALID_SHA256_FORMAT)[1]. Our free Google enhanced conversions payload builder does this normalization and hashing in your browser so you can compare your own output.

4. gclid vs user data

Each event needs at least one identifier: a gclid, gbraid or wbraid; session attributes; an IP address; or userData[1]. The two you will use most in B2B are:

Send both when you can; Google's upload guide says to include the click ID alongside user identifiers whenever it's available[5]. If you can't capture a gclid, Google's docs also describe sending encoded session attributes captured on the form page[1].

5. Consent fields

The Data Manager API takes a Consent object with adUserData and adPersonalization. Each is CONSENT_GRANTED, CONSENT_DENIED or CONSENT_STATUS_UNSPECIFIED[3]. You can set it on the request, which covers every event, or per event[1]. On the legacy ClickConversion, consent.ad_user_data is recommended, and ad_personalization isn't supported there[5]. Send what your consent banner actually recorded for that person. Don't default to granted.

6. Timing windows

For a long B2B cycle, that means: if a deal closes more than 63 days after the click, send an earlier stage (say, sales-qualified lead) as its own conversion action within the window, and treat the closed deal as a value update or a separate goal.

7. How it works with server-track-lab today

You send one event to our API; we normalize, hash and build the Data Manager API request:

curl https://server-track-lab.pages.dev/api/v1/track \
  -H "Authorization: Bearer sst_live_YOUR_KEY" -H "Content-Type: application/json" \
  -d '{"event_name":"qualified_lead","event_id":"lead_48213",
       "timestamp":"2026-10-22T16:30:00Z",
       "user":{"email":"Jane.Doe@Acme.example","phone":"+1 416 555 0134",
               "gclid":"GCLID_FROM_LANDING_PAGE"},"destinations":["google"]}' 

The response and dashboard show the exact events:ingest body and Google's validation result. Nothing is recorded in Google Ads yet. Our status as of Oct 22, 2026:

If you need live Google uploads today, call the Data Manager API directly using the request above, or use a tool with a live Google Ads destination. You can still use server-track-lab to check that your hashing and payload pass Google's validation first.

FAQ

What is enhanced conversions for leads?

It lets you upload a lead's conversion (for example, a qualified lead or a closed deal) from your server or CRM with hashed user data such as an email address, so Google Ads can tie it back to the ad that drove the lead even when no click ID was captured. Google describes it as an upgraded version of offline conversion import.

Should I use the Data Manager API or the Google Ads API?

Use the Data Manager API for new work. Google's help center says that starting June 15, 2026, offline conversion imports and enhanced conversions for leads uploads are migrated to the Data Manager API and blocked in the Google Ads API, except for developer tokens that sent such requests between January and June 2026.

Do I need a gclid?

No, but send it when you have it. The Data Manager API accepts a gclid, gbraid or wbraid, session attributes, IP address or hashed user data as identifiers; at least one is required. Google's docs recommend including the click ID alongside user data whenever it's available.

How late can I upload a lead conversion?

Google Ads help says conversions with user-provided data for enhanced conversions must be uploaded within 63 days of the associated last click, and click-ID conversions within 90 days. Imported statistics take about three hours to appear for last-click attribution.

Which consent fields do I send?

In the Data Manager API, a Consent object with adUserData and adPersonalization, each CONSENT_GRANTED, CONSENT_DENIED or CONSENT_STATUS_UNSPECIFIED. It can be set for the whole request or per event. In the legacy Google Ads API ClickConversion, consent.ad_user_data is recommended.

Does server-track-lab send enhanced conversions for leads today?

Not live. server-track-lab builds the Data Manager API events:ingest request from your event and runs it as a validate-only preview: Google checks the request, but nothing is recorded. Meta Conversions API is the only live destination today.

Sources (checked Oct 22, 2026)

  1. https://developers.google.com/data-manager/api/devguides/events/google-ads/offline/send-events
  2. https://developers.google.com/data-manager/api/devguides/concepts/formatting
  3. https://developers.google.com/data-manager/api/reference/rest/v1/Consent
  4. https://support.google.com/google-ads/answer/15713840
  5. https://developers.google.com/google-ads/api/docs/conversions/upload-clicks
  6. https://developers.google.com/google-ads/api/docs/conversions/enhanced-conversions/leads
  7. https://support.google.com/google-ads/answer/15081888
  8. https://support.google.com/google-ads/answer/10029210

Related: B2B form and CRM conversions · LinkedIn Conversions API for B2B · Google EC payload builder · API docs.

Try the playground (no signup) Get a free API key