Webhooks salientes

Mosend dispara webhooks HTTP POST hacia tu URL cada vez que ocurre un evento relevante. Los gestionas desde el dashboard (Configuración → Integraciones → Webhooks) o vía API.

Firma HMAC

Cada request lleva el header X-Mosend-Signature con HMAC SHA-256 del body crudo, usando el secreto que recibiste al crear el webhook. Tu endpoint debe validarlo antes de procesar el evento.

# Node.js — validación del HMAC
import crypto from 'node:crypto';

function verify(body, signature, secret) {
  const expected = 'sha256=' + crypto
    .createHmac('sha256', secret)
    .update(body)
    .digest('hex');
  return crypto.timingSafeEqual(
    Buffer.from(signature),
    Buffer.from(expected),
  );
}

Estructura del payload

{
  "event": "message.new",
  "deliveryId": "0d6f2c9e-...",
  "organizationId": "a1b2c3d4-...",
  "occurredAt": "2026-05-01T03:42:18.123Z",
  "data": {
    "conversationId": "...",
    "message": { "id": "...", "direction": "IN", "type": "text", "payload": {...}, ... }
  }
}

Tu endpoint debe responder 2xx en menos de 10 s. Si falla, Mosend reintenta con backoff exponencial hasta 8 veces (≈30 minutos). Después marca el delivery como FAILED y queda en el log.

Eventos disponibles

EventoCuándo se dispara
message.newLlega un mensaje entrante o se envía uno saliente confirmado por Meta.
message.statusCambio de estado de un mensaje saliente (sent → delivered → read, o failed).
conversation.openedSe abre una nueva conversación.
conversation.closedSe cierra una conversación manualmente.
conversation.assignedSe asigna o reasigna a un agente.
template.statusCambio de estado de plantilla (PENDING → APPROVED/REJECTED) por webhook de Meta.
phone.qualityCambio del quality rating del número (GREEN/YELLOW/RED).
invoice.issuedCierre de período facturado y emisión de factura.
invoice.paidPago confirmado de factura.
invoice.overdueFactura cruzó la fecha de vencimiento sin pagar.
wallet.rechargedRecarga de saldo confirmada por Mercado Pago.

Idempotencia

Cada delivery tiene un deliveryId único. Si recibes el mismo deliveryId dos veces (porque el primero falló pero igual fue procesado por tu lado), debes deduplicar. Mosend reintenta cualquier delivery que no haya recibido respuesta 2xx.