Inicio / Blog / Fiabilidad de webhooks
Fiabilidad backend e integraciones SaaS

Webhooks confiables: la arquitectura discreta detrás del SaaS moderno

Un webhook es un mensaje HTTP asíncrono, no una llamada de función garantizada. El emisor puede reintentar, los eventos llegan tarde o desordenados, el endpoint puede caer y un handler lento provoca otra entrega. Una integración sólida asume duplicados y hace cada paso visible y recuperable.

Confirma solo tras aceptar de forma duradera

Autentica al recibir, persiste la entrega y procesa en segundo plano
1 / RecibirLimita el cuerpo y conserva los bytes originales.
2 / VerificarComprueba firma, hora e identidad del endpoint.
3 / PersistirGuarda ID de entrega y payload de forma duradera.
4 / AcusarDevuelve 2xx tras aceptar de forma segura.
5 / ProcesarWorker idempotente, retries, alertas y replay.

No ejecutes todo el flujo de negocio antes del acuse. GitHub, por ejemplo, espera 2xx en hasta 10 segundos y recomienda una cola asíncrona para trabajo largo. El plazo depende del proveedor: revisa el contrato de entrega y reintentos de cada integración.

La entrada es una frontera de seguridad

Usa HTTPS y verifica la firma sobre el cuerpo bruto exacto antes de analizarlo o cambiar estado. Guarda el secreto en un gestor, compara MAC en tiempo constante y planifica rotación controlada. Si la firma incluye timestamp, valida su ventana. La allowlist de IP es defensa adicional, no sustituto de firma; las direcciones pueden cambiar.

Limita tamaño, tipo de contenido, secreto por endpoint y eventos aceptados. No pongas secretos en URLs. Una firma válida acredita emisor e integridad, no que todos los campos sean seguros ni que el evento corresponda al cliente adecuado.

Separa identidad de entrega y de negocio

IdentificadorUsoNo supongas
ID de entrega del proveedorDeduplicar reintentos de transporte y rastrear soporte.Que siempre identifique la acción de negocio entre proveedores.
Objeto/versión de negocioValidar transición y versión de origen.Que eventos lleguen en orden de creación.
ID interno de procesoRelacionar intento, efectos y logs.Que un reintento sea un evento nuevo.

Guarda el ID de entrega con restricción de unicidad. Algunos emisores conservan el mismo ID al reentregar manualmente; registra intentos aparte si soporte lo necesita. Eventos distintos pueden representar una misma acción, por lo que la idempotencia también pertenece a la operación de negocio.

Usa inbox transaccional y efectos idempotentes

Persiste la entrega antes de responder éxito. Una outbox transaccional o dispatcher recuperable evita perder trabajo si el proceso cae entre el commit y la publicación en cola. El consumidor registra el estado y hace idempotentes los efectos externos: pasa clave a pagos/correo/CRM cuando se admita o usa un ledger local. La transacción SQL no vuelve atómica una llamada HTTP independiente.

Reintentos acotados y fallos visibles

Reintenta errores transitorios de red, rate limit y dependencias con backoff exponencial y jitter; respeta Retry-After cuando aplique. No repitas indefinidamente errores permanentes de esquema o permisos. Tras un límite, mueve el mensaje a dead letter/cuarentena con motivo, intentos y fechas. Alerta por edad de cola y fallos repetidos; una DLQ desatendida solo esconde el fallo.

Espera eventos desordenados

Usa versiones de origen, fecha de actualización o reglas de dominio si el orden importa. Consulta el estado actual de origen en transiciones críticas si el contrato lo permite. No apliques una cancelación antigua sobre una reactivación reciente porque llegó después. Conserva hora del evento, recepción y procesamiento para diagnosticar retrasos.

Incluye replay y conciliación operativa

El operador necesita buscar por ID, cliente, tipo, objeto y fecha; revisar verificación y procesamiento; reintentar sin duplicar efectos y comparar estado con el origen. Replay conserva la identidad original y registra un nuevo intento. Oculta datos personales en logs y define retención de payloads. La conciliación detecta eventos que nunca llegaron o agotaron sus reintentos.

Prueba los caminos de fallo

Prueba firma inválida, cuerpo alterado, duplicados, dependencias lentas, caída de base/cola, crash después del commit, rate limit, redelivery, orden invertido y payload problemático. Comprueba que el acuse ocurre tras aceptación duradera y que repetir no repite efectos. Usa sandbox y herramientas del proveedor antes de producción.

En resumen

Los webhooks confiables combinan entrada autenticada breve, aceptación duradera, acuse rápido, procesamiento asíncrono idempotente, reintentos limitados, dead letters visibles y replay seguro. Esta arquitectura discreta evita que pagos, provisión y estado del cliente dependan de una única petición HTTP en el instante perfecto.

Referencias