Qué es
CHANNEL_DISCONNECTED es un evento de cuenta de Omni Z-API: llega al webhook global del workspace (el webhook de plantilla, sin instancia) y avisa que un canal del workspace se ha desconectado, con el motivo en código.
Con él, si integras varios canales ya no necesitas suscribirte a DISCONNECTED canal por canal para enterarte de una caída.
El
DISCONNECTED del webhook de canal no cambia. Su cuerpo, sus reglas y sus formatos (DEFAULT, Z_API y CHATWOOT) siguen iguales, y no trae el código del motivo. Si ya te suscribes a DISCONNECTED en el canal, lo sigues recibiendo como hoy. CHANNEL_DISCONNECTED es un aviso adicional, solo en el webhook global.Cómo suscribirse
IncluyeCHANNEL_DISCONNECTED en events al crear o actualizar el webhook global:
- Solo en el webhook global. El webhook de canal y el webhook predeterminado de instancia rechazan el evento con
422. - Solo en el formato
DEFAULT. El webhook global ya esDEFAULT. - No depende de otros eventos. El mismo webhook puede suscribirse solo a
CHANNEL_DISCONNECTED, o junto con los eventos de plantilla y de facturación. - En el panel, suscribirse al evento requiere el permiso Ver la facturación, el mismo de los eventos de facturación (Owner y Manager, consulta Equipo y roles).
Qué recibe tu servidor
El cuerpo es el evento:El cuerpo nunca trae teléfono, id del número o de la cuenta en el proveedor, token ni credencial. El
reason va tal como lo escribió el proveedor y puede contener el número del canal (por ejemplo, Disconnected from <número> en WhatsApp Web): es el mismo texto que el panel y el DISCONNECTED del canal ya muestran.Origen
El aviso se envía para los tres orígenes. Con
origin USER o BILLING, el reasonCode siempre es null.
Códigos del motivo
Un aviso por desconexión
- Una vez por caída. Las repeticiones de la misma desconexión (reentregas del proveedor, callbacks repetidos) no generan otro aviso. El siguiente aviso sale cuando el canal se reconecta y vuelve a caer, con otro
id. - El código del primer evento. Si un evento posterior de la misma caída trae otro motivo, el panel pasa a mostrar el nuevo, pero el webhook global no recibe otro aviso.
Un aviso por canal
Una cuenta de WhatsApp Business (WABA) puede tener varios canales. Cuando Meta desconecta la cuenta entera (por ejemplo, conPARTNER_REMOVED), sale un aviso por cada canal, cada uno con su propio instanceId, en el webhook global del workspace dueño de cada canal.
Esto es diferente del aviso de restricción de la cuenta (ACCOUNT_RESTRICTION), que sale una vez por WABA, con la lista de canales afectados. La diferencia es intencional: la desconexión es el estado de cada canal, y la restricción es un estado de la cuenta, que no desconecta los canales.
Junto con los eventos de facturación
Cuando la facturación desconecta el canal, el webhook global recibe elCHANNEL_DISCONNECTED con origin BILLING y el evento de facturación de ese camino:
No hay orden garantizado entre el evento de facturación y el
CHANNEL_DISCONNECTED. Cada evento llega solo a quien se suscribió a él.
Buenas prácticas
- El orden no está garantizado. Ordena por
disconnectedAty descarta repeticiones porid. - Automatiza con
reasonCode, nunca con el texto dereason. - Trata
reasonCodenully los códigos desconocidos.
Limitaciones
- El código del motivo aparece solo en este aviso. La lectura del canal por la API (
GET /v1/channels/{id}) no lo trae. - No hay aviso retroactivo. Un canal que ya estaba desconectado cuando el aviso entró en funcionamiento solo genera aviso en su próxima caída, después de reconectarse.
- Algunas desconexiones no pasan por el flujo de eventos del proveedor y no generan aviso: por ejemplo, la desconexión de WhatsApp Web confirmada por el proveedor sin evento de retorno, y el corte por facturación de un canal de WhatsApp Web sin suscripción activa.