Ir al contenido

Webhooks Entrantes, Salientes y Firmas

Los webhooks conectan en tiempo real a Matias Impulso con plataformas de mensajería, pasarelas de pago y tus sistemas empresariales externos (ERP, CRM corporativo, n8n, Make o Zapier).

1. Endpoints Oficiales de Webhooks Entrantes

Sección titulada «1. Endpoints Oficiales de Webhooks Entrantes»

Registra estas URLs exactas en las consolas de cada proveedor externo:

Proveedor URL Oficial de Recepción Mecanismo de Autenticidad
WhatsApp Cloud API (WABA) https://api.matiasimpulso.com/whatsapp-business/webhook Reto GET hub.challenge + firma X-Hub-Signature-256 (HMAC-SHA256 sobre rawBody).
Facebook Messenger / Instagram https://api.matiasimpulso.com/facebook/webhook Reto GET hub.challenge + firma X-Hub-Signature-256 (HMAC-SHA256 sobre rawBody).
TikTok Business Messaging https://api.matiasimpulso.com/tiktok/webhook Reto GET de verificación + firma de evento de TikTok Business.
Wompi Bancolombia https://api.matiasimpulso.com/webhooks/wompi Checksum SHA-256 de propiedades de evento + timestamp + secreto de eventos.

2. Webhooks Salientes e Integración con Sistemas Externos

Sección titulada «2. Webhooks Salientes e Integración con Sistemas Externos»

Cuando tus Flujos Visuales (Canvas PRO), Agentes de IA (mediante HTTP Actions) o eventos del sistema notifican a un servidor propio, aplica siempre estas prácticas en tu receptor:

import crypto from 'node:crypto';
import express from 'express';
const app = express();
app.post(
'/webhooks/matias-impulso',
express.raw({ type: 'application/json' }),
(req, res) => {
const signatureHeader = req.header('X-Impulso-Signature') ?? '';
const secret = process.env.IMPULSO_WEBHOOK_SECRET ?? '<YOUR_WEBHOOK_SECRET>';
const expected =
'sha256=' +
crypto.createHmac('sha256', secret).update(req.body).digest('hex');
const isValid =
signatureHeader.length === expected.length &&
crypto.timingSafeEqual(
Buffer.from(signatureHeader),
Buffer.from(expected),
);
if (!isValid) {
return res.status(401).json({ error: 'Invalid webhook signature' });
}
// Responde rápido (< 3 s) y procesa de forma asíncrona e idempotente
res.status(200).json({ received: true });
},
);