Guía: doble opt-in
Recoge una preferencia de correo pendiente, envía un enlace de confirmación y solo escribe GRANTED cuando la persona hace clic.
Algunas normativas (ePrivacy, ciertas interpretaciones del RGPD) exigen opt-in confirmado para el correo de marketing: registra la intención, envía un correo de verificación y activa la suscripción solo cuando se hace clic en el enlace. Esta guía cubre el flujo completo.
Antes de empezar
- Crea un propósito del centro de preferencias con categoría
marketing(p. ej. clavenewsletter). - Crea una clave
sk_para tu servidor. - Ten listo un servicio de correo transaccional — el correo lo envías tú; Croombit proporciona el token.
1. El usuario envía el formulario de registro
En tu servidor, escribe un registro de preferencia pendiente y solicita un token de confirmación de corta duración.
// servidor — clave sk_
const { token, confirmUrl, expiresAt } = await tc.createPreferenceConfirmationToken({
subject: 'email:' + user.email,
values: [{ field: 'newsletter', value: true }],
channel: 'email',
redirectUrl: 'https://acme.com/suscripcion/confirmada',
});- Solo clave secreta — una clave publicable (
pk_) recibe403. Quien tenga el token puede confirmar, así que nunca lo generes en el navegador. redirectUrldebe serhttp(s)en uno de los dominios de tu sitio (o un subdominio); se vuelve a comprobar al hacer clic. Cualquier otro →422 redirect_not_allowed.toopcional: Croombit envía el enlace. Debe ser el correo del propio sujeto (422 recipient_mismatchsi no) y se envían como máximo 3 correos por destinatario y hora (429).
2. Envía el correo de confirmación
Construye el enlace tú mismo y envíalo a través de tu proveedor de correo. El endpoint de confirmación es público — no necesita clave.
const confirmUrl = `https://api.croombit.com/v1/preferences/confirm?token=${token}`;
await mailer.send({
to: user.email,
subject: 'Por favor, confirma tu suscripción',
html: `<a href="${confirmUrl}">Sí, suscríbeme</a>`,
});3. El usuario hace clic
Croombit escribe en la bóveda los valores solicitados como confirmados, dispara el webhook preference.confirmed y redirige al usuario a tu redirectUrl añadiendo ?doi=<estado>. No hay nada más que hacer por tu parte.
getPreferences devuelve { state: "PENDING" } hasta que se confirma. Condiciona cualquier envío a state === "GRANTED" — nunca a PENDING.ttlSeconds, de 5 minutos a 30 días). Si el usuario no hace clic, la preferencia permanece PENDING indefinidamente. Puedes solicitar un token nuevo en cualquier momento.