Flujo del Invitado
Documento tecnico que describe el journey completo de un invitado en Nvito, desde el momento en que recibe la invitacion hasta despues del evento. Cubre los canales de contacto, el flujo de RSVP, los estados del invitado, el check-in y la experiencia post-evento.
| Campo | Valor |
|---|---|
| Version | 1.0 |
| Fecha | Marzo 2026 |
| Estado | Publicado |
| Audiencia | Equipo de desarrollo, arquitectos |
1. Journey del Invitado
El invitado atraviesa multiples etapas desde que recibe la invitacion hasta despues del evento.
2. Canales de Contacto
Nvito contacta a los invitados a traves de multiples canales, priorizados por la configuracion del organizador:
| Canal | Servicio | Cuando se usa | Prerequisito |
|---|---|---|---|
| Nodemailer (SMTP) | Invitacion, confirmacion, recordatorios | Email del invitado registrado | |
| Twilio Business API | Invitacion, recordatorios, RSVP conversacional | Telefono del invitado registrado | |
| SMS | Twilio SMS | Fallback cuando WhatsApp no disponible | Telefono del invitado registrado |
| Push | Firebase/Expo Push | Recordatorios, actualizaciones en tiempo real | App movil instalada con token registrado |
| Link directo | URL publica | Compartido manualmente por el organizador | Ninguno |
2.1 Smart Routing
El sistema de comunicaciones incluye Smart Routing que selecciona automaticamente el mejor canal:
- Si el invitado tiene WhatsApp verificado y el organizador tiene credito → WhatsApp
- Si tiene email → Email
- Si tiene telefono sin WhatsApp → SMS
- Si tiene app instalada → Push notification como complemento
3. Visualizacion de la Invitacion
Cuando el invitado abre el link de la invitacion:
- nvito-invitations (Next.js ISR) sirve la pagina estatica
- Se muestra la pantalla de carga (loader) seleccionada por el organizador
- Se renderiza el HTML de la invitacion con transiciones entre secciones
- El script de analiticas registra la visita (
VIEWevent) - Si es invitacion interna, las secciones se navegan con transiciones fullpage
- Si es invitacion externa, se renderiza el HTML tal cual fue subido
3.1 Tracking de Analiticas
Cada interaccion del invitado se registra:
| Evento | Cuando | Datos |
|---|---|---|
VIEW | Al abrir la invitacion | slug, userAgent, referrer, timestamp |
SECTION_VIEW | Al navegar a una seccion | sectionType, viewDuration |
RSVP_START | Al iniciar el formulario RSVP | timestamp |
RSVP_COMPLETE | Al enviar la respuesta | response, attendeesCount |
LINK_CLICK | Al hacer clic en un enlace | linkType (map, gift, accommodation) |
4. Flujo de RSVP
El RSVP (Repondez S'il Vous Plait) es el momento central de la interaccion del invitado.
4.1 Diagrama de Flujo
4.2 Campos del RSVP
| Campo | Tipo | Requerido | Descripcion |
|---|---|---|---|
response | CONFIRMED / DECLINED | Si | Respuesta del invitado |
attendeesCount | number | Si (si CONFIRMED) | Numero de asistentes (incluye al invitado) |
attendeeNames | string[] | No | Nombres de los acompanantes |
dietaryRestrictions | string | No | Restricciones alimentarias |
message | string | No | Mensaje para los anfitriones |
needsTransportation | boolean | No | Si necesita transporte |
accommodationPreference | string | No | Preferencia de hospedaje |
4.3 Reglas de Negocio
| Regla | Descripcion |
|---|---|
| Un RSVP por par (guest, invitation) | Un invitado solo puede tener una respuesta por invitacion |
| Actualizable | El invitado puede cambiar su respuesta multiples veces antes del cierre |
| attendeesCount no excede groupSize | No puede confirmar mas asistentes que el tamano de su grupo |
| groupSize | Definido por el organizador al crear el invitado (default: 1) |
| Invitacion cerrada | No se aceptan respuestas si la invitacion esta en estado CLOSED |
5. Estados del Invitado
Cada invitado tiene un estado que refleja su progreso en el flujo:
| Estado | Descripcion | Puede cambiar? |
|---|---|---|
| PENDING | Invitado agregado pero no ha respondido RSVP | Si (via RSVP) |
| CONFIRMED | El invitado confirmo asistencia | Si (puede cambiar a DECLINED antes del cierre) |
| DECLINED | El invitado rechazo la invitacion | Si (puede cambiar a CONFIRMED antes del cierre) |
| ATTENDED | El invitado hizo check-in en el evento | No (estado final) |
6. Check-in
El check-in se realiza el dia del evento, cuando el invitado llega al venue.
6.1 Metodos de Check-in
| Metodo | Descripcion | Actor |
|---|---|---|
| QR Code | El host escanea el QR del invitado con la app movil | Host (via nvito-client o nvito-pwa) |
| Busqueda manual | El host busca al invitado por nombre en la lista | Host (via nvito-client o nvito-pwa) |
| Auto check-in | El invitado escanea un QR del venue (si habilitado) | Invitado |
6.2 Flujo de Check-in
6.3 Check-in Offline
Para eventos en lugares con mala conectividad:
- Los QR passes se pre-cargan en cache (staleTime: 10min, gcTime: 7 dias)
- El check-in se registra localmente en la cola offline (AsyncStorage / IndexedDB)
- Al recuperar conexion,
useOfflineSyncsincroniza automaticamente con el servidor - Se resuelven conflictos por timestamp (ultimo check-in gana)
7. Acceso del Invitado a la App Movil
Los invitados pueden acceder a funcionalidades adicionales via la app movil o PWA:
7.1 Acceso via Deep Link
nvito://guest?token={accessToken}
- El organizador comparte un link/QR con deep link
- El invitado abre el link en su dispositivo
- Si tiene la app: abre directamente con
loginAsGuest(accessToken) - Si no tiene la app: redirige a la PWA o app store
7.2 Funcionalidades para Invitados
| Funcionalidad | Pantalla | Descripcion |
|---|---|---|
| Home | home | Vista general del evento con countdown |
| Itinerario | itinerary-guest | Programa del evento |
| Galeria | gallery-guest | Fotos compartidas del evento |
| Interaccion | interact | Mensajes, audio guestbook, encuestas |
| Mesa de regalos | gift-registry-guest | Ver y contribuir a la mesa de regalos |
| Compartir | sharing-guest | Compartir fotos y momentos |
| Hospedaje | accommodation | Opciones de hospedaje cercanas |
8. Post-evento
Despues del evento, el invitado puede seguir interactuando:
| Accion | Canal | Trigger |
|---|---|---|
| Recibe agradecimiento | Email/WhatsApp | Workflow POST_EVENT (automatico) |
| Ve galeria compartida | App movil / PWA | Acceso persistente por 30 dias |
| Deja mensaje en audio guestbook | App movil / PWA | Disponible durante y post-evento |
| Descarga fotos | App movil / PWA | Fotos del evento en alta resolucion |
9. Modelo de Datos del Invitado
| Campo | Tipo | Descripcion |
|---|---|---|
id | UUID | Identificador unico |
eventId | UUID | Evento al que pertenece |
firstName | string | Nombre |
lastName | string | Apellido |
email | string? | Email (opcional) |
phone | string? | Telefono (opcional) |
groupSize | number | Tamano del grupo (default: 1) |
status | enum | PENDING, CONFIRMED, DECLINED, ATTENDED |
groupId | UUID? | Grupo de invitados (familia, mesa) |
tableId | UUID? | Mesa asignada |
accessToken | string | Token unico para acceso via deep link |
checkedInAt | DateTime? | Timestamp del check-in |
checkedInBy | UUID? | Quien realizo el check-in |
rsvpRespondedAt | DateTime? | Timestamp de la ultima respuesta RSVP |
10. Archivos Clave
| Archivo | Ubicacion | Responsabilidad |
|---|---|---|
rsvp.service.ts | src/modules/rsvp/ | Logica de respuesta RSVP publica |
rsvp.controller.ts | src/modules/rsvp/ | Endpoints publicos de RSVP |
guests.service.ts | src/modules/guests/ | CRUD de invitados, estados, check-in |
guests.controller.ts | src/modules/guests/ | Endpoints REST de invitados |
guest-import.service.ts | src/modules/guests/services/ | Importacion masiva de invitados (CSV/Excel) |
check-in.service.ts | src/modules/guests/services/ | Logica de check-in (QR + manual + offline) |
11. Relacion con Otros Flujos
| Flujo relacionado | Relacion |
|---|---|
| Ciclo de Vida de la Invitacion | El invitado solo puede ver/responder invitaciones PUBLISHED |
| Ciclo de Vida del Evento | El check-in solo funciona para eventos ACTIVE |
| Flujo de Comunicaciones | Los triggers RSVP_CONFIRMED y RSVP_DECLINED disparan workflows |
| Flujo de Pagos | El invitado puede contribuir a la mesa de regalos via PaymentLink |