Home / Guides

The em on a GA4 hit is not Enhanced Conversions

Google now sends hashed customer data on the GA4 hit itself, under the same parameter name and the same envelope Google Ads has used for years. Two products, one spelling, and a failure mode that looks exactly like success.

For years, an em parameter carrying tv.1~em.<hash> meant one thing: Google Ads Enhanced Conversions, on a conversion request to googleadservices.com. There is a guide on this site about reading it.

User-provided data collection puts the same parameter, with the same envelope, on the GA4 hit. So em now means one of two different things depending on which request you are looking at, and the request is the only thing that tells them apart.

Two products, one spelling

They are not variants of each other. They are separate features, with separate settings, feeding separate reports:

That last clause is where the confusion is manufactured: the Analytics feature can end up feeding the Ads one. They are still not the same switch. Turning on enhanced conversions in Google Ads does not start GA4 collecting user-provided data, turning on user-provided data does not configure the Ads conversion tag, and each sends its own request whatever the other is doing.

Google also says outright that the two use the same normalisation and hashing algorithm, which is why the value looks identical. So em on a /g/collect hit is not evidence that the conversion tag is sending anything, and em on a conversion is not evidence that the property is collecting. Two requests, two answers, and you have to read the one you are asking about.

A GA4 purchase request expanded in the panel: the /g/collect path, a reported consent state of granted, and the full request URL ending in em=tv.1~em. followed by a sixty-four character hash.
Google’s instruction is exactly this: find the /g/collect request and read em. The consent the hit went out under is in the same panel, a few rows above the parameter it applies to.

So read the host and path before the parameter. On a Google Ads conversion, em is what the conversion tag sent. On /g/collect, it is what the property collected. The same sixty-four hex characters, configured in two different products, with two different places to go and check the result.

The envelope that went out empty

Google's own validation instruction is to find the /g/collect request and confirm the em value starts with tv.1~em followed by a long string. The reason it is worded that carefully is the case underneath it: a bare tv.1~em with nothing after it.

That is the tag having fired correctly and found nothing to collect. The envelope is written either way. Nothing in the container looks wrong, the parameter is present, a checklist that asks "is em there" passes — and no user data was sent.

It is almost always timing or selector: the tag fires on page view while the email is still behind a login step, or the CSS selector for the field stopped matching after a redesign, or the value only exists after a form submits and the event runs before it. The container cannot report any of those. The request reports all of them, immediately, as an envelope with nothing in it.

The field names are not the ones you hashed

On the way in, gtag takes plain values — email, phone_number and an address object with first_name, last_name, street, city, region, postal_code and country — and hashes them for you.

If you would rather hash them yourself, there is a parallel set of names for that: sha256_email_address, sha256_phone_number, address.sha256_first_name and address.sha256_last_name. The two sets are not interchangeable, and the expensive mistake is putting a digest you computed into email, where gtag hashes it again. Sixty-four perfectly formed hex characters, matching nobody — the same double-hash failure the Enhanced Conversions guide describes, wearing different field names.

What is hashed, and what is deliberately not

Not every field is a digest, and a reviewer who expects them all to be will report a bug that is not there. In the Measurement Protocol shape, sha256_first_name, sha256_last_name and sha256_street are hashed; city, region, postal_code and country are normalised and sent as they are.

That is the same split Google Ads uses, where country travels as a plain ISO 3166-1 alpha-2 code and is meant to. Plain text in those four is correct. Plain text in an email or a phone number is a policy problem.

This is the part the browser makes easy and every interface makes hard. The gcs and gcd parameters ride on the very same /g/collect hit as em, so "customer data left the browser" and "under what consent state" are one line apart rather than two products apart.

If em is populated on a hit whose consent state says the visitor refused, that is a finding, and it is not one any Analytics report will surface. Reading the consent signals off the hits is the other half of this check, and it costs nothing extra once you are already looking at the request.

What Tag Master does and does not check here

Being straight about this matters more than claiming the feature. As of extension 2.0.0 the hashed field validation — the SHA-256, MD5 and plaintext badges, and the warning about personal data sent in the clear — runs on Google Ads conversion requests only. On a GA4 hit, em is decoded and listed like any other parameter — in the panel’s Other group, under its own name rather than a friendly one, because the GA4 entry’s dictionary does not carry it. Listed, and not graded.

So the reading here is done by eye, and it is not hard: the envelope is there or it is empty, and what follows tv.1~em. is hex or it is not. The GA4 parameter reference lists it with the rest of what a /g/collect request carries. Extending the grading to this request is worth doing and is not done yet. The figure above is the hit as the panel really draws it; a badge staged onto it would have been the easier page to write and the wrong one.

Questions

How do I check GA4 user-provided data is working?

Load the page, find the /g/collect request and read em. Google’s own instruction is that the value should start with tv.1~em followed by a long string. A bare tv.1~em with nothing after it means the envelope went out empty.

Is this the same as Enhanced Conversions?

Related, not the same. Enhanced conversions is a Google Ads feature travelling on the conversion request to googleadservices.com; this is Google Analytics, on /g/collect, with its own setting — though what Analytics collects can be exported to a linked Ads account and used there. Same parameter name, same envelope, two requests, two switches.

Which user-provided data fields have to be hashed?

Email, phone, first name, last name and street. City, region, postal code and country are normalised but sent unhashed — the same split Google Ads uses, where country travels as a plain ISO code.

Why is my em empty when the tag is set up?

Because the tag fired at a moment when no data was on the page to collect. The envelope is written either way, so an empty one is not a tagging error you will see in the container — it is a timing or selector problem, and the request is where it shows.

The rest of this group: GA4, server-side and attribution

More in GA4, server-side and attribution

Try it on your own site

Tag Master is free, needs no account, and collects no data.

Add to Chrome — Free