Docs

Flujo de Comunicaciones

Documento tecnico que describe el sistema completo de comunicaciones de Nvito: la arquitectura de 3 capas, los templates con variables Handlebars, los workflows automatizados con 6 triggers, los 4 canales de envio, las colas Bull con reintentos y el ciclo de vida de mensajes y campanas.

CampoValor
Version1.0
FechaMarzo 2026
EstadoPublicado
AudienciaEquipo de desarrollo, arquitectos

1. Arquitectura de 3 Capas

El sistema de comunicaciones esta dividido en 3 modulos NestJS con responsabilidades claras y sin dependencias circulares:

1.1 Responsabilidades por Capa

CapaModuloResponsabilidadDependencias
3 - Alto nivelNotificationsModuleAPI de dominio, campanas, workflowsImporta Capa 2 y Capa 1
2 - ColasQueueModuleEncolamiento, procesamiento, reintentosImporta Capa 1
1 - CanalesNotificationChannelsModuleEnvio puro (email, WhatsApp, SMS, push)Sin dependencias internas

1.2 Regla de Arquitectura

La Capa 1 nunca importa a la Capa 2 ni la Capa 3. La Capa 2 nunca importa la Capa 3. Las dependencias fluyen de arriba hacia abajo exclusivamente.


2. Templates de Comunicacion

Los templates usan sintaxis Handlebars para insertar variables dinamicas del invitado y el evento.

2.1 Variables Disponibles

VariableTipoEjemplo
{{guest.firstName}}string"Maria"
{{guest.lastName}}string"Garcia"
{{guest.fullName}}string"Maria Garcia"
{{guest.groupSize}}number3
{{event.name}}string"Boda de Ana y Carlos"
{{event.date}}string"15 de marzo de 2026"
{{event.time}}string"18:00"
{{event.venue}}string"Hacienda Los Olivos"
{{event.location}}string"Queretaro, Mexico"
{{invitation.url}}string"https://nvito.mx/i/ana-carlos-2026"
{{rsvp.url}}stringURL directa al formulario RSVP
{{organization.name}}string"Wedding Planner XYZ"

2.2 Estados del Template

EstadoDescripcionPuede usarse en campanas?
DRAFTTemplate en construccion, no disponible para envioNo
ACTIVETemplate listo para usar en campanas y workflowsSi
ARCHIVEDTemplate descontinuado, no aparece en la listaNo

2.3 Tipos de Template

TipoCanalContenido
EmailSMTPHTML con layout responsive, sujeto, preheader
WhatsAppTwilioTexto plano con variables (requiere template aprobado por Meta)
SMSTwilioTexto plano, max 160 chars (concatenable)
PushFirebase/ExpoTitulo + body + data payload

3. Workflows Automatizados

Los workflows permiten configurar acciones automaticas que se disparan por eventos del sistema.

3.1 Triggers Disponibles

TriggerCuando se disparaDatos disponiblesCaso de uso tipico
GUEST_ADDEDAl agregar un invitado al eventoGuest, EventEnviar invitacion automaticamente
RSVP_CONFIRMEDAl confirmar asistencia via RSVPGuest, Event, RSVPEnviar confirmacion y detalles
RSVP_DECLINEDAl rechazar via RSVPGuest, Event, RSVPEnviar agradecimiento por responder
DAYS_BEFORE_EVENTN dias antes del evento (configurable)Event, GuestsRecordatorio de asistencia
EVENT_DAYEl dia del eventoEvent, GuestsDetalles logisticos, horarios
POST_EVENTDespues del eventoEvent, GuestsAgradecimiento, galeria, encuesta

3.2 Configuracion del Workflow

Cada workflow define:

CampoTipoDescripcion
triggerenumEvento que lo dispara
channelenumCanal de envio (EMAIL, WHATSAPP, SMS, PUSH)
templateIdUUIDTemplate a usar
isActivebooleanSi esta habilitado
delayMinutesnumberRetraso antes de ejecutar (0 = inmediato)
filterConditionJSON?Filtro opcional (ej: solo invitados confirmados)
daysBeforeEventnumber?Solo para trigger DAYS_BEFORE_EVENT

3.3 Flujo de Ejecucion del Workflow


4. Canales de Envio

4.1 Email (SMTP)

AspectoDetalle
LibreriaNodemailer
TransporteSMTP configurable por ambiente
DevMailDev (localhost:1080)
StagingMailtrap
ProduccionSMTP empresarial
FeaturesHTML responsive, adjuntos, reply-to, tracking headers

4.2 WhatsApp (Twilio)

AspectoDetalle
ProveedorTwilio WhatsApp Business API
TemplatesPre-aprobados por Meta (HSM)
Sesiones24h window para respuestas libres
Chatbot RSVPRespuesta conversacional via WhatsApp
WebhooksStatus callbacks (sent, delivered, read, failed)

4.3 SMS (Twilio)

AspectoDetalle
ProveedorTwilio Programmable SMS
UsoFallback cuando WhatsApp no disponible
Limite160 chars por segmento (auto-concatenacion)
PaisesMexico, USA, Colombia (configurables)

4.4 Push Notifications

AspectoDetalle
ProveedorExpo Push API → Firebase (Android) / APNs (iOS)
LibreriaPushSenderService via expo-server-sdk
RegistroToken almacenado al instalar la app
Payloadtitle, body, data (deep link)
SilenciosaSoportada para actualizar datos en background

5. Colas Bull (Redis)

5.1 Configuracion de Colas

ColaNombreConcurrenciaReintentosBackoff
Emailemail-queue53Exponencial (1s, 2s, 4s)
WhatsAppwhatsapp-queue33Exponencial (2s, 4s, 8s)
SMSsms-queue33Exponencial (1s, 2s, 4s)
Pushpush-queue102Exponencial (1s, 2s)

5.2 Estructura del Job

interface QueueJob {
  id: string;           // UUID del mensaje
  channel: Channel;     // EMAIL | WHATSAPP | SMS | PUSH
  to: string;           // Destinatario (email, phone, pushToken)
  subject?: string;     // Solo email
  body: string;         // Contenido renderizado
  htmlBody?: string;    // Solo email (HTML)
  metadata: {
    eventId: string;
    guestId: string;
    campaignId?: string;
    workflowId?: string;
    templateId: string;
  };
  attempts: number;
  priority: number;     // 1 (alta) a 10 (baja)
}

5.3 Politica de Reintentos

  1. Intento 1: Inmediato
  2. Intento 2: Despues de backoff * 1 segundos
  3. Intento 3: Despues de backoff * 2 segundos
  4. Fallo definitivo: Marcar mensaje como FAILED, registrar error

6. Ciclo de Vida del Mensaje

Cada mensaje individual tiene un ciclo de vida rastreable:

EstadoDescripcionFinal?
PENDINGMensaje creado, pendiente de encolarNo
QUEUEDEn la cola Bull, esperando procesamientoNo
SENTEnviado exitosamente al proveedor (SMTP, Twilio, Expo)No
DELIVEREDConfirmacion de entrega al destinatarioNo
OPENEDEl destinatario abrio el mensaje (tracking pixel o read receipt)Si
BOUNCEDEl mensaje reboto (email invalido, telefono no existe)Si
FAILEDError definitivo despues de agotar reintentosSi
CANCELLEDCampana cancelada antes del envioSi

7. Campanas Masivas

Las campanas permiten enviar comunicaciones a multiples invitados.

7.1 Estados de la Campana

7.2 Flujo de Campana

7.3 Prevencion de Spam

ReglaDescripcion
Deduplicacion 24hNo enviar al mismo destinatario el mismo template en 24 horas
Rate limit por eventoMax 1000 mensajes por hora por evento
Opt-outRespetar preferencias de comunicacion del invitado
HorarioNo enviar entre 22:00 y 08:00 hora local del destinatario

8. Webhooks de Estado

Los proveedores externos notifican cambios de estado via webhooks:

ProveedorWebhook URLEventos
Twilio (WhatsApp/SMS)POST /webhooks/twilio/statussent, delivered, read, failed, undelivered
Email (tracking)Pixel tracking en HTMLopened
Email (bounces)SMTP bounce processingbounced, complained

8.1 Procesamiento de Webhooks


9. Archivos Clave

ArchivoUbicacionResponsabilidad
communications.service.tssrc/modules/communications/Campanas masivas, despacho de mensajes
communication-template.service.tssrc/modules/communications/services/CRUD de templates, renderizado Handlebars
workflow.service.tssrc/modules/communications/services/Motor de workflows automatizados
queue.service.tssrc/modules/queue/Encolamiento de jobs en Bull/Redis
email.processor.tssrc/modules/queue/processors/Procesador de jobs de email
whatsapp.processor.tssrc/modules/queue/processors/Procesador de jobs de WhatsApp
push.processor.tssrc/modules/queue/processors/Procesador de jobs de push
email.service.tssrc/modules/notification-channels/Envio SMTP via Nodemailer
whatsapp.service.tssrc/modules/notification-channels/Envio via Twilio WhatsApp API
push-sender.service.tssrc/modules/notification-channels/Envio via Expo Push API
template.service.tssrc/modules/notification-channels/Renderizado de templates de email
notification-helper.service.tssrc/modules/notifications/Notificaciones de dominio (RSVP, recordatorios)

10. Relacion con Otros Flujos

Flujo relacionadoRelacion
Flujo del InvitadoLos triggers RSVP_CONFIRMED/DECLINED disparan workflows
Ciclo de Vida del EventoDAYS_BEFORE_EVENT, EVENT_DAY y POST_EVENT se calculan desde las fechas del evento
Ciclo de Vida de la InvitacionLos templates incluyen {{invitation.url}} de la invitacion publicada
Flujo de PagosLos recibos de pago se envian via el sistema de comunicaciones
Esta pagina fue util?