Cómo enviar eventos de AppBO a tu propio endpoint: forma de los datos, verificación de firma, reintentos y manejo idempotente.
Trae tus herramientas a una llamada: lo conectamos, probamos cada campo en ambas direcciones y te lo entregamos documentado.
Agenda una llamadaUn webhook saliente es la plataforma avisándole a tu sistema que algo pasó. De un lado está AppBO, que emite eventos cuando se crean contactos, las oportunidades cambian de etapa, se reservan o cancelan citas, se envían formularios, llegan mensajes o se liquidan pagos. Del otro lado hay un endpoint HTTP que tú controlas y operas. Una ruta en tu aplicación, una función serverless, un receptor respaldado por una cola, o el gancho de captura (catch hook) de una plataforma de automatización haciendo ese papel.
Los webhooks salientes existen para que nunca tengas que consultar de forma periódica. Consultar así es caro, tarda en notar los cambios y gasta el presupuesto de API de la cuenta solo para enterarse de que no pasó nada. Un webhook envía el cambio a los pocos segundos de que ocurre, y esa es la diferencia entre un espejo casi en tiempo real y un proceso de conciliación nocturno. Para cualquier cosa que vea el usuario. Un panel, una notificación, un acceso que tiene que activarse en el momento en que entra un pago. Esa diferencia de latencia es toda la función.
Hay dos formas de emitirlos. La configuración de webhooks a nivel de cuenta envía un conjunto definido de eventos de la plataforma a una URL para todo lo que pasa en esa cuenta. Un paso de flujo de trabajo, en cambio, dispara un webhook solo para los contactos que llegaron a ese punto de ese flujo, con datos (payload) que tú mismo armas. El primero es una fuente sistemática; el segundo es una señal precisa con la forma de tu lógica de negocio. La mayoría de las integraciones maduras usan los dos: la fuente sistemática para mantenerse sincronizadas, y los webhooks de flujos de trabajo para el puñado de momentos que importan.
2xx significa aceptado y detiene los reintentos. 4xx significa que no vale la pena reintentar, lo cual es correcto para datos que nunca vas a poder procesar. 5xx significa que se vuelva a intentar.500 a propósito y confirma que ves el comportamiento de reintento que esperabas, para saber cómo se va a ver una caída real.Escenario: tu sistema de facturación tiene que dar acceso en el momento en que una oportunidad llega a la etapa Ganada en AppBO.
POST /hooks/appbo detrás de HTTPS. El manejador valida, pone el cuerpo en una cola y devuelve 202. La mediana del tiempo de respuesta es de menos de cincuenta milisegundos.Ganada del pipeline de ventas, y que termina en una acción de webhook.event_type, event_id, occurred_at, contact_id, email, opportunity_id y plan_code tomado de un campo personalizado.Ganada. Tus registros muestran el cuerpo crudo. Armas el intérprete a partir de ese cuerpo, no de tus notas.Ganada. El flujo se dispara en segundos.202.event_id y no encuentra ningún registro previo de ella.email, encuentra la cuenta, activa el acceso para plan_code y escribe el event_id en su tabla de eventos procesados dentro de la misma transacción.202, así que reintenta el evento. El worker calcula la misma clave de idempotencia, ve que ya se procesó y devuelve éxito sin volver a tocar el acceso.Aquí la restricción suele estar de tu lado, no del de la plataforma. Una acción masiva, una importación de contactos, una actualización masiva de un pipeline, un flujo de trabajo que mete a miles de contactos a la vez: produce una ráfaga equivalente de entregas de webhooks. Dimensiona tu receptor para la ráfaga, no para el promedio, y pon una cola delante para que un pico se convierta en trabajo pendiente y no en eventos perdidos. Del lado de la plataforma, ten en cuenta que un paso de webhook en un flujo de trabajo consume ejecuciones del flujo como cualquier otro paso.
La entrega es de al menos una vez. Cualquier respuesta que no sea 2xx, y cualquier respuesta tan lenta que se agote por tiempo, dispara un reintento con un calendario de espera creciente, y como un tiempo agotado puede llegar después de un procesamiento exitoso, los duplicados son parte de la operación normal y no una anomalía. Elimina duplicados por un identificador de evento, y haz que los efectos del procesamiento sean idempotentes por sí mismos: otorgar un acceso en lugar de incrementar un contador, actualizar o crear (upsert) en lugar de insertar. Devuelve 4xx para los datos que nunca vas a poder procesar, para que la plataforma deje de reintentar, y reserva 5xx para las fallas que de verdad son temporales.
La forma de los datos es distinta entre los eventos a nivel de cuenta y los pasos de webhook de flujos de trabajo, así que el código escrito para uno no va a interpretar el otro. Los campos personalizados pueden aparecer identificados por su identificador y no por su nombre. Los valores vacíos pueden llegar como una cadena vacía, como null o como una clave ausente: maneja los tres casos. Nunca des por hecho que un campo viene porque venía en tu muestra, y nunca falles de golpe por un campo que no esperabas.
La falla clásica es un webhook que crea un registro en tu sistema con cada entrega. Dos reintentos se convierten en tres clientes. Basa cada escritura en algo estable de los datos, y trata la creación como un upsert.
Usa endpoints separados para cada entorno, y nunca registres una URL de staging en una cuenta de producción. Un worker de staging conectado a eventos de producción puede enviarles emails reales a clientes reales desde una plantilla a medio terminar. Mantén la lista de registros como un documento revisado, porque los endpoints viejos que nadie administra son un problema de seguridad silencioso.
Los secretos compartidos se rotan, y la rotación tiene que pasar en dos lugares a la vez. Acepta el secreto viejo y el nuevo durante un periodo de traslape y después elimina el viejo. Si verificas una firma de la plataforma, fíjate al algoritmo y al encabezado documentados, y vuelve a leer la documentación de webhooks antes de suponer que nada cambió después de una actualización de la plataforma.
Conectamos la integración, mapeamos los campos, probamos ambas direcciones y te la entregamos con los procedimientos (SOP) que tu equipo necesita para operarla.
Agenda una llamada