Appearance
Outbound — Agente responde desde el CRM
Caso: el agente Juan, logueado en el CRM, abre el tab WhatsApp del contacto y escribe "Ya estamos revisando, dame 5 min".
Secuencia
Agent provisioning on-the-fly
La primera vez que Juan envía algo, el integration-api hace:
SELECT * FROM support_agent_mappings WHERE crm_user_id = 'juan_id'→ vacío.GET /api/v1/users/juan_idal CRM →{email: "juan@semtec.hn", name: "Juan Pérez"}.POST /platform/api/v1/usersen Chatwoot conCHATWOOT_PLATFORM_APP_TOKEN→ crea user + devuelveaccess_token.POST /api/v1/accounts/2/agents→ lo asocia al account como rolagent.INSERT INTO support_agent_mappings→ cache del mapping.
Las siguientes 1000 respuestas de Juan reusan el token cacheado.
Fix del toast espúreo
Antes: el SSE publicaba type=whatsapp_message para TODO (inbound y outbound), y el frontend filtraba por direction. El filtro ocultaba el toast pero el badge del bell igual subía.
Ahora:
publishRealtimeEventdel outbound emitetype=whatsapp_echo.publishRealtimeEventdel inbound emitetype=whatsapp_message.useNotifications.jsignorawhatsapp_echoantes delunshift→ bell no sube, toast no aparece.ContactWhatsApp.vueacepta ambos types para sincronizar el timeline del contacto abierto.
Propagación de identidad
El OutboundJob lleva:
json
{
"sender_type": "crm_agent",
"sender_user_id": "665a…",
"sender_name": "Juan Pérez"
}El gateway persiste esos campos en whatsapp_messages. El mirror a Chatwoot los usa para elegir el token correcto. La UI los usa para renderizar el header de la burbuja outbound.
Siguiente: Outbound desde Chatwoot — el camino inverso.