Appearance
Componentes — Detalle por servicio
whatsapp-gateway
| Dato | Valor |
|---|---|
| Lenguaje | Go 1.23 · Fiber v2 |
| Puerto interno | 8097 (container) |
| DB | MongoDB imcrmdev — whatsapp_messages, whatsapp_conversations |
| Kafka producer | whatsapp-inbound-events, whatsapp-crm-outbound-mirror |
| Kafka consumer | whatsapp-outbound-jobs (group: whatsapp-gateway-outbound) |
| Secretos | META_APP_SECRET, META_VERIFY_TOKEN, META_SYSTEM_USER_TOKEN (por tenant en Mongo) |
Endpoints principales:
POST /webhooks/meta— recibe callbacks de WhatsApp.GET /webhooks/meta— verification challenge.GET /health,/metrics(Prometheus).
Flujo interno de inbound (internal/service/inbound.go):
- Valida firma
X-Hub-Signature-256con el app secret del tenant resuelto porphone_number_id. - Deduplica por
meta_message_id(índice único). - Inserta
WhatsAppMessagey upsertWhatsAppConversation. - Publica a
whatsapp-inbound-events(Kafka) y canal Rediswhatsapp:company:{cid}.
crm-backend/api
| Dato | Valor |
|---|---|
| Lenguaje | Go 1.23 · Fiber v2 · air (hot reload) |
| Puerto | 3434 (expose 3000) |
| DB | MongoDB imcrmdev (contactos, alertas, contratos, workflows) |
| Auth | PASETO v2 local tokens, API keys con scopes |
| Workers | DunningWhatsAppJob (hourly), MassOutageBroadcaster, outbound consumer |
Módulos clave:
internal/delivery/handler/whatsapp_handler.go— envío desde UI.internal/delivery/handler/whatsapp_webhook_handler.go—ChatwootBridge(webhook de Chatwoot → Meta).internal/jobs/dunning_whatsapp_job.go— worker horario de cobranza.internal/delivery/handler/revenue_impact_handler.go—POST /v1/alerts/revenue-impact.infrastructure/billinggw/client.go— cliente HTTP firmado con PASETO para billing.
impulse-support-agents
Dos binarios, un repo:
integration-api (puerto 8480)
Puente Kafka ↔ Chatwoot. Consumers:
whatsapp-inbound-events→ crea/actualiza conversación Chatwoot + emiteimpulse.support.messages.inbound.impulse.support.messages.outbound→ POST a Chatwoot con el token apropiado (admin, agente provisionado, o AgentBot IA).whatsapp-crm-outbound-mirror→ espeja outbound del CRM en Chatwoot usando el agente provisionado.
Postgres impulse_support:
contact_links— mapeowa_id↔ Chatwoot contact_id.conversation_links— mapeowa conversation↔ Chatwoot conversation_id.support_agent_mappings— provisioning on-the-fly de agentes CRM en Chatwoot.
orchestrator (puerto 8381)
Agente IA. Consume impulse.support.messages.inbound, construye prompt con historial + herramientas (lookup de contrato, plan, tickets abiertos), produce respuesta en impulse.support.messages.outbound tageada con sender_type=ai.
Chatwoot
Fork basado en Chatwoot 3.x. Config específica:
account_id=2para Semtec.- Inbox tipo API con webhook →
https://dev.api.impulse.ky/v1/whatsapp/chatwoot-bridge. - HMAC secret compartido (
CHATWOOT_HMAC_SECRET). - Platform App
Impulsecon token enCHATWOOT_PLATFORM_APP_TOKEN(creación de agentes). - AgentBot
Asistente IAconCHATWOOT_AI_BOT_TOKEN.
impulse-billing
| Dato | Valor |
|---|---|
| Puerto | 3030 |
| DB | Postgres impulse_billing |
| Tablas relevantes | subscriptions, invoices, payments, plans |
Endpoints usados por el CRM:
GET /subscriptions/by-contract/:external_id?status=active— retorna array desubscriptionsconmonthly_centsnormalizado.GET /invoices?contact_id=...&status=overdue— input para dunning (pendiente de integrar billing-driven).
telemetrics (contexto)
| Dato | Valor |
|---|---|
| Puerto API | 3001 → 3434 interno |
| DBs | MongoDB telemetrics (config, alertas) · VictoriaMetrics :8428 (series) |
Relevante para WhatsApp: dispara alertas de outage que el CRM consume para ejecutar el broadcast masivo.
Siguiente: Data flow — topics, colecciones y tablas en movimiento.