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:
- Email: trim whitespace and lowercase. For
gmail.comandgooglemail.comonly, also remove every dot before the @ and remove a+and everything after it in the local part. Don't do that for other domains:user.name+NYC@Example.combecomesuser.name+nyc@example.com[2]. - Phone: E.164, meaning a plus sign, the country code and digits only.
(800) 555-0100in the US becomes+18005550100[2]. - Names: trim and lowercase, then hash. Region code and postal code are sent unhashed. An address identifier needs all four of given name, family name, region code and postal code[1].
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:
- gclid: the click ID from the landing page URL. Capture it on the first page view, store it with the lead (a hidden form field or your CRM), and send it with the conversion. It's the most precise match when you have it[6].
- Hashed user data: the email (and phone if you have it) the lead typed into your form. This is what makes it "enhanced": it still matches when the gclid was lost to a cookie banner, a different device, or a lead who came back days later.
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
- 63 days: enhanced conversions for leads uploaded more than 63 days after the associated last click aren't imported[7][8].
- 90 days: click-ID (gclid) offline conversions uploaded more than 90 days after the click aren't imported[7][8].
- About 3 hours for imported conversions to show up for last-click attribution, and longer for other models. They're reported on the date of the original click, not the upload date[5][7].
- Upload daily if you use Smart Bidding. Google's FAQ recommends at least daily uploads, or a consistent cadence[8].
- If a website tag already recorded the same
transactionId, user data you upload fills in only what the tag missed, and Google recommends doing that within 24 hours of the tag event. A new conversion action also has a 14-day trial period, during which uploaded conversions are reported but not used for bidding[1].
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:
- Meta Conversions API: live, using your own pixel and access token.
- Google: Data Manager API validate-only preview. Google checks the request; nothing is recorded.
- LinkedIn: dry-run. The payload is built and shown, not sent.
- Stripe webhook source: tested, but no real Stripe delivery proven yet.
- Pricing: first 1,000 billed events free each billing month, then CA$2 per 1,000.
- AI agents and bots: welcome. Any User-Agent works, and agent and bot usage is counted in its own bucket next to human traffic and billed the same.
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)
- https://developers.google.com/data-manager/api/devguides/events/google-ads/offline/send-events
- https://developers.google.com/data-manager/api/devguides/concepts/formatting
- https://developers.google.com/data-manager/api/reference/rest/v1/Consent
- https://support.google.com/google-ads/answer/15713840
- https://developers.google.com/google-ads/api/docs/conversions/upload-clicks
- https://developers.google.com/google-ads/api/docs/conversions/enhanced-conversions/leads
- https://support.google.com/google-ads/answer/15081888
- 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.