Cómo integrar SendPulse con tu bot de WhatsApp en 2026
SendPulse lleva tiempo siendo una opción sólida para automatización de marketing, pero en 2026 su módulo de chatbots para WhatsApp maduró lo suficiente como para que valga la pena integrarlo en proyectos reales de producción. La plataforma te da acceso a la API de WhatsApp Business (vía Meta Cloud API), un constructor visual de flujos, webhooks salientes y una REST API que puedes golpear desde cualquier backend. Este tutorial cubre la integración completa: desde el setup inicial hasta el manejo de webhooks y el disparo de mensajes programáticos.

Requisitos previos
Antes de abrir el editor de código, necesitas tener listo lo siguiente:
- Cuenta SendPulse activa con el plan que incluya chatbots de WhatsApp (el plan gratuito tiene límites duros de contactos y mensajes al mes).
- Número de WhatsApp Business verificado y vinculado a una cuenta de Meta Business Manager. Si todavía usas un número personal, para. Ese camino lleva a bans.
- API Key de SendPulse: la encuentras en
Settings > APIdentro del dashboard. - Client ID y Client Secret del mismo lugar, necesarios para OAuth2.
- Servidor con HTTPS para recibir webhooks. Sin SSL válido, Meta rechaza el endpoint. Localmente puedes usar ngrok para desarrollo, pero nunca lo mandes a producción así.
- Node.js 20+ o Python 3.11+ para los ejemplos de este tutorial.
Paso 1: Autenticarte contra la API de SendPulse
SendPulse usa OAuth2 con token de acceso de corta duración. Cada token dura 3600 segundos, así que necesitas un mecanismo de refresco.
// auth.js — Node.js
const axios = require('axios');
const SP_CLIENT_ID = process.env.SP_CLIENT_ID;
const SP_CLIENT_SECRET = process.env.SP_CLIENT_SECRET;
let accessToken = null;
let tokenExpiry = 0;
async function getAccessToken() {
if (accessToken && Date.now() < tokenExpiry) return accessToken;
const res = await axios.post('https://api.sendpulse.com/oauth/access_token', {
grant_type: 'client_credentials',
client_id: SP_CLIENT_ID,
client_secret: SP_CLIENT_SECRET,
});
accessToken = res.data.access_token;
tokenExpiry = Date.now() + (res.data.expires_in - 60) * 1000; // margen de 60s
return accessToken;
}
module.exports = { getAccessToken };
Advertencia de producción: nunca hardcodees las credenciales. Usa variables de entorno o un gestor de secretos como AWS Secrets Manager o HashiCorp Vault. Si las subes a git, las rotan antes de que termines de leer este párrafo.
Paso 2: Configurar el flujo de chatbot en SendPulse
En el dashboard de SendPulse:
- Ve a
Chatbots > Manage Botsy selecciona o crea tu bot de WhatsApp. - En el constructor visual, crea un flujo de bienvenida que se dispare con la palabra clave
/starto con cualquier mensaje entrante si es tu primer contacto. - Agrega un nodo de tipo "Send message" con el saludo inicial.
- Agrega un nodo "Action" para guardar variables del contacto (nombre, preferencias, lo que necesites).
- Al final del flujo principal, agrega un nodo "Webhook" apuntando a tu endpoint. Así SendPulse te avisa cada vez que un usuario llega a ese punto del flujo.
El nodo Webhook en SendPulse envía un POST con payload JSON que incluye el contact ID, el bot ID y las variables que hayas capturado en el flujo.
Paso 3: Recibir y procesar el webhook de SendPulse
// webhook.js — Express
const express = require('express');
const router = express.Router();
router.post('/sendpulse/webhook', express.json(), async (req, res) => {
const { contact_id, bot_id, variables } = req.body;
if (!contact_id || !bot_id) {
return res.status(400).json({ error: 'Payload incompleto' });
}
console.log(`Contacto recibido: ${contact_id} desde bot ${bot_id}`);
console.log('Variables:', variables);
// Aquí va tu lógica de negocio:
// - Guardar en DB
// - Disparar una acción externa
// - Responder con un mensaje programático
res.status(200).json({ status: 'ok' });
});
module.exports = router;
Advertencia de producción: SendPulse espera un 200 OK rápido. Si tu lógica tarda más de 5 segundos, el webhook se marca como fallido y SendPulse puede reintentar. Responde inmediatamente y procesa en background con una cola (Bull, BullMQ, o lo que uses).
Paso 4: Enviar mensajes programáticamente desde tu backend
Cuando necesitas iniciar una conversación o mandar un mensaje fuera de un flujo (por ejemplo, una notificación de pedido), usas el endpoint de mensajes de SendPulse.
// sendMessage.js
const axios = require('axios');
const { getAccessToken } = require('./auth');
async function sendWhatsAppMessage(contactId, message) {
const token = await getAccessToken();
const payload = {
contact_id: contactId,
messages: [
{
type: 'text',
message: {
text: message,
},
},
],
};
const res = await axios.post(
'https://api.sendpulse.com/whatsapp/contacts/sendByContact',
payload,
{
headers: {
Authorization: `Bearer ${token}`,
'Content-Type': 'application/json',
},
}
);
return res.data;
}
module.exports = { sendWhatsAppMessage };
Para mensajes con plantillas (templates aprobados por Meta), el tipo cambia a template y debes incluir el nombre de la plantilla y los parámetros. Las plantillas son obligatorias para iniciar conversaciones fuera de la ventana de 24 horas de WhatsApp Business.
Paso 5: Manejar la ventana de 24 horas correctamente
Este es el punto donde la mayoría de los proyectos tropieza en producción. WhatsApp Business API tiene una ventana de sesión de 24 horas contada desde el último mensaje del usuario. Dentro de esa ventana puedes mandar texto libre. Fuera de ella, solo templates aprobados.
Estrategia recomendada:
// sessionManager.js
const sessions = new Map(); // En producción: Redis
function updateSession(contactId) {
sessions.set(contactId, Date.now());
}
function isInSession(contactId) {
const lastMessage = sessions.get(contactId);
if (!lastMessage) return false;
return (Date.now() - lastMessage) < 23 * 60 * 60 * 1000; // 23h de margen
}
module.exports = { updateSession, isInSession };
Cuando recibes un webhook de mensaje entrante, llamas updateSession(contactId). Antes de enviar un mensaje libre, verificas isInSession(contactId). Si no hay sesión activa, usas un template.
Advertencias finales para producción
- Rate limits: SendPulse y Meta tienen límites de mensajes por segundo y por día según el tier de tu cuenta de WhatsApp Business. Implementa un rate limiter en tu cola de envíos.
- Logs estructurados: loguea cada webhook recibido y cada mensaje enviado con timestamps y contact IDs. Cuando algo falle en producción (y va a fallar), los logs son lo único que te salva.
- Manejo de errores en webhooks: si tu endpoint regresa algo que no es 2xx, SendPulse reintenta. Asegúrate de que tu lógica sea idempotente para no procesar el mismo evento dos veces.
- Ambiente de pruebas: SendPulse tiene un sandbox limitado. Para pruebas más completas, crea un bot separado conectado a un número de prueba de Meta.
- Monitoreo: integra alertas en Grafana, Datadog o lo que uses. Un bot caído a las 2am que nadie detecta hasta las 9am es un desastre de soporte.
Con esto tienes una integración funcional y lista para escalar. El ecosistema de automatización en WhatsApp en 2026 es maduro, las herramientas están ahí, y SendPulse es una opción viable si no quieres lidiar directamente con la Cloud API de Meta desde cero.