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.

PlatformEmailPhoneNameCountry
Google Adshashedhashedfull address onlyfull address only
Metahashedhashedhashedhashed
GA4hashedhashedhashednot hashed
LinkedInhashednot acceptednot hashednot hashed
TikTokhashedhashednot acceptednot accepted
Redditnot hashednot hashednot acceptednot accepted
ChatGPT Adshashednot acceptednot acceptednot hashed
Microsoft Adshashedhashednot acceptednot accepted
Snapchathashedhashedhashedhashed
Pinteresthashedhashedhashedhashed
X Adshashedhashednot acceptednot accepted
AdRollhashednot acceptednot acceptednot accepted
Taboolanot acceptednot acceptednot acceptednot accepted

Name

The table below shows how we normalise and hash the lead's name for each platform.

PlatformFormatHashedNotes
Google Adsfull address onlyGoogle Ads only accepts a name as part of a full postal address, together with a postal code and country.
Metatrimmed, lowercasedyesFirst and last name are sent separately.
GA4trimmed, lowercasedyesFirst and last name are sent separately.
LinkedIntrimmednoLinkedIn requires names in clear text, and only accepts them when both a first and last name are present.
TikToknot acceptedTikTok doesn't accept a name with a conversion.
Redditnot acceptedReddit doesn't accept a name with a conversion.
ChatGPT Adsnot acceptedChatGPT Ads doesn't accept a name with a conversion.
Microsoft Adsnot acceptedMicrosoft Ads doesn't accept a name with a conversion.
Snapchattrimmed, lowercased, punctuation removedyesFirst and last name are sent separately.
Pinteresttrimmed, lowercasedyesFirst and last name are sent separately.
X Adsnot acceptedX doesn't accept a name with a conversion.
AdRollnot acceptedAdRoll doesn't accept a name with a conversion.
Taboolanot acceptedTaboola doesn't accept a name with a server-side conversion.

Accents and non-Latin characters are kept rather than stripped out, for every platform.

Email

The table below shows how we normalise and hash the email address for each platform.

PlatformFormatHashedNotes
Google Adstrimmed, lowercased, Gmail rulesyesSpaces 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.
Metatrimmed, lowercasedyesDots and anything after a + are kept, because Meta explicitly says they must not be removed.
GA4trimmed, lowercasedyesGmail rules are not applied.
LinkedIntrimmed, lowercasedyes
TikToktrimmed, lowercasedyes
ReddittrimmednoSent as entered, because Reddit hashes it on its own side.
ChatGPT Adstrimmed, lowercasedyesOnly sent if it looks like a valid email address.
Microsoft Adstrimmed, lowercased, dots and aliases removedyesDots 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.
Snapchattrimmed, lowercasedyes
Pinteresttrimmed, lowercasedyes
X Adstrimmed, lowercasedyes
AdRolltrimmed, lowercasedyes
Taboolanot acceptedTaboola 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.

PlatformFormatHashedNotes
Google Adsdigits with a + in frontyesEvery character that isn't a digit is removed, then a + is added.
Metadigits onlyyesEvery character that isn't a digit is removed, including any +.
GA4digits with a + in frontyesThe same format as Google Ads.
LinkedInnot acceptedLinkedIn doesn't accept a phone number with a conversion.
TikTokinternational format onlyyesOnly sent when the visitor entered the number with a + and country code. Anything else is left out rather than guessed at.
Redditdigits with a + in frontnoSent in clear text, because Reddit hashes it on its own side.
ChatGPT Adsnot acceptedChatGPT Ads doesn't accept a phone number with a conversion.
Microsoft Adsdigits with a + in frontyesThe same format as Google Ads.
Snapchatdigits onlyyesEvery character that isn't a digit is removed, including any +, and a 00 in front of the country code is dropped.
Pinterestdigits onlyyesEvery character that isn't a digit is removed, including any +, along with any leading zeros.
X Adsdigits with a + in frontyesThe same format as Google Ads.
AdRollnot acceptedAdRoll doesn't accept a phone number with a conversion.
Taboolanot acceptedTaboola 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.

PlatformFormatHashedNotes
Google Adsfull address onlyGoogle Ads only accepts a country as part of a full postal address, together with a first name, last name and postal code.
Metatwo-letter code, lowercasedyes
GA4two-letter code, uppercaseno
LinkedIntwo-letter code, uppercasenoLinkedIn only accepts a country alongside a first and last name.
TikToknot acceptedTikTok doesn't accept a country with a conversion.
Redditnot acceptedReddit doesn't accept a country with a conversion.
ChatGPT Adstwo-letter code, uppercaseno
Microsoft Adsnot acceptedMicrosoft Ads doesn't accept a country with a conversion.
Snapchattwo-letter code, lowercasedyes
Pinteresttwo-letter code, lowercasedyes
X Adsnot acceptedX doesn't accept a country with a conversion.
AdRollnot acceptedAdRoll doesn't accept a country with a conversion.
Taboolanot acceptedTaboola 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).