Workflows con código Node.js
WhatsApp en Pipedream: disparador HTTP, paso Node.js y variables de entorno
Pipedream crea una URL de endpoint propia para cada workflow y te deja escribir pasos en Node.js. Según su documentación (leída el 11/11/2026), el cuerpo JSON llega en steps.trigger.event, las cabeceras quedan en minúsculas y $.respond define la respuesta. Las variables de entorno creadas en Settings se leen con process.env y, por defecto, son secretas.
Actualizado el
Por qué conectar
Sirve para quien quiere lógica de verdad entre el evento y la respuesta sin armar un servidor: recibir el mensaje, consultar una API, llamar a un modelo de IA y responder por ZapZap, todo en pocas líneas. ZapZap conecta números por un canal no oficial: WhatsApp puede limitar o bloquear cualquier número, así que el ritmo, el consentimiento y el calentamiento importan. Cuesta R$15 por número activo al mes, prepago, sin cobro por mensaje, y empiezas con un crédito de bienvenida al verificar el teléfono, sujeto a la campaña vigente.
Paso a paso
- 1
Crea las variables de entorno
En Settings > Environment Variables (o Variables dentro de un proyecto), crea ZAPZAP_API_KEY, ZAPZAP_API_SECRET y ZAPZAP_INSTANCE_ID. La documentación informa que las variables nuevas son secretas por defecto y que el valor no se puede modificar después. Las claves salen de Settings > API en app.zapzapapi.com.
- 2
Crea el workflow con disparador HTTP
Pipedream genera una URL de endpoint solo para el workflow. La documentación advierte que, por defecto, los disparadores HTTP son públicos y no exigen autorización, y que los cuerpos de más de 512 KB devuelven 413.
- 3
Registra la URL en la instancia
Llama a PUT https://api.zapzapapi.com/api/v1/instances/{id}/webhook con webhook_url (la URL del paso anterior) y events (por ejemplo, messages). La respuesta trae el webhook_secret (whsec_). Prueba con POST /instances/{id}/webhook/test y mira la ejecución en Pipedream.
- 4
Responde primero al webhook
Si $.respond nunca se llama, la documentación dice que el endpoint devuelve error 400. Usa $.respond con immediate: true para responder enseguida y dejar que los demás pasos corran después. ZapZap reintenta cuando tu endpoint falla.
- 5
Envía la respuesta en un paso Node.js
Usa el código del ejemplo: process.env para las claves, fetch para POST /{instanceId}/send/text con number y text. Cambia el número fijo por el remitente del evento, leyendo los campos de data del envelope que recibas.
- 6
Protege el endpoint
Como el disparador es público por defecto, valida el origen. ZapZap firma cada entrega en la cabecera X-ZapZap-Signature sobre el cuerpo bruto; la documentación que leí no explica cómo obtener el cuerpo bruto en el disparador, así que confirma esa opción en tu cuenta, o configura el token de autorización que ofrece Pipedream.
Ejemplo
// Pipedream Node.js code step. Environment variables (Settings > Environment Variables): ZAPZAP_API_KEY, ZAPZAP_API_SECRET, ZAPZAP_INSTANCE_ID
export default defineComponent({
async run({ steps, $ }) {
await $.respond({ status: 200, body: "ok", immediate: true }); // answer the webhook first
const base = "https://api.zapzapapi.com/api/v1/" + process.env.ZAPZAP_INSTANCE_ID;
const r = await fetch(base + "/send/text", {
method: "POST",
headers: {
"Content-Type": "application/json",
"x-api-key": process.env.ZAPZAP_API_KEY,
"x-api-secret": process.env.ZAPZAP_API_SECRET,
},
body: JSON.stringify({ number: "5511999999999", text: "Received: " + steps.trigger.event.body.event }),
});
return { status: r.status };
},
});Ilustrativo. Los campos y endpoints exactos están en la documentación.
Límites y puntos de atención de Pipedream (11/11/2026)
| Punto | Qué dice la documentación | Qué hacer |
|---|---|---|
| Autorización del disparador | Público por defecto; token opcional enviado como Bearer | Activa el token o valida la firma |
| Tamaño del cuerpo | Por encima de 512 KB devuelve 413 | Pide a ZapZap solo los eventos que usas |
| Respuesta | Sin $.respond, el endpoint devuelve 400 | Llama a $.respond al inicio |
| Variables | Secretas por defecto; process.env dentro del componente | Lee dentro de run() |
Preguntas frecuentes
¿Pipedream tiene una acción lista de ZapZap?
No que yo haya confirmado. El camino de esta página es el disparador HTTP y un paso en Node.js que llama a la API REST.
¿Cómo leo el cuerpo del webhook?
En steps.trigger.event. Los payloads JSON se convierten en objetos de JavaScript, según la documentación leída el 11/11/2026.
¿Por qué recibo un 400 del endpoint?
Si el workflow no llama a $.respond, el endpoint devuelve 400. Responde al inicio con $.respond.
¿Cómo evito procesar la misma entrega dos veces?
Guarda el delivery_id del envelope e ignora las repeticiones. ZapZap repite la entrega cuando el endpoint no responde con éxito.
¿Cuánto cuesta ZapZap?
Cuesta R$15 por número activo al mes, prepago, sin cobro por mensaje, y empiezas con un crédito de bienvenida al verificar el teléfono, sujeto a la campaña vigente.
Empieza ahora
Crea tu cuenta, conecta un número en minutos y prueba la API con calentamiento y anti-bloqueo. R$15 por número activo/mes, prepago, sin permanencia.
