MessagePublic incluye un campo origin que te dice exactamente quién generó ese mensaje. Es la señal canónica para implementar handoff humano sin que tu bot pise a un agente real.
Valores de origin
Patrón de handoff
Cómo lo aplicás en webhooks
Los eventosmessage.status_changed y message.received traen origin en el payload. Tu bot debería:
message.receivedconorigin: 'inbound'→ procesar normalmente.message.status_changedconorigin: 'panel'→ marcar la conversación como “humano-controlada”, no responder.message.status_changedconorigin: 'external_api'→ confirmación de que tu propio mensaje fue entregado.
Estado por conversación
Si tu CRM mantiene estado por conversación (ej. “bot vs humano”), una buena heurística:- Cuando llega cualquier mensaje saliente con
origin: 'panel', marcá la conversación comobotPaused: true. - Cuando llega un mensaje entrante después de N minutos sin actividad humana, podés re-activar el bot (
botPaused: false).
Origin para mensajes pre-abril 2026 (legacy fallback)
Los mensajes creados antes de que existierametadata.origin tienen el campo derivado en orden de prioridad:
La precisión es alta para los casos comunes. Casos borde:
- Mensaje viejo enviado por API con
sentBypoblado por error → se clasifica comopanel. Workaround: si tu lógica depende del orden de eventos, considerá tambiénmetadata.apiKeyIdcuando esté presente (mensajes nuevos sí lo setean). - Mensaje de history sync que ALSO tenía
sentByAi: true→ clasifica comohistory(ganaba precedencia). Esos mensajes no son reactivos, ignoralos.
metadata.origin siempre se setea explícitamente y este fallback no aplica.
Notas adicionales
metadata.origines la fuente de verdad en DB; el campo públicoorigines la versión canónica que vas a usar.