Identidad del visitante

Si tu sitio sabe quién está logueado, podés pasarle al widget de chat-web su correo, nombre y un userId. Mosend salta el formulario de precapture, enlaza la sesión con el contacto correspondiente y muestra el historial previo del usuario aunque vuelva en otro navegador.

¿Por qué firmar la identidad?

Sin firma, cualquier persona que abra DevTools en tu sitio puede llamar a Mosend('identify', { email: 'ceo@otraempresa.com' }) y hacerse pasar por otra persona. Para evitarlo, el navegador manda el dato (email/userId) más un HMAC que solo tu servidor puede calcular. Mosend verifica el HMAC con el secreto compartido — si no coincide, rechaza la identidad.

El secreto vive solo en tu servidor (variable de entorno) y en Mosend (encriptado); nunca lo expones al navegador.

Generar el secreto del canal

  1. Entrá al dashboard de Mosend → Settings → Web Chat → editar tu canal → pestaña Identidad.
  2. Click en Generar secreto. Lo verás una sola vez: copialo y guardalo en tu backend como variable de entorno (ej. MOSEND_IDENTITY_SECRET).
  3. Cuando ya verificaste que tu integración funciona, activá Exigir verificación HMAC. A partir de ese momento, identidades sin firma válida se rechazan con 401.

Rotar el secreto invalida el anterior — re-deployá tu integración con el nuevo.

Server-side: calcular el HMAC

Firmás el userId (o el email si no tenés userId) con HMAC-SHA256 y le pasás el hex al cliente para que lo embeba en la página:

Node.js

import crypto from 'crypto';

const SECRET = process.env.MOSEND_IDENTITY_SECRET!;

function mosendIdentityHash(userId: string): string {
  return crypto.createHmac('sha256', SECRET).update(userId).digest('hex');
}

// En el handler de tu página/SSR:
const hash = mosendIdentityHash(String(currentUser.id));
// → pasalo al template para que window.Mosend lo use

PHP

<?php
$secret = getenv('MOSEND_IDENTITY_SECRET');
$hash   = hash_hmac('sha256', (string) $user->id, $secret);
?>

Python

import hmac, hashlib, os

SECRET = os.environ["MOSEND_IDENTITY_SECRET"].encode()

def mosend_identity_hash(user_id: str) -> str:
    return hmac.new(SECRET, user_id.encode(), hashlib.sha256).hexdigest()

Si no tenés userId, firmá el email con el mismo método. Mosend verifica con el primer dato disponible entre userId y email.

Frontend: usar window.Mosend

Hay dos formas — usá la que mejor encaje con tu stack.

Sitios server-rendered (HTML estático)

Pasá la identidad como data-attrs del script:

<script
  src="https://mosend.dev/chat.js"
  data-channel="wch_..."
  data-user-id="42"
  data-user-email="jane@ejemplo.com"
  data-user-name="Jane Doe"
  data-user-hash="<%= mosendIdentityHash('42') %>">
</script>

SPAs / login dinámico

Llamá a la API después del login:

// Después del login (idealmente con el hash inyectado desde tu backend):
window.Mosend('identify', {
  userId: '42',
  email: 'jane@ejemplo.com',
  name: 'Jane Doe',
  hash: '<HMAC_HEX>',                 // opcional pero recomendado
  attributes: { plan: 'pro' },        // opcional, queda en el contact
});

// Al logout:
window.Mosend('shutdown');

Si tu sitio carga el chat más tarde de lo normal, podés pre-instalar un stub para bufferear llamadas tempranas:

<script>
  window.Mosend = window.Mosend || function () {
    (window.Mosend.q = window.Mosend.q || []).push(arguments);
  };
</script>

Qué hace Mosend con la identidad

  • Busca un Contact con ese email en tu organización. Si existe, lo reutiliza (mismo usuario en otro navegador → mismo hilo).
  • Si no existe, lo crea con el email + nombre que pasaste.
  • Si el visitor ya había escrito como anónimo en este mismo navegador, migra el historial al contact identificado (no perdés conversaciones).
  • Marca identityVerified: true en el visitor cuando el HMAC verifica; false cuando no había firma y el canal lo permite.

Errores comunes

  • 401 — Identidad inválida o sin firma: el canal tiene Exigir verificación HMAC activado pero el hash falta o no coincide. Revisá que estés firmando el userId (mismo string exacto que pasás en identify) con el secreto que generaste.
  • El widget pide nombre/email igual: probablemente el snippet no recibió la identidad — chequeá que window.Mosend exista cuando llamás identify (el script de chat.js debe haber cargado).
  • El usuario ve historial de otra persona: rara vez ocurre — significa que ambos compartieron el mismo visitorId en localStorage (mismo navegador, no se llamóshutdown al logout). Llamá siempre a Mosend('shutdown') al logout para limpiar.