How Converly formats and hashes the lead's contact details before sending them to each ad platform, and why the exact format decides whether a conversion matches.
What is normalisation and hashing?
When Converly sends a conversion to an ad platform, it sends the lead's name, email address and phone number along with it. The ad platform then uses these details to help match the conversion back to a real person and the original ad they clicked.
But for privacy and security reasons, ad platforms don't allow you to just send personally identifiable information (like name, email, phone, etc) as plain text. Instead, they require you hash them.
If you've never heard of it before, hashing turns a sensitive piece of text into a fingerprint (i.e. a long string of letters and numbers) that doesn't contain the original text.
So when hashed, the email address jane@example.com would become 8c87b489ce35cf2e2f39f80e282cb2e804932a56a213983eeeb428407d43b52d
The ad platforms store personally identifiable information about their users in a hashed format, and the idea is that if we send the data in the same hashed format, they can match the two fingerprints together.
But a fingerprint only matches if the text it was made from is exactly the same, character for character. So continuing the example from above, Jane@Example.com and jane@example.com produce completely different fingerprints. And if the fingerprints we send don't match the fingerprints the ad platforms have stored, the ad platform still accepts the conversion and reports it as successful, but it's never matched to anyone and never shows up as a conversion in your reports.
That's why normalization matters. Before hashing, Converly formats each bit of information (name, email, phone, etc) exactly the way each ad platform formats the details of its own users, so the fingerprints will match when we send them over.
How we normalize and hash personal information
Every ad platform has its own rules for how each bit of information should be formatted, and some platforms take certain details without hashing at all. The table below shows at a glance what each platform receives, and the sections after it show exactly how each detail is formatted.
| Platform | Phone | Name | Country | |
|---|---|---|---|---|
| Google Ads | hashed | hashed | full address only | full address only |
| Meta | hashed | hashed | hashed | hashed |
| GA4 | hashed | hashed | hashed | not hashed |
| hashed | not accepted | not hashed | not hashed | |
| TikTok | hashed | hashed | not accepted | not accepted |
| not hashed | not hashed | not accepted | not accepted | |
| ChatGPT Ads | hashed | not accepted | not accepted | not hashed |
| Microsoft Ads | hashed | hashed | not accepted | not accepted |
| Snapchat | hashed | hashed | hashed | hashed |
| hashed | hashed | hashed | hashed | |
| X Ads | hashed | hashed | not accepted | not accepted |
| AdRoll | hashed | not accepted | not accepted | not accepted |
| Taboola | not accepted | not accepted | not accepted | not accepted |
Name
The table below shows how we normalise and hash the lead's name for each platform.
| Platform | Format | Hashed | Notes |
|---|---|---|---|
| Google Ads | full address only | Google Ads only accepts a name as part of a full postal address, together with a postal code and country. | |
| Meta | trimmed, lowercased | yes | First and last name are sent separately. |
| GA4 | trimmed, lowercased | yes | First and last name are sent separately. |
| trimmed | no | LinkedIn requires names in clear text, and only accepts them when both a first and last name are present. | |
| TikTok | not accepted | TikTok doesn't accept a name with a conversion. | |
| not accepted | Reddit doesn't accept a name with a conversion. | ||
| ChatGPT Ads | not accepted | ChatGPT Ads doesn't accept a name with a conversion. | |
| Microsoft Ads | not accepted | Microsoft Ads doesn't accept a name with a conversion. | |
| Snapchat | trimmed, lowercased, punctuation removed | yes | First and last name are sent separately. |
| trimmed, lowercased | yes | First and last name are sent separately. | |
| X Ads | not accepted | X doesn't accept a name with a conversion. | |
| AdRoll | not accepted | AdRoll doesn't accept a name with a conversion. | |
| Taboola | not accepted | Taboola doesn't accept a name with a server-side conversion. |
Accents and non-Latin characters are kept rather than stripped out, for every platform.
The table below shows how we normalise and hash the email address for each platform.
| Platform | Format | Hashed | Notes |
|---|---|---|---|
| Google Ads | trimmed, lowercased, Gmail rules | yes | Spaces are removed. For gmail.com and googlemail.com addresses, dots are removed from the part before the @ and anything after a + is dropped. Anything that isn't a valid email address is left out. |
| Meta | trimmed, lowercased | yes | Dots and anything after a + are kept, because Meta explicitly says they must not be removed. |
| GA4 | trimmed, lowercased | yes | Gmail rules are not applied. |
| trimmed, lowercased | yes | ||
| TikTok | trimmed, lowercased | yes | |
| trimmed | no | Sent as entered, because Reddit hashes it on its own side. | |
| ChatGPT Ads | trimmed, lowercased | yes | Only sent if it looks like a valid email address. |
| Microsoft Ads | trimmed, lowercased, dots and aliases removed | yes | Dots are removed from the part before the @ and anything after a + is dropped. Unlike Google Ads, Microsoft applies this to every address, not only Gmail. |
| Snapchat | trimmed, lowercased | yes | |
| trimmed, lowercased | yes | ||
| X Ads | trimmed, lowercased | yes | |
| AdRoll | trimmed, lowercased | yes | |
| Taboola | not accepted | Taboola doesn't accept an email address with a server-side conversion. It matches on the Taboola click identifier instead. |
The Google Ads and Meta rules are direct opposites for Gmail addresses. Before hashing, Jane.Doe+ads@gmail.com becomes janedoe@gmail.com for Google Ads but jane.doe+ads@gmail.com for Meta, which is why each platform's rules are applied separately.
Phone number
The table below shows how we normalise and hash the phone number for each platform.
| Platform | Format | Hashed | Notes |
|---|---|---|---|
| Google Ads | digits with a + in front | yes | Every character that isn't a digit is removed, then a + is added. |
| Meta | digits only | yes | Every character that isn't a digit is removed, including any +. |
| GA4 | digits with a + in front | yes | The same format as Google Ads. |
| not accepted | LinkedIn doesn't accept a phone number with a conversion. | ||
| TikTok | international format only | yes | Only sent when the visitor entered the number with a + and country code. Anything else is left out rather than guessed at. |
digits with a + in front | no | Sent in clear text, because Reddit hashes it on its own side. | |
| ChatGPT Ads | not accepted | ChatGPT Ads doesn't accept a phone number with a conversion. | |
| Microsoft Ads | digits with a + in front | yes | The same format as Google Ads. |
| Snapchat | digits only | yes | Every character that isn't a digit is removed, including any +, and a 00 in front of the country code is dropped. |
| digits only | yes | Every character that isn't a digit is removed, including any +, along with any leading zeros. | |
| X Ads | digits with a + in front | yes | The same format as Google Ads. |
| AdRoll | not accepted | AdRoll doesn't accept a phone number with a conversion. | |
| Taboola | not accepted | Taboola doesn't accept a phone number with a server-side conversion. |
Every platform that accepts a phone number needs it to include its country code to match, because Converly can't tell which country a number without one belongs to. TikTok goes a step further and leaves the number out entirely unless it was entered in international format.
Country
Converly doesn't take the country from the form. It works it out from the visitor's IP address when the conversion reaches our servers, and sends it as a two-letter country code.
| Platform | Format | Hashed | Notes |
|---|---|---|---|
| Google Ads | full address only | Google Ads only accepts a country as part of a full postal address, together with a first name, last name and postal code. | |
| Meta | two-letter code, lowercased | yes | |
| GA4 | two-letter code, uppercase | no | |
| two-letter code, uppercase | no | LinkedIn only accepts a country alongside a first and last name. | |
| TikTok | not accepted | TikTok doesn't accept a country with a conversion. | |
| not accepted | Reddit doesn't accept a country with a conversion. | ||
| ChatGPT Ads | two-letter code, uppercase | no | |
| Microsoft Ads | not accepted | Microsoft Ads doesn't accept a country with a conversion. | |
| Snapchat | two-letter code, lowercased | yes | |
| two-letter code, lowercased | yes | ||
| X Ads | not accepted | X doesn't accept a country with a conversion. | |
| AdRoll | not accepted | AdRoll doesn't accept a country with a conversion. | |
| Taboola | not accepted | Taboola doesn't accept a country with a server-side conversion. |
Empty fields
Converly leaves a field out entirely when it's empty or contains only spaces. It never sends the fingerprint of an empty value.
This matters because hashing empty text still produces a valid fingerprint, and both Google and Meta accept it as a match key. Sending it would group every visitor who didn't fill in that field into one single identity, which actually makes matching worse (with no error reported anywhere to alert you this is happening).
