Server-side events · Platform reference
Google Ads enhanced conversions for web checker
Enhanced conversions for web attach first-party user data (email, phone, name and address) to an existing Google Ads conversion. You send it either from the Google tag with gtag('set', 'user_data', ...) on the conversion page, or afterwards from your server as ConversionAdjustment ENHANCEMENT uploads keyed on order_id. Conversions still record without it but match less often when the data isn't on the page at conversion time, the page isn't HTTPS, the address is incomplete, or the API order_id doesn't match the tag's transaction ID.
Read from the official documentation on 9 November 2026. Sources are listed at the end.
Check your own setup
Paste your gtag/GTM thank-you-page snippet and the checker confirms the AW- conversion ID and send_to label, value, currency, transaction_id, the Consent Mode order, and whether enhanced conversions user_data is set (it also flags a Meta Pixel Purchase on the same page). It doesn't validate API ConversionAdjustment uploads and can't tell whether the user data is actually filled at runtime. Use the em parameter check in DevTools for that.
Open the Google Ads Conversion Tag CheckerEndpoint and authentication
Google tag: gtag('set', 'user_data', {...}) plus gtag('event', 'conversion', {send_to: 'AW-CONVERSION_ID/CONVERSION_LABEL', ...}). API: ConversionAdjustmentUploadService.UploadConversionAdjustments
Tag: the 'Allow user-provided data capabilities' setting in Google tag settings. API: Google Ads API credentials with access to the conversion customer
Calls and objects
Google Ads has no standard event list: every conversion action is one you create. These are the tag calls and API objects enhanced conversions works through.
| Name | What it is |
|---|---|
| conversion | gtag event name for a Google Ads conversion; send_to = 'AW-CONVERSION_ID/CONVERSION_LABEL' |
| user_data (gtag 'set') | attaches user-provided data to the conversion fired on the same page |
| ENHANCEMENT | ConversionAdjustment adjustment_type that adds user data to a tag conversion after the fact |
| RESTATEMENT | separate adjustment type for changing a conversion's value; restatement_value is ignored on ENHANCEMENT |
Required and recommended fields
| Field | What it needs |
|---|---|
| send_to | 'AW-CONVERSION_ID/CONVERSION_LABEL' in the conversion event snippet |
| value + currency | conversion value and currency in the event snippet |
| transaction_id | Unique per transaction, up to 64 characters, no customer-identifying data; must exactly match the ID used for any server-side upload |
| user_data | email preferred. Provide at least one of: email, a full address, or a phone number together with email or full name and address. Remove fields you don't collect rather than sending them blank |
| order_id (API) | Required on every ENHANCEMENT adjustment; must match the order ID your tag sent |
| user_identifiers (API) | Up to five identifiers per adjustment, one per UserIdentifier object |
| user_agent (API) | Should match the user agent of the request that sent the original conversion |
| gclid (API) | Recommended but optional on ENHANCEMENT adjustments |
| partial_failure (API) | Must be true so valid adjustments are processed; row errors come back in partial_failure_error |
Match keys and hashing
| Key | Normalise and hash |
|---|---|
| email / sha256_email_address | Trim whitespace and lowercase. For gmail.com and googlemail.com, remove periods before the @ (and, for API uploads, the first '+' and everything after it up to the @). SHA-256 as a lowercase hex string. The tag takes unhashed 'email' (Google hashes it) or pre-hashed sha256_email_address |
| phone_number / sha256_phone_number | E.164: 11 to 15 digits with a + prefix and country code, no dashes, parentheses or spaces; then SHA-256 hex if pre-hashing |
| address.first_name / address.sha256_first_name | Trim and lowercase, then SHA-256 hex if pre-hashing |
| address.last_name / address.sha256_last_name | Trim and lowercase, then SHA-256 hex if pre-hashing |
| address.street | SHA-256 in API uploads |
| address.city / region / postal_code / country | Do not hash |
Click ids
| Click id | Where it comes from |
|---|---|
| gclid | Recommended but optional on API ENHANCEMENT adjustments; the order_id is what links the enhancement to the tag conversion |
Deduplication
- Tag: two conversions for the same conversion action with the same transaction_id are treated as duplicates, and the second isn't counted.
- transaction_id must be unique for every transaction, and must exactly match the ID used if you also upload that conversion server-side.
- A transaction ID does not fix duplicate view-through conversions.
- API: an ENHANCEMENT adjustment doesn't create a new conversion. It enriches the tag conversion whose order ID matches its order_id.
Time limits and batch sizes
- API enhancements must be sent within 24 hours of the conversion event; leave a safety margin before the window closes.
- Conversions older than 54 days can't be adjusted.
- Up to 2,000 adjustments per UploadConversionAdjustments request (TOO_MANY_ADJUSTMENTS_IN_REQUEST otherwise).
- The Diagnostics report becomes available about 72 hours after implementation (the GTM setup guide says about 48 hours).
- Diagnostics alerts are hidden when there were fewer than 20 conversions in the past 7 days; 'No recent data' means nothing was recorded in the last 7 days.
How to test before you trust it
- Chrome DevTools Network tab: Find the request to googleadservices.com/pagead/conversion/ (or google.com/pagead/1p-conversion/). The 'em' parameter should hold a hashed string starting tv.1~em. Just 'tv.1~em' means user data wasn't available at conversion time.
- Enhanced conversions tag diagnostics: In Goals > Summary > the conversion action > Diagnostics. Statuses are Excellent, Good, Needs attention and No recent data. em error codes: e0 failed formatting, e1 unsupported browser, e2 SHA-256 failed, e3 page not HTTPS.
- Enhanced conversions API diagnostics report: Shows statuses such as Recording enhanced conversions, Waiting to receive enhanced conversion data, Setup issues detected.
Why events arrive but don't attribute
- User data isn't on the page when the tag fires: the em parameter is just 'tv.1~em'. Typical cases are signed-in users who don't re-type their details, or a thank-you page that has lost the form values.
- The page is served over HTTP. Enhanced conversions only hash user data on HTTPS, and the diagnostics show e3.
- Address sent without all four of country, first name, last name and postal code. Google only uses an address when all four are present.
- Phone not in E.164 (missing + or country code, or containing spaces and dashes), which fails formatting (e0).
- API ENHANCEMENT sent more than 24 hours after the conversion, or with an order_id that doesn't match the tag's transaction_id, so there's no conversion to enrich.
- user_agent on the API adjustment differs from the original conversion request, which Google says it uses to attribute both the same way.
- With the automatic or CSS-selector collection methods, the ads cookie follows Consent Mode ad_storage, and data is only collected where the required consent parameters are 'granted'.
- Selectors or JavaScript variables that read form fields break on some browsers or on mobile, so diagnostics report 'Missing user-provided data' and low coverage.
Sources
- Google Ads API: Manage online click conversions (enhanced conversions for web)
- Google Ads Help: Set up enhanced conversions for web using the Google tag
- Google Ads Help: Set up enhanced conversions for web using Google Tag Manager
- Google Ads Help: About the enhanced conversions for web tag diagnostics report
- Google Ads Help: Use a transaction ID to minimize duplicate conversions
- Google Ads API: Quotas and limits
- Google Ads Help: About enhanced conversions diagnostics
Platforms change these rules without notice. If a source says something different from this page, the source wins.