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:
| Campo | Usuario logado | Usuario guest |
|---|---|---|
[name="gtmAbandonedCartShippingDataEmail"] | #email | |
| Prefijo teléfono | (no se lee) | #phonePrefix |
| Teléfono | [name="gtmAbandonedCartShippingDataPhone"] | #phone |
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ón | Algoritmo | Clave | Input | Uso |
|---|---|---|---|---|
hashEmail(email) | HmacSHA512 | "fuckyouga360" | Email normalizado | Cookie custom-user-id + evento user-id |
hashEmailSHA256(email) | SHA256 | (ninguna) | Email normalizado | Cookie custom-user-id-256 + evento user-id-256 |
hashEmailSHA256(phone) | SHA256 | (ninguna) | Prefijo + número | Cookie 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 cookie | Contenido | Cuándo se escribe |
|---|---|---|
custom-user-id | HmacSHA512 del email | Solo si el hash difiere del valor guardado |
custom-user-id-256 | SHA256 del email | Siempre que el email exista |
custom-user-ph-256 | SHA256 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
- user-id
- user-id-256
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>"
}
Se emite siempre que el email exista (sin comparación con cookie previa):
{
event: "user-id-256",
user_id256: "<SHA256 del email>"
}
El teléfono no se incluye en ningún evento GTM — solo se almacena en cookie.
Comportamiento idempotente
| Dato | Evento GTM | Cookie |
|---|---|---|
| Email (hash HmacSHA512 igual al guardado) | No se emite user-id | No se sobreescribe custom-user-id |
| Email (hash HmacSHA512 diferente o nuevo) | Se emite user-id | Se actualiza custom-user-id |
| Email (siempre que exista) | Se emite user-id-256 | Se actualiza custom-user-id-256 |
| Teléfono (hash igual al guardado) | No hay evento | No se sobreescribe custom-user-ph-256 |
| Teléfono (hash diferente o nuevo) | No hay evento | Se 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)