Skip to main content

GTM — User Email Hashed in Cookie

Script que captura el email y teléfono del usuario durante el checkout, los hashea con dos algoritmos distintos y los almacena en cookies de dominio. Si el hash del email ha cambiado respecto al valor guardado, empuja eventos al dataLayer con los identificadores hasheados — nunca en claro.


Dependencia externa

<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>

CryptoJS se usa activamente en este script (a diferencia de Tooltip CTA Login que lo importa sin usarlo).


Detección del tipo de usuario

El script lee el mismo input que Abandoned Cart para determinar si el usuario está logado:

[name="gtmAbandonedCartUserIsLogged"] → value: "true" / "false"

El resultado condiciona los selectores del email y teléfono:

CampoUsuario logadoUsuario guest
Email[name="gtmAbandonedCartShippingDataEmail"]#email
Prefijo teléfono(no se lee)#phonePrefix
Teléfono[name="gtmAbandonedCartShippingDataPhone"]#phone
Prefijo telefónico

El prefijo (#phonePrefix) solo se lee para usuarios guest. El valor se normaliza eliminando el + antes de concatenarlo con el número. Para usuarios logados se asume que el campo de teléfono ya incluye el prefijo o que no es necesario.


Algoritmos de hash

FunciónAlgoritmoClaveInputUso
hashEmail(email)HmacSHA512"fuckyouga360"Email normalizadoCookie custom-user-id + evento user-id
hashEmailSHA256(email)SHA256(ninguna)Email normalizadoCookie custom-user-id-256 + evento user-id-256
hashEmailSHA256(phone)SHA256(ninguna)Prefijo + númeroCookie custom-user-ph-256

Ambas funciones normalizan el input con .trim().toLowerCase() antes de hashear. La función hashEmailSHA256 se reutiliza para hashear el teléfono.


Cookies

Las tres cookies se escriben con dominio de nivel superior y duración de 400 días:

Nombre cookieContenidoCuándo se escribe
custom-user-idHmacSHA512 del emailSolo si el hash difiere del valor guardado
custom-user-id-256SHA256 del emailSiempre que el email exista
custom-user-ph-256SHA256 del teléfono (prefijo + número)Solo si el hash difiere del valor guardado

Formato de la cookie:

nombre=valor; path=/; domain=.hawkersco.com; expires=<GMT+400días>

El dominio se calcula como "." + hostname.replace("www.", ""), lo que permite que la cookie sea accesible desde todos los subdominios.


Eventos GTM

Se emite solo si el hash del email ha cambiado respecto al guardado en custom-user-id:

{
event: "user-id",
user_id: "<HmacSHA512 del email>",
user_id256: "<SHA256 del email>"
}

El teléfono no se incluye en ningún evento GTM — solo se almacena en cookie.


Comportamiento idempotente

DatoEvento GTMCookie
Email (hash HmacSHA512 igual al guardado)No se emite user-idNo se sobreescribe custom-user-id
Email (hash HmacSHA512 diferente o nuevo)Se emite user-idSe actualiza custom-user-id
Email (siempre que exista)Se emite user-id-256Se actualiza custom-user-id-256
Teléfono (hash igual al guardado)No hay eventoNo se sobreescribe custom-user-ph-256
Teléfono (hash diferente o nuevo)No hay eventoSe actualiza custom-user-ph-256

Flujo de ejecución

(al cargar el tag)

├─ Lee [name="gtmAbandonedCartUserIsLogged"] → inputUserIsLogged (bool)
├─ Selecciona inputEmailSelector según inputUserIsLogged
├─ Lee $userEmail, $userPhonePrefix (solo guest), $userPhone

├─ userPhoneNumber = prefix.replace("+","") + phone

├─ hashEmail(email) → userEmailHashed (HmacSHA512)
├─ hashEmailSHA256(email) → userEmailSHA256Hashed
├─ hashEmailSHA256(phoneNumber) → userPhoneSHA256Hashed

├─ getCookie("custom-user-id") → currentUserEmailHashedSaved
├─ getCookie("custom-user-ph-256") → currentUserPhoneSHA256HashedSaved

├─ Si userEmailHashed && userEmailHashed ≠ currentUserEmailHashedSaved:
│ ├─ setCookie("custom-user-id", userEmailHashed)
│ └─ dataLayer.push({ event: "user-id", user_id: ..., user_id256: ... })

├─ Si userEmailSHA256Hashed:
│ ├─ setCookie("custom-user-id-256", userEmailSHA256Hashed)
│ └─ dataLayer.push({ event: "user-id-256", user_id256: ... })

└─ Si userPhoneSHA256Hashed && userPhoneSHA256Hashed ≠ currentUserPhoneSHA256HashedSaved:
└─ setCookie("custom-user-ph-256", userPhoneSHA256Hashed)