Recibe → verifica → guarda → confirma
- Lee el cuerpo y los encabezados de la solicitud.
- Verifica la clave de API del webhook, el HMAC canónico y la política de marcas de tiempo con el verificador.
- Guarda atómicamente el evento verificado en una bandeja de entrada duradera o confirma que ese evento exacto ya esté almacenado.
- Devuelve una respuesta
2xxrápidamente. Procesa los eventos almacenados en un proceso de trabajo y haz que cada acción de negocio sea idempotente.
2xx para no confirmar el intento de entrega. Un duplicado que ya está guardado debe recibir 2xx nuevamente.
Comportamiento de reintentos
El emisor actual hace hasta tres intentos HTTP para una operación de entrega. Espera un segundo y luego dos segundos antes de los intentos restantes. Cualquier respuesta2xx detiene esos intentos. Una respuesta distinta de 2xx, un fallo de conexión o una excepción de solicitud pueden activar el siguiente intento. El tiempo de espera de socket predeterminado es de 10 segundos por intento: confirma la recepción en pocos segundos en lugar de depender de un margen de 30 segundos.
El cuerpo y los encabezados de firma y marca de tiempo se reutilizan dentro de esa operación de entrega. Esos tres intentos limitan una operación de envío, no el total de entregas de un evento de extremo a extremo. Si un evento vuelve a entregarse en una etapa anterior, puede invocar de nuevo al emisor. Aquí no se promete un número total de reintentos ni un plazo máximo de reenvío. No dependas de un encabezado de respuesta Retry-After para establecer los tiempos de reintento de Bridge.
Si fallan todos los intentos, la entrega se considera fallida. No asumas reintentos automáticos indefinidos ni un endpoint público de reenvío. Para investigar, conserva el espacio de trabajo, el tipo, el ID y la hora aproximada del evento, y contacta a soporte de Bridge. No incluyas las credenciales del webhook en mensajes a soporte ni en registros de la aplicación.
Duplicados e identidad del evento
Tu servicio puede haber guardado un evento aunque Bridge no haya recibido tu respuesta2xx. Reintentarlo no debe crear una segunda actualización del CRM, factura, mensaje u otro efecto de negocio.
Delimita cada registro de la bandeja mediante workspaceId, eventType y eventId. Guarda también un resumen del evento verificado. No asumas que eventId es globalmente único en todas las familias de notificaciones: algunas usan un ID derivado de la entidad. Conserva los cuerpos distintos que compartan un ID y aplica después idempotencia de negocio a la operación que ejecuta tu proceso de trabajo.
El ejemplo siguiente deduplica eventos repetidos exactos usando los tres identificadores y la huella SHA-256 del evento canónico. Es una clave de bandeja para este ejemplo, no un campo nuevo de solicitud de Bridge.
No hagas vencer un registro de deduplicación solo porque transcurrió la ventana de cinco minutos de la marca de tiempo. Ese encabezado no está firmado, por lo que la ventana no establece un vencimiento seguro de protección contra reenvíos. Elige la retención según las necesidades de conciliación de tu negocio y mantén idempotentes las acciones del sistema de destino. El ejemplo no elimina automáticamente los registros de la bandeja.
Receptor duradero mínimo
Agrega estas definiciones al módulobridge_webhooks.py de Verificar solicitudes de webhook. El módulo del verificador ya incluye las importaciones usadas aquí.
processed=0, ejecutar la acción de negocio de manera idempotente y marcarlas como procesadas solo después del éxito. Una confirmación local no demuestra que la acción de negocio haya terminado.
Orden y conciliación
No dependas de un orden global de entrega. Distintas familias de recursos e intentos independientes de entrega pueden intercalarse. Dirige cada evento según eleventType publicado y usa el esquema de esa suscripción.
Cuando un cuerpo incluya sequence, trátalo como una indicación de orden del recurso o flujo, no como un contador global compartido por todos los espacios de trabajo o familias de eventos. No lo inventes para eventos cuyo esquema no tenga secuencia. Conserva las marcas de tiempo y los identificadores de origen, y evita reemplazar un estado nuevo por una notificación anterior. Si la API REST permite leer el recurso, consulta su estado actual cuando el evento deje el resultado incierto; de lo contrario, sigue la guía de la familia de eventos o contacta a soporte.
No exijas un campo version universal en todos los sobres de evento. Para las familias admitidas por este servicio de webhooks, la versión de suscripción configurada selecciona el transformador registrado y el esquema de esa familia. Sigue el esquema documentado de esa familia y suscripción; no deduzcas una propiedad de versión que el sobre no publica.

