SEQ-02
/
INTERACTION_LIFECYCLE
/
4 CASOS CRÍTICOS MVP
Diagramas de Secuencia y Casos de Uso Críticos
Interacción temporal detallada entre Usuarios, Backend Innovia, Base de Datos PostgreSQL, Kapso Platform y la red WhatsApp de Meta.
CASO 01
Conexión de WhatsApp mediante Embedded Signup (Meta via Kapso)
100%
sequenceDiagram
autonumber
actor Admin as Administrador Empresa
participant UI as Dashboard Innovia
participant API as Backend Core Innovia
participant DB as PostgreSQL Innovia
participant Adapter as KapsoAdapter
participant Kapso as Kapso Platform
participant Meta as Meta Embedded Signup
Admin->>UI: Solicita conectar número WhatsApp
UI->>API: POST /api/tenants/:id/phone-numbers/connect
API->>DB: Verifica provider_customer_id
alt Si no existe Customer en Kapso
API->>Adapter: createCustomer(tenant.name, tenant.id)
Adapter->>Kapso: POST /v1/customers
Kapso-->>Adapter: { id: "kps_cus_9981" }
Adapter-->>API: providerCustomerId
API->>DB: UPDATE tenants SET provider_customer_id = 'kps_cus_9981'
end
API->>Adapter: createSetupLink(providerCustomerId)
Adapter->>Kapso: POST /v1/customers/kps_cus_9981/setup_links
Kapso-->>Adapter: { url: "https://onboard.kapso.io/..." }
Adapter-->>API: setupLinkUrl
API-->>UI: 200 OK { setup_url }
UI->>Admin: Abre modal con flujo Embedded Signup de Meta
Admin->>Meta: Inicia sesión, vincula número y autoriza WABA
Meta-->>Kapso: Registra línea y provee token
Kapso->>API: Webhook POST /webhooks/providers/kapso (phone_number.connected)
API->>Adapter: normalizeWebhook(payload)
Adapter-->>API: PhoneConnected Event (e164, waba_id, provider_phone_id)
API->>DB: INSERT INTO phone_numbers (tenant_id, e164, status='ACTIVE', provider_phone_id)
API->>Adapter: syncTemplates(provider_waba_id)
Adapter->>Kapso: GET /v1/templates
Kapso-->>Adapter: Lista de plantillas aprobadas por Meta
Adapter-->>API: Templates normalizados
API->>DB: INSERT INTO templates (...)
API-->>UI: Notificación en tiempo real: Línea activa y plantillas listas
CASO 02
Lanzamiento de Campaña Outbound con Audiencia CSV
100%
sequenceDiagram
autonumber
actor Marketer as Usuario Innovia
participant UI as Dashboard Innovia
participant API as Backend Core Innovia
participant Queue as Redis / BullMQ
participant DB as PostgreSQL Innovia
participant Adapter as KapsoAdapter
participant Kapso as Kapso Platform
Marketer->>UI: Carga CSV, valida columnas y teléfonos E.164
Marketer->>UI: Selecciona Template y mapea variables {{1}}, {{2}}
Marketer->>UI: Define fecha/hora de envío
UI->>API: POST /api/campaigns (name, phone_id, template_id, recipients[])
API->>DB: Guarda campaña (status='SCHEDULED', total_recipients=5000)
API->>DB: Registra mensajes en estado PENDING
API-->>UI: 201 Created { campaign_id: "cmp_456" }
alt Envío Programado
API->>Queue: Encola Job diferido con BullMQ
Queue-->>API: Activa worker al cumplirse la hora
end
API->>DB: UPDATE campaigns SET status='IN_FLIGHT'
API->>Adapter: createAndExecuteBroadcast({ name, providerPhoneId, template, recipients })
Adapter->>Kapso: POST /v1/broadcasts (Batch masivo)
Kapso-->>Adapter: { broadcast_id: "kps_bc_7712", status: "processing" }
Adapter-->>API: providerBroadcastId
API->>DB: UPDATE campaigns SET provider_broadcast_id='kps_bc_7712'
API-->>UI: Progreso en tiempo real de la campaña
CASO 03
Envío Transaccional por API Pública (/v1/messages)
100%
sequenceDiagram
autonumber
participant Ext as Sistema Externo (CRM / ERP)
participant Gateway as API Gateway Innovia
participant API as Backend Core Innovia
participant DB as PostgreSQL Innovia
participant Adapter as KapsoAdapter
participant Kapso as Kapso Platform
Ext->>Gateway: POST /v1/messages (Bearer inn_live_...)
Gateway->>Gateway: Valida firma de API Key y extrae tenant_id
Gateway->>API: Valida saldo y cuota disponible del tenant
alt Saldo insuficiente
API-->>Ext: 402 Payment Required { error: "insufficient_quota" }
end
API->>DB: Inserta Message (status='PENDING', id='msg_uuid')
API->>Adapter: sendTemplateMessage(phone.provider_phone_id, payload)
Adapter->>Kapso: POST /v1/messages
Kapso-->>Adapter: 200 OK { id: "kps_msg_10293", status: "accepted" }
Adapter-->>API: { providerMessageId: "kps_msg_10293", status: "sent" }
API->>DB: UPDATE messages SET provider_message_id='kps_msg_10293', status='SENT'
API-->>Ext: 202 Accepted { id: "msg_uuid", status: "sent" }
CASO 04
Ingesta de Webhooks y Actualización de Métricas en Tiempo Real
100%
sequenceDiagram
autonumber
participant Kapso as Kapso Webhook Engine
participant Receiver as Webhook Receiver (/webhooks/providers/kapso)
participant Normalizer as Event Normalizer
participant DB as PostgreSQL Innovia
participant Rollup as Metrics Rollup
participant OutboundHook as Client Webhook Dispatcher
participant Ext as Webhook del Cliente
Kapso->>Receiver: POST (message.delivered) con firma criptográfica
Receiver->>Receiver: Valida firma HMAC
Receiver-->>Kapso: 200 OK Inmediato
Receiver->>Normalizer: Procesa payload crudo
Normalizer->>Normalizer: Normaliza a MESSAGE_DELIVERED
Normalizer->>DB: Busca mensaje por provider_message_id
DB-->>Normalizer: Mensaje encontrado (id, campaign_id)
Normalizer->>DB: INSERT INTO message_events (...)
Normalizer->>DB: UPDATE messages SET status='DELIVERED', delivered_at=NOW()
Normalizer->>Rollup: Incrementa contador delivered de la campaña
Rollup->>DB: UPDATE campaigns SET delivered_count = delivered_count + 1
opt Si el cliente configuró Webhook URL saliente
Normalizer->>OutboundHook: Encola evento para el cliente
OutboundHook->>Ext: POST https://cliente.com/webhook { event: "message.delivered" }
end