Saltar al contenido principal

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

Incluye CHANNEL_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 es DEFAULT.
  • 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

reasonCode puede ser null. Ocurre cuando el motivo no tiene código, por ejemplo en una caída de sesión de WhatsApp Web, y siempre que origin es USER o BILLING. En esos casos, usa origin y, si lo necesitas, el texto de reason.
Pueden surgir nuevos códigos. La lista puede crecer sin aviso previo. Trata un código que no conoces como un motivo genérico de desconexión, sin romper tu integración.

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, con PARTNER_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 el CHANNEL_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 disconnectedAt y descarta repeticiones por id.
  • Automatiza con reasonCode, nunca con el texto de reason.
  • Trata reasonCode null y 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.