Producto

Cómo configurar el opt in doble a través de la API de Mailjet (de forma segura y listo para el RGPD)

Este artículo de blog te mostrará cómo crear un formulario de inscripción de opt in doble o vincular uno ya existente con Mailjet a través de la API.
Imagen paraCómo configurar el opt in doble a través de la API de Mailjet (de forma segura y listo para el RGPD)
octubre 3, 2025

Esta completa guía te acompañará en la creación de un flujo de suscripción de opt in doble (DOI) seguro y adaptable utilizando la API de email v3.1 de Mailjet.

Aprenderás a implementar enlaces de confirmación firmados, plantillas de email, webhooks y sincronización de contactos para crear un sistema de suscripción conforme al RGPD que mejore la entregabilidad y las interacciones de los usuarios.

¿Qué es el opt in doble y por qué es importante?

El opt in doble es un proceso de inscripción en dos pasos en el que los usuarios primero envían tu formulario y luego confirman su suscripción mediante un enlace enviado a su bandeja de entrada de emails. Solo después de esta confirmación se añaden a tu lista de correos.

Ventajas clave del opt in doble

  • Mayor entregabilidad: Elimina errores tipográficos, bots y cuentas asignadas a roles antes de que afecten a tu reputación como remitente.
  • Menor tasa de quejas: Solo los suscriptores confirmados activamente reciben emails, lo que reduce las denuncias por spam.
  • Documentación clara del consentimiento: Proporciona marcas de tiempo, direcciones IP y tokens como prueba del consentimiento.
  • Mejores interacciones: Los suscriptores confirmados suelen mostrar tasas de apertura y clics mucho más altas.

Comparación entre el opt in sencillo y el opt in doble

EnfoquePasosVolumen de inscripcionesCalidadCumplimiento de normativa
Opt in sencilloUn pasoMás altoMenor (erratas, bots)Básico
Opt in dobleDos pasosMayorMucho más altaPreparado para el RGPD

Qué crearás

Al final de esta guía habrás implementado:

  • Mailjet Send API v3.1 para emails de confirmación y bienvenida.
  • Recursos de contactos y listas de Mailjet para la gestión de suscriptores.
  • API de eventos de Mailjet (webhooks) para seguimiento en tiempo real.
  • Confirmación segura basada en tokens con protección contra repetición.

Requisitos previos

Antes de empezar asegúrate de que tienes:

  • Una cuenta de Mailjet con sus claves de API y secreta para una autenticación básica.
  • Remitente/dominio verificado para tu dirección From.
  • ID de lista de contactos de Mailjet para suscriptores confirmados.
  • Plantilla de emails de confirmación (a través de la API de plantillas) o contenido en línea.
  • Puntos de conexión del servidor para crear/verificar tokens y gestionar confirmaciones.
  • Opcional: Validación de emails de Mailjet para la validación de formularios.

Visión general de la arquitectura

Así es como funciona el flujo de opt in doble:

  1. El usuario envía el formulario de suscripción (email + propiedades opcionales).
  2. El servidor crea un token firmado de un solo uso y crea la URL de confirmación.
  3. Email de confirmación enviado a través de la API de envíos v3.1 con el enlace de confirmación.
  4. El usuario hace clic en el enlace de confirmación.
  5. El servidor verifica el token y suscribe el contacto a la lista de Mailjet.
  6. Envío opcional de correo electrónico de bienvenida y configuración de webhooks para un seguimiento continuo.

Implementación paso a paso del opt in doble

Aquí tienes una guía paso a paso para utilizar la API de email de Mailjet.

Paso 1: Captar la suscripción

Empieza por validar y almacenar la solicitud de suscripción inicial:

  • Validar el formato del email en el servidor utilizando regex estándar o bibliotecas de validación.
  • Opcional: Llama a la API de validaciones de email de Mailjet para detectar errores obvios.
  • Almacena el registro pendiente en tu base de datos con status=pending y timestamp.
                            

                                // Ejemplo de validación
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (!emailRegex.test(email)) {
  return { error: 'Formato de email no válido' };
}

// Almacenar suscripción pendiente
await db.subscriptions.create({
  email: email,
  status: 'pending',
  created_at: new Date(),
  ip_address: req.ip
});
                            
                        

Paso 2: Crear un enlace de confirmación seguro

La seguridad es fundamental. Nunca utilices MD5 o hashes sencillos. En lugar de eso aplica una seguridad de token adecuada:

Requisitos de los tokens

  • Caducidad de corta duración (30-60 minutos).
  • Un solo uso con protección contra repeticiones.
  • Firmado criptográficamente (HMAC-SHA256 o JWT).
  • Incluir declaraciones: email, issued_at, expires_at, nonce/jti.

Ejemplo de creación de tokens

                            

                                const jwt = require('jsonwebtoken');
const crypto = require('crypto');

function createConfirmationToken(email) {
  const nonce = crypto.randomBytes(16).toString('hex');
  const payload = {
  email: email,
  nonce: nonce,
  iat: Math.floor(Date.now() / 1000),
  exp: Math.floor(Date.now() / 1000) + (60 * 60) // 1 hora
  };

  return jwt.sign(payload, process.env.JWT_SECRET);
}

const token = createConfirmationToken('usuario@ejemplo.com');
const confirmUrl = `https://tuapp.com/confirm?token=${token}`;
                            
                        

Paso 3: Enviar el email de confirmación

Utiliza la API de envío v3.1 de Mailjet para enviar el correo electrónico de confirmación. Tienes dos opciones:

Opción A: Utilizar una plantilla almacenada (recomendado)

En primer lugar, crea tu plantilla en Mailjet y, a continuación, envíala:

                            

                                curl -s -X POST \
  --user "$MJ_APIKEY_PUBLIC:$MJ_APIKEY_PRIVATE" \
  https://api.mailjet.com/v3.1/send \
  -H 'Content-Type: application/json' \
  -d '{
  "Messages":[
 {
  "From":{"Email":"no-reply@tudominio.com","Name":"Tu marca"},
  "To":[{"Email":"destinatario@ejemplo.com","Name":"Destinatario"}],
  "TemplateID": 123456,
  "TemplateLanguage": true,
  "Subject": "Por favor, confirma tu suscripción",
  "Variables": {
  "confirm_url": "https://tuapp.com/confirm?token=...signed...",
  "first_name": "Álex"
 }
 }
  ]
  }'

                            
                        

Opción B: Contenido en línea (Sin plantilla)

                            

                                curl -s -X POST \
  --user "$MJ_APIKEY_PUBLIC:$MJ_APIKEY_PRIVATE" \
  https://api.mailjet.com/v3.1/send \
  -H 'Content-Type: application/json' \
  -d '{
  "Messages":[
 {
  "From":{"Email":"no-reply@tudominio.com","Name":"Tu marca"},
  "To":[{"Email":"destinatario@ejemplo.com"}],
  "Subject":"Confirma tu suscripción",
  "TextPart":"Haz clic aquí para confirmar: {{var:confirm_url}}",
  "HTMLPart":"<p>¡Ya casi está! <a href="%5C%22%7B%7Bvar:confirm_url%7D%7D%5C%22">Confirma tu suscripción</a>.</p>",
  "TemplateLanguage": true,
  "Variables":{"confirm_url":"https://tuapp.com/confirm?token=..."}
 }
  ]
  }'
                            
                        

Paso 4: Gestionar los clics de confirmación

Tu punto de conexión de confirmación debe verificar los tokens de forma segura:

                            

                                app.get('/confirm', async (req, res) => {
  const { token } = req.query;

  try {
  // Verifica la firma y la caducidad del token
  const decoded = jwt.verify(token, process.env.JWT_SECRET);

  // Comprueba si el token ya se ha utilizado
  const existingUse = await db.used_tokens.findOne({  
  token_hash: crypto.createHash('sha256').update(token).digest('hex')  
  });

  if (existingUse) {
  return res.status(400).send('Token ya utilizado");
 }

  // Marcar token como utilizado
  await db.used_tokens.create({
  token_hash: crypto.createHash('sha256').update(token).digest('hex'),
  used_at: new Date()
  });

  // Proceder a la suscripción
  await subscribeToMailjet(decoded.email);

  res.send("¡Suscripción confirmada correctamente!");

  } catch (error) {
  res.status(400).send('Enlace de confirmación caducado o no válido");
 }
});
                            
                        

Paso 5: Suscribir a la lista de Mailjet

Una vez verificado el token, añade el contacto a tu lista de Mailjet:

Crear o actualizar un contacto

                            

                                curl -s -X POST \
  --user "$MJ_APIKEY_PUBLIC:$MJ_APIKEY_PRIVATE" \
  https://api.mailjet.com/v3/REST/contact \
  -H 'Content-Type: application/json' \
  -d '{
  "Email":"destinatario@ejemplo.com",
  "Name":"Nombre del destinatario"
  }'

                            
                        

Añadir a la lista

                            

                                curl -s -X POST \
  --user "$MJ_APIKEY_PUBLIC:$MJ_APIKEY_PRIVATE" \
  https://api.mailjet.com/v3/REST/listrecipient \
  -H 'Content-Type: application/json' \
  -d '{
  "ContactAlt":"destinatario@ejemplo.com",
  "ListID": 123456
  }'

                            
                        

Guardar propiedades de contacto

                            

                                curl -s -X PUT \
  --user "$MJ_APIKEY_PUBLIC:$MJ_APIKEY_PRIVATE" \
  https://api.mailjet.com/v3/REST/contactdata/destinatario@ejemplo.com \
  -H 'Content-Type: application/json' \
  -d '{
  "Data":[
  {"Name":"first_name","Value":"Álex"},
  {"Name":"city","Value":"Ávila"}
  ]
  }'
                            
                        

Nota: Define primero las propiedades personalizadas de los contactos utilizando el punto de conexión contactmetadata si aún no existen.

Paso 6: Enviar email de bienvenida (Opcional)

Después de suscribir correctamente al contacto, envía un mensaje de correo electrónico de bienvenida utilizando el mismo patrón con la API de envíos v3.1 del Paso 3.

Paso 7: Configurar webhooks para el seguimiento de eventos

Configura webhooks para recibir eventos en tiempo real para el mantenimiento continuo de la lista:

                            

                                curl -s -X POST \
  --user "$MJ_APIKEY_PUBLIC:$MJ_APIKEY_PRIVATE" \
  https://api.mailjet.com/v3/REST/eventcallbackurl \
  -H 'Content-Type: application/json' \
  -d '{
  "EventType": "sent",
  "Url": "https://tuapp.com/webhooks/mailjet"
  }'
                            
                        

Sigue estos eventos:

  • sent (enviado), open (apertura), click (cliqueado) para métricas de interacción.
  • bounce (rebote), blocked (bloqueado), spam para problemas de entregabilidad.
  • unsub (bajas) para el cumplimiento normativo y el mantenimiento de la lista.

Mejores prácticas de seguridad y cumplimiento normativo

He aquí algunas de las mejores prácticas más comunes.

Registro de datos para el cumplimiento normativo

Almacena la siguiente información para cumplir con el RGPD:

  • Hora de envío del formulario y dirección IP.
  • Cadena de agente de usuario.
  • Dirección de email introducida.
  • Marca de tiempo de confirmación y dirección IP.
  • ID del token utilizado (nunca el token en bruto).

Recomendaciones de seguridad

  • Nunca utilices MD5: Utiliza HMAC-SHA256 o JWT con la caducidad adecuada.
  • Implementa una limitación de velocidad para evitar las inscripciones automáticas.
  • Añade CAPTCHA para protección adicional contra bots.
  • Verifica tu dominio con registros SPF/DKIM para mejorar la entregabilidad.
  • Almacena solo hashes de tokens: Nunca registres tokens sin procesar.

Solución de problemas y preguntas frecuentes

¿Tienes más preguntas sobre este proceso? Consulta nuestras preguntas frecuentes.

¿Puedo reenviar emails de confirmación?

Sí. Crea un punto de conexión de tipo «resend» que invalide el token antiguo y emita uno nuevo con una nueva caducidad.

¿Y si el contacto ya existe?

Puedes volver a enviar confirmaciones. Al hacer clic, utiliza el punto de conexión listrecipient para asegurarte de que están en la lista correcta.

¿Dónde debo poner el token: en la cadena de consulta o en la ruta?

La cadena de consulta es el lugar más típico y más fácil de analizar. Nunca registres tokens sin procesar en las analíticas.

¿Debería utilizar en su lugar el Editor de formularios de Mailjet?

El Editor de formularios es excelente para crear rápidamente. Utiliza este enfoque con la API para experiencias personalizadas a gran escala.

Recursos adicionales

Con esta implementación, dispondrás de un sistema de opt in doble sólido, seguro y conforme a las normas, que protegerá tu reputación como remitente a la vez que crea una base de suscriptores de alta calidad.

Leer más sobre el opt in doble