SMS 5 min de lectura

Webhooks SMS: Recibe Notificaciones en Tiempo Real

Aprende a configurar webhooks para recibir notificaciones instantáneas sobre estados de entrega y respuestas.

Los webhooks SMS te permiten recibir notificaciones instantáneas cuando ocurren eventos específicos: entrega de mensajes, fallos, respuestas de usuarios y más. Es esencial para automatizar procesos y mejorar la experiencia del cliente.

¿Qué son los Webhooks SMS?

Los webhooks son notificaciones automáticas que se envían a tu servidor cuando ocurre un evento específico. En lugar de consultar constantemente el estado de tus mensajes (polling), los webhooks te notifican al instante.

Con webhooks puedes construir flujos automatizados: confirmar entrega, detectar respuestas, manejar errores y más.

Eventos Disponibles

Puedes suscribirte a los siguientes eventos:

message_sent

El mensaje fue enviado exitosamente desde nuestros servidores.

message_delivered

El mensaje fue entregado al teléfono del destinatario.

message_failed

El mensaje no pudo ser entregado. Incluye código de error.

message_received

El usuario respondió al mensaje recibido (SMS bidireccional).

Cómo Configurar Webhooks

Sigue estos pasos para configurar tu webhook:

  1. 1

    1. Crea tu Endpoint

    Crea una URL pública en tu servidor que pueda recibir requests POST. Debe responder con código 200 OK.

  2. 2

    2. Registra tu Webhook

    Desde el panel de LETEL, registra la URL de tu webhook y selecciona los eventos a los que quieres suscribirte.

  3. 3

    3. Verifica la Firma

    Cada request incluye una firma HMAC-SHA256. Verifica esta firma para asegurar que proviene de LETEL.

  4. 4

    4. Procesa los Eventos

    Tu servidor debe procesar el payload JSON y retornar código 200 dentro de 30 segundos.

Estructura del Payload

Ejemplo de payload recibido:

{
  "event": "message_delivered",
  "messageId": "sms_1234567890",
  "phone": "+56912345678",
  "status": "delivered",
  "timestamp": "2026-03-01T10:05:00Z",
  "operator": "entel"
}

Casos de Uso

Confirmación de Entrega

Actualiza el estado de tus pedidos o transacciones cuando el SMS se entrega.

Respuestas de Clientes

Recibe y procesa las respuestas de tus clientes para crear conversaciones bidireccionales.

Manejo de Errores

Detecta fallos y reintenta el envío o notifica a tu equipo de soporte.

Analítica en Tiempo Real

Construye dashboards con métricas de entrega, tiempos de respuesta y más.

Seguridad

Siempre verifica la firma del webhook para asegurar que las solicitudes provienen de LETEL. No proceses requests sin firma válida.

Importante

Tu endpoint debe responder en menos de 30 segundos. Implementa una cola asíncrona para procesamiento pesado.

Implementación de Servidor Webhook con Express

Aquí mostramos cómo crear un servidor Express completo que recibe webhooks de SMS y los procesa correctamente:

const express = require('express');
const crypto = require('crypto');
require('dotenv').config();

const app = express();
app.use(express.json());

// Logger para debugging
function logWebhook(event, data) {
  const timestamp = new Date().toISOString();
  console.log(`[${timestamp}] WEBHOOK_${event}:`, JSON.stringify(data, null, 2));
}

// Verificar firma del webhook (seguridad)
function verifyWebhookSignature(payload, signature) {
  const secret = process.env.LETEL_WEBHOOK_SECRET;
  const hash = crypto
    .createHmac('sha256', secret)
    .update(JSON.stringify(payload))
    .digest('hex');
  return hash === signature;
}

// Endpoint para recibir webhooks
app.post('/webhooks/sms', (req, res) => {
  try {
    const signature = req.headers['x-letel-signature'];
    const payload = req.body;

    // Verificar autenticidad del webhook
    if (!verifyWebhookSignature(payload, signature)) {
      logWebhook('SIGNATURE_FAILED', { signature, messageId: payload.messageId });
      return res.status(401).json({ error: 'Signature inválido' });
    }

    logWebhook('RECEIVED', payload);

    // Procesar diferentes eventos
    switch (payload.event) {
      case 'message_delivered':
        handleMessageDelivered(payload);
        break;
      case 'message_failed':
        handleMessageFailed(payload);
        break;
      case 'message_bounced':
        handleMessageBounced(payload);
        break;
      case 'sms_received':
        handleSmsReceived(payload);
        break;
      default:
        console.warn('Evento desconocido:', payload.event);
    }

    // Responder rápidamente al webhook
    res.json({ received: true });

  } catch (error) {
    logWebhook('ERROR', { error: error.message });
    res.status(500).json({ error: 'Error procesando webhook' });
  }
});

// Handlers para cada tipo de evento
function handleMessageDelivered(payload) {
  // Actualizar estado en base de datos
  console.log(`✓ SMS ${payload.messageId} entregado a ${payload.phone}`);
  // db.update('messages', { messageId: payload.messageId }, { status: 'delivered' });
}

function handleMessageFailed(payload) {
  console.error(`✗ SMS ${payload.messageId} falló: ${payload.error}`);
  // Reintentar o notificar al usuario
}

function handleMessageBounced(payload) {
  console.warn(`⚠ SMS ${payload.messageId} rechazado: ${payload.reason}`);
  // Marcar número como inválido
}

function handleSmsReceived(payload) {
  console.log(`← SMS recibido de ${payload.phone}: ${payload.message}`);
  // Procesar respuesta del usuario
}

app.listen(3000, () => {
  console.log('Webhook server escuchando en puerto 3000');
});

Debugging y Monitoreo de Webhooks

Durante el desarrollo, necesitas ver exactamente qué webhooks recibes. Aquí te mostramos herramientas y técnicas para debugging:

// 1. Logger detallado para debugging
class WebhookLogger {
  static logReceived(payload) {
    console.log('\n=== WEBHOOK RECIBIDO ===');
    console.log('Evento:', payload.event);
    console.log('Teléfono:', payload.phone);
    console.log('Message ID:', payload.messageId);
    console.log('Status:', payload.status);
    console.log('Timestamp:', payload.timestamp);
    if (payload.message) console.log('Mensaje:', payload.message);
    console.log('===========================\n');
  }

  static logProcessed(event, result) {
    console.log(`[${new Date().toISOString()}] Processed ${event}: ${JSON.stringify(result)}`);
  }
}

// 2. Testing con webhooks simulados
async function testWebhook() {
  const testPayload = {
    event: 'message_delivered',
    messageId: 'test-1234567890',
    phone: '+56912345678',
    status: 'delivered',
    timestamp: new Date().toISOString(),
    operator: 'entel'
  };

  console.log('Enviando webhook de prueba...');
  try {
    const response = await fetch('http://localhost:3000/webhooks/sms', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'x-letel-signature': 'test-signature'
      },
      body: JSON.stringify(testPayload)
    });
    console.log('Respuesta:', await response.json());
  } catch (error) {
    console.error('Error en test:', error.message);
  }
}

// 3. Usar curl para testing (desde terminal)
// curl -X POST http://localhost:3000/webhooks/sms \
//   -H "Content-Type: application/json" \
//   -H "x-letel-signature: test-sig" \
//   -d '{
//     "event": "message_delivered",
//     "messageId": "msg-123",
//     "phone": "+56912345678",
//     "status": "delivered"
//   }'

// 4. Servicio de monitoreo en tiempo real
class WebhookMonitor {
  constructor() {
    this.events = [];
    this.stats = {
      delivered: 0,
      failed: 0,
      bounced: 0,
      received: 0
    };
  }

  track(payload) {
    this.events.push({
      ...payload,
      receivedAt: new Date()
    });

    if (payload.event === 'message_delivered') this.stats.delivered++;
    else if (payload.event === 'message_failed') this.stats.failed++;
    else if (payload.event === 'message_bounced') this.stats.bounced++;
    else if (payload.event === 'sms_received') this.stats.received++;
  }

  getStats() {
    return {
      totalEvents: this.events.length,
      stats: this.stats,
      lastEvents: this.events.slice(-5)
    };
  }
}

// Usar en la app
const monitor = new WebhookMonitor();

app.get('/debug/stats', (req, res) => {
  res.json(monitor.getStats());
});

Recibe notificaciones webhook en tiempo real con LETEL

Integra los webhooks de LETEL en tu sistema para obtener actualizaciones instantáneas sobre el estado de tus SMS. Eventos verificados con firma HMAC-SHA256 para máxima seguridad.

  • Notificaciones en tiempo real (entregado, fallido, rechazado)
  • Verificación de seguridad con HMAC-SHA256
  • Reintentos automáticos de webhooks fallidos
  • Dashboard para monitorear eventos en vivo

Conclusión

Los webhooks son esenciales para construir integraciones robustas con SMS. Te permiten recibir información en tiempo real y automatizar respuestas basadas en eventos.

Preguntas Frecuentes sobre Webhooks SMS

¿Qué es un webhook de SMS?
Es una notificación automática que se envía a tu servidor cuando ocurre un evento con un mensaje SMS, como entrega o fallo.
¿Necesito un servidor propio para webhooks?
Sí, necesitas una URL pública HTTPS que pueda recibir requests POST. Puedes usar servicios como ngrok para desarrollo.
¿Los webhooks tienen costo adicional?
No, los webhooks son parte del servicio. Solo pagas por los mensajes SMS enviados.
¿Qué pasa si mi servidor no responde?
Realizamos reintentos automáticos durante 24 horas. Asegúrate de retornar 200 OK rápidamente.
¿Puedo tener múltiples webhooks?
Sí, puedes registrar múltiples URLs para diferentes tipos de eventos.
LE

LETEL

Expertos en telecomunicaciones y automatización empresarial

Compartir:

🚀 Próximas Acciones

Para complementar tu implementación de webhooks:

¿Necesitas ayuda con webhooks?

Nuestro equipo puede ayudarte a configurar webhooks para tu caso de uso.