Producto
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.
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.
Enfoque | Pasos | Volumen de inscripciones | Calidad | Cumplimiento de normativa |
---|---|---|---|---|
Opt in sencillo | Un paso | Más alto | Menor (erratas, bots) | Básico |
Opt in doble | Dos pasos | Mayor | Mucho más alta | Preparado para el RGPD |
Al final de esta guía habrás implementado:
Antes de empezar asegúrate de que tienes:
Así es como funciona el flujo de opt in doble:
Aquí tienes una guía paso a paso para utilizar la API de email de Mailjet.
Empieza por validar y almacenar la solicitud de suscripción inicial:
// 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
});
La seguridad es fundamental. Nunca utilices MD5 o hashes sencillos. En lugar de eso aplica una seguridad de token adecuada:
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}`;
Utiliza la API de envío v3.1 de Mailjet para enviar el correo electrónico de confirmación. Tienes dos opciones:
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"
}
}
]
}'
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=..."}
}
]
}'
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");
}
});
Una vez verificado el token, añade el contacto a tu lista de Mailjet:
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"
}'
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
}'
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.
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.
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:
He aquí algunas de las mejores prácticas más comunes.
Almacena la siguiente información para cumplir con el RGPD:
¿Tienes más preguntas sobre este proceso? Consulta nuestras preguntas frecuentes.
Sí. Crea un punto de conexión de tipo «resend» que invalide el token antiguo y emita uno nuevo con una nueva caducidad.
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.
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.
El Editor de formularios es excelente para crear rápidamente. Utiliza este enfoque con la API para experiencias personalizadas a gran escala.
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.