1. Resumen del Schema
| Aspecto | Detalle |
|---|---|
| ORM | Prisma 5.22 |
| Base de datos | PostgreSQL (adaptador nativo + linux-musl-openssl) |
| Total de modelos | 53 modelos |
| Total de enums | 40 enums |
| Arquitectura | Multi-tenant con organizationId en la mayoria de modelos |
| IDs | UUID v4 (@default(uuid()) @db.Uuid) |
| Timestamps | createdAt, updatedAt, deletedAt (soft delete) |
| Campos JSON | settings, preferences, config, theme, schema |
| Mapeo de tablas | Snake_case en BD (@@map), camelCase en Prisma |
Estrategia Multi-Tenant
La plataforma utiliza un modelo multi-tenant a nivel de fila (Row-Level). Cada Organization representa un tenant aislado. Los modelos principales incluyen un campo organizationId que vincula los datos a su organización correspondiente. Los índices compuestos sobre [organizationId, ...] garantizan consultas eficientes por tenant.
Modelos Agrupados por Dominio
| Dominio | Modelos | Cantidad |
|---|---|---|
| Core / Auth | Organization, User, UserRole, PreRegistration, EventCollaboratorInvitation | 5 |
| Eventos | Event, EventType, EventServiceConfig, ServicePackage, EventContract, EventAccessCode, Client | 7 |
| Invitaciones | Invitation, Section, InvitationVersión, InvitationApproval, Template | 5 |
| Invitados / RSVP | Guest, GuestGroup, GuestAccessToken, GuestMessage, RSVP, QRPass, TableAssignment, EventTable | 8 |
| Comunicaciones | Notification, CommunicationCampaign, CommunicationMessage | 3 |
| Media / Música | Media, Music, AudioGuestbook, BackgroundMusic, BackgroundMusicTrack | 5 |
| Features | Location, ItineraryItem, GiftRegistry, GiftRegistryItem, GiftBankAccount, Accommodation, AccommodationHotel, AccommodationTransportOption, CustomDomain | 9 |
| Analytics | InvitationAnalyticsEvent, InvitationAnalyticsSummary | 2 |
| IA | AIGeneration, AIUsage, AIQuota | 3 |
| Pagos | Payment, PaymentLink | 2 |
| Movil | MobileSession | 1 |
| Auditoria | AuditLog | 1 |
2. Diagrama ER - Entidades Core
Relaciones fundamentales entre Organization, User, Event e Invitation.
Entidades Core
Relaciones
organizationusertiene usuariosorganizationeventtiene eventosorganizationuserRoleasigna rolesuseruserRoletiene rolesusereventcrea eventoseventTypeeventclasificaeventinvitationtiene invitacioneseventguesttiene invitadoseventguestGrouptiene gruposeventuserRoleroles por eventoguestGroupguestagrupa invitadosinvitationrsvprecibe confirmacionesguestrsvpconfirma asistenciaorganizationclienttiene clientesclienteventcontrata eventosuserclientasignado a clientes3. Diagrama ER - Entidades de Invitaciones
El módulo de invitaciones digitales con versionamiento, aprobaciones, secciones, templates y analytics.
Entidades de Invitaciones
Relaciones
invitationsectioncompuesta porinvitationversionversionesinvitationapprovalaprobacionesinvitationmusictiene musicainvitationanalyticsEventeventos de analyticsinvitationanalyticsSummaryresumen de analytics4. Diagrama ER - Entidades de Comunicaciones
Sistema de notificaciones individuales y campanas de comunicación masiva.
Entidades de Comunicaciones
Relaciones
campaignmessagecontiene mensajes5. Diagrama ER - Entidades de Features
Funcionalidades adicionales: ubicaciones, itinerario, QR passes, mesa de regalos, hospedaje, media, mesas y más.
Entidades de Features
Relaciones
locationitineraryItemsede del itemgiftRegistrygiftRegistryItemtiene itemsgiftRegistrygiftBankAccounttiene cuentas bancariasaccommodationaccommodationHoteltiene hoteleseventTabletableAssignmenttiene asignaciones6. Enums Principales
6.1 Estado del Evento - EventStatus
| Valor | Descripción |
|---|---|
DRAFT | Evento en borrador, aun no publicado |
ACTIVE | Evento activo y visible para invitados |
CANCELLED | Evento cancelado (requiere razon de cancelación) |
COMPLETED | Evento finalizado |
6.2 Estado de la Invitación - InvitationStatus
| Valor | Descripción |
|---|---|
IN_CONSTRUCTION | Invitación en proceso de diseño/construcción |
UNPUBLISHED | Invitación lista pero no publicada |
PUBLISHED | Invitación publicada y accesible por URL |
CLOSED | Invitación cerrada (ya no acepta RSVPs) |
6.3 Origen de la Invitación - InvitationSource
| Valor | Descripción |
|---|---|
INTERNAL | Invitación creada con el motor de templates y IA de Nvito (default) |
EXTERNAL | HTML disenado fuera de Nvito y cargado manualmente |
6.4 Estado del RSVP - RSVPStatus
| Valor | Descripción |
|---|---|
PENDING | Confirmación pendiente de respuesta |
CONFIRMED | Invitado confirmo asistencia |
DECLINED | Invitado declino la invitación |
MAYBE | Invitado aun no está seguro |
6.5 Estado del Invitado - GuestStatus
| Valor | Descripción |
|---|---|
PENDING | Invitado registrado, sin respuesta |
CONFIRMED | Invitado confirmo asistencia via RSVP |
DECLINED | Invitado declino la invitación |
ATTENDED | Invitado asistio al evento (verificado por QR/check-in) |
6.6 Roles del Sistema - RoleType
| Valor | Descripción |
|---|---|
SUPER_ADMIN | Administrador global de la plataforma Nvito |
PLATFORM_ADMIN | Administrador de plataforma. Lectura cross-org, escritura en orgs asignadas |
ORGANIZATION_OWNER | Propietario de la organización (tenant) |
ORGANIZATION_ADMIN | Administrador de la organización |
EVENT_MANAGER | Gestor completo del evento |
EVENT_EDITOR | Editor del evento (puede modificar contenido) |
EVENT_COLLABORATOR | Colaborador con acceso limitado al evento |
EVENT_VIEWER | Solo lectura del evento |
Nota:
SUPER_ADMINyPLATFORM_ADMINson mutuamente excluyentes -- un usuario no puede tener ambos roles simultaneamente.
6.7 Scope del Rol - RoleScope
| Valor | Descripción |
|---|---|
GLOBAL | Aplica a toda la plataforma (Super Admin, Platform Admin) |
ORGANIZATION | Aplica a nivel de organización |
EVENT | Aplica a un evento específico |
6.8 Plan de Suscripcion - SubscriptionPlan
| Valor | Descripción |
|---|---|
FREE | Plan gratuito con funcionalidades básicas |
ESSENTIAL | Plan esencial para eventos individuales |
PLUS | Plan plus con herramientas avanzadas |
VIP | Plan VIP con todas las funcionalidades |
ENTERPRISE | Plan empresarial con soporte prioritario |
6.9 Tipo de Media - MediaType
| Valor | Descripción |
|---|---|
IMAGE | Imagen (JPG, PNG, WebP) |
VIDEO | Video (MP4, WebM) |
AUDIO | Audio (MP3, WAV, OGG) |
6.10 Categoría de Media - MediaCategory
| Valor | Descripción |
|---|---|
GALLERY | Imagen de galería del evento |
HERO | Imagen principal / hero de la invitación |
OG_IMAGE | Imagen para meta tags Open Graph (SEO) |
AUDIO_GUESTBOOK | Audio del libro de visitas |
LOGO | Logo de la organización |
AVATAR | Avatar del usuario |
COVER | Imagen de portada del evento |
6.11 Restricciones Dieteticas - DietaryRestriction
| Valor | Descripción |
|---|---|
VEGETARIAN | Dieta vegetariana |
VEGAN | Dieta vegana |
GLUTEN_FREE | Sin gluten (celiaco) |
HALAL | Comida halal |
KOSHER | Comida kosher |
NUT_FREE | Sin frutos secos |
DAIRY_FREE | Sin lacteos |
OTHER | Otra restriccion (detalle en notas) |
6.12 Tipos de Servicio de Evento - EventServiceType
Los 18 servicios que pueden habilitarse por evento:
| Valor | Descripción |
|---|---|
INVITATION | Invitación digital |
LOCATIONS | Ubicaciones del evento |
GUEST_LIST | Lista de invitados |
RSVP | Confirmación de asistencia |
GUEST_GROUPS | Grupos de invitados |
ITINERARY | Programa / itinerario del evento |
TABLES | Asignación de mesas |
QR_PASSES | Pases QR de entrada |
CHECK_IN | Check-in en el evento |
GALLERY | Galería de fotos |
AUDIO_GUESTBOOK | Libro de visitas con audio |
GUEST_UPLOADS | Subida de fotos por invitados |
CUSTOM_DOMAIN | Dominio personalizado |
BACKGROUND_MUSIC | Música de fondo en la invitación |
GIFT_REGISTRY | Mesa de regalos |
ACCOMMODATION | Información de hospedaje |
SPONSORS | Patrocinadores del evento |
PRAYER | Sección de oración/bendicion |
THANK_YOU | Sección de agradecimiento |
DRESS_CODE | Código de vestimenta |
6.13 Estado de Notificación - NotificationStatus
| Valor | Descripción |
|---|---|
PENDING | Notificación en cola de envio |
SENT | Enviada al proveedor (Resend) |
DELIVERED | Entregada al destinatario |
FAILED | Fallo en el envio |
BOUNCED | Rebotada (email invalido) |
6.14 Tipo de Cliente - ClientType
| Valor | Descripción |
|---|---|
INDIVIDUAL | Persona fisica que contrata un evento |
COMPANY | Persona moral / empresa |
6.15 Estado del Cliente - ClientStatus
| Valor | Descripción |
|---|---|
PROSPECT | Cliente potencial, en etapa de cotizacion |
ACTIVE | Cliente con evento(s) activo(s) en curso |
COMPLETED | Todos los eventos del cliente finalizaron |
INACTIVE | Cliente inactivo o dado de baja |
6.16 Fuente de Adquisicion - AcquisitionSource
| Valor | Descripción |
|---|---|
SOCIAL_MEDIA | Captado via redes sociales (Instagram, Facebook, etc) |
REFERRAL | Referido por otro cliente |
GOOGLE | Búsqueda en Google / SEO / Google Ads |
WEBSITE | Visita directa al sitio web de Nvito |
DIRECT | Contacto directo (evento presencial, networking) |
OTHER | Otra fuente (detalle en acquisitionDetail) |
6.17 Otros Enums
| Enum | Valores |
|---|---|
GiftRegistryType | AMAZON, LIVERPOOL, PALACIO_HIERRO, SANBORNS, COPPEL, SEARS, OTHER |
MusicSourceType | SPOTIFY, YOUTUBE, FILE, SPOTIFY_PLAYLIST, APPLE_MUSIC_PLAYLIST, YOUTUBE_PLAYLIST |
TableShape | ROUND, SQUARE, RECTANGLE, OVAL |
LocationType | VENUE, CEREMONY, RECEPTION, PARKING, OTHER |
RsvpType | REQUIRED, OPTIONAL, CLOSED |
InvitationAnalyticsEventType | VIEW, RSVP_OPEN, RSVP_SUBMIT, LINK_CLICK, SHARE, DOWNLOAD |
PreRegistrationStatus | PENDING, REGISTERED, ACTIVATED, EXPIRED, CANCELLED |
CommunicationCampaignStatus | DRAFT, SENDING, COMPLETED, FAILED |
CommunicationMessageStatus | PENDING, SENT, DELIVERED, FAILED, OPENED, BOUNCED |
CollaboratorInvitationStatus | PENDING, ACCEPTED, DECLINED, EXPIRED, CANCELLED |
TemplateStatus | DRAFT, ACTIVE, INACTIVE |
NotificationChannel | EMAIL, WHATSAPP, BOTH |
PaymentMethod | TRANSFER, CARD, CASH, OTHER |
PaymentStatus | PENDING, PARTIAL, PAID, REFUNDED, CANCELLED |
PaymentType | SERVICE_PAYMENT, CASH_FUND_CONTRIBUTION |
StripePaymentStatus | PENDING, PROCESSING, SUCCEEDED, FAILED, REFUNDED, CANCELLED |
PaymentLinkStatus | ACTIVE, USED, EXPIRED, CANCELLED |
AdjustmentType | NONE, DISCOUNT, COURTESY, SURCHARGE |
AIGenerationStatus | PENDING, COMPLETED, FAILED |
QRPassType | ENTRY, EXIT, VIP |
MobileRole | HOST, GUEST |
ClientType | INDIVIDUAL, COMPANY |
ClientStatus | PROSPECT, ACTIVE, COMPLETED, INACTIVE |
AcquisitionSource | SOCIAL_MEDIA, REFERRAL, GOOGLE, WEBSITE, DIRECT, OTHER |
InvitationSource | INTERNAL, EXTERNAL |
7. Indices y Politicas
7.1 Indices Principales
Los índices estan disenados para optimizar las consultas más frecuentes del sistema multi-tenant.
Indices por Tenant (Organization)
| Tabla | Indice | Proposito |
|---|---|---|
organizations | (clerk_org_id) | Lookup por Clerk ID en autenticación |
organizations | (slug) | Búsqueda por slug único |
organizations | (plan) | Filtro por plan de suscripcion |
events | (organization_id) | Eventos por organización |
events | (organization_id, date DESC) | Eventos por organización ordenados por fecha |
notifications | (organization_id, status, created_at DESC) | Notificaciones por org con filtro de estado |
Indices de Clientes
| Tabla | Indice | Proposito |
|---|---|---|
clients | (organization_id) | Clientes por organización |
clients | (status) | Filtro por estado del cliente |
clients | (type) | Filtro por tipo (individual/empresa) |
clients | (assigned_to_id) | Clientes por responsable asignado |
clients | (organization_id, status) | Clientes por org filtrados por estado |
Indices de Usuarios y Roles
| Tabla | Indice | Proposito |
|---|---|---|
users | (clerk_user_id) | Lookup rápido en autenticación |
users | (email) | Búsqueda por email |
users | (is_super_admin) | Filtro de super admins |
users | (is_platform_admin) | Filtro de platform admins |
user_roles | (user_id) | Roles de un usuario |
user_roles | (role) | Usuarios por tipo de rol |
user_roles | (organization_id) | Roles por organización |
user_roles | (event_id) | Roles por evento |
Indices de Eventos e Invitaciones
| Tabla | Indice | Proposito |
|---|---|---|
events | (event_type_id) | Eventos por tipo |
events | (status) | Filtro por estado del evento |
events | (date) | Ordenamiento por fecha |
invitations | (event_id) | Invitaciones de un evento |
invitations | (status) | Filtro por estado de invitación |
invitations | (slug) (idx_invitations_slug) | Lookup público por slug |
sections | (invitation_id, order) | Secciones ordenadas de una invitación |
Indices de Invitados y RSVP
| Tabla | Indice | Proposito |
|---|---|---|
guests | (event_id) | Invitados de un evento |
guests | (event_id, status) | Invitados filtrados por estado |
guests | (event_id, deleted_at) | Invitados activos (soft delete) |
guests | (email) | Búsqueda por email |
rsvps | (invitation_id) | RSVPs de una invitación |
rsvps | (invitation_id, status) | RSVPs filtrados por estado |
rsvps | (deleted_at) | RSVPs activos (soft delete) |
guest_access_tokens | (short_code) UNIQUE | Lookup público por shortCode para personalización de invitaciones |
Indices de Analytics
| Tabla | Indice | Proposito |
|---|---|---|
invitation_analytics_events | (invitation_id, created_at) | Eventos de analytics por invitación |
invitation_analytics_events | (event_type) | Filtro por tipo de evento analytics |
7.2 Constraints Unicos
| Tabla | Constraint | Descripción |
|---|---|---|
organizations | slug UNIQUE | Slug único por organización |
organizations | clerk_org_id UNIQUE | Un Clerk org por organización |
users | clerk_user_id UNIQUE | Un Clerk user por usuario |
users | email UNIQUE | Email único global |
events | (slug, organization_id) UNIQUE | Slug único por organización |
invitations | slug UNIQUE | Slug único global para URLs públicas |
guests | (email, event_id) UNIQUE | Un invitado por email por evento |
rsvps | (guest_id, invitation_id) UNIQUE | Un RSVP por invitado por invitación |
user_roles | (userId, role, scope, organizationId, eventId) UNIQUE | Sin roles duplicados |
invitation_versións | (invitation_id, versión_number) UNIQUE | Numero de versión único por invitación |
qr_passes | code UNIQUE | Código QR único global |
table_assignments | guest_id UNIQUE | Un invitado en una sola mesa |
custom_domains | domain UNIQUE | Dominio personalizado único global |
pre_registrations | (email, organization_id) UNIQUE | Un pre-registro por email por organización |
templates | slug UNIQUE | Slug único global por template |
service_packages | slug UNIQUE | Slug único global por paquete |
clients | (email, organization_id) UNIQUE | Un cliente por email por organización |
guest_access_tokens | short_code UNIQUE | ShortCode único global para URLs personalizadas |
7.3 Relaciones con Cascade Delete
Las siguientes relaciones tienen onDelete: Cascade, lo que significa que al eliminar el padre se eliminan los hijos automáticamente:
Event-> Invitation, Guest, GuestGroup, Location, ItineraryItem, QRPass, Media, EventTable, AudioGuestbook, Accommodation, GiftRegistry, BackgroundMusic, CustomDomain, EventServiceConfig, EventContract, CommunicationCampaignInvitation-> Section, InvitationVersión, InvitationApproval, Music, RSVP, InvitationAnalyticsEvent, InvitationAnalyticsSummary, AIGenerationGuest-> RSVP, QRPass, TableAssignmentGiftRegistry-> GiftRegistryItem, GiftBankAccountAccommodation-> AccommodationHotel, AccommodationTransportOptionBackgroundMusic-> BackgroundMusicTrackCommunicationCampaign-> CommunicationMessageUserRole-> (cascade desde User, Organization, Event)
7.4 Soft Delete
Los siguientes modelos implementan soft delete con el campo deletedAt:
OrganizationUserEventGuestRSVPMediaInvitationVersiónTableAssignmentTemplateClient
8. Seed Data
El archivo seed.ts es idempotente (puede ejecutarse múltiples veces sin duplicar datos). Utiliza upsert para crear o actualizar registros existentes.
8.1 Super Admin
| Campo | Valor |
|---|---|
developer.pezfred@gmail.com | |
| Clerk User ID | user_395ntlOdgiElz480VOcKNaYfeXj |
| Nombre | Alfredo Admin |
| isSuperAdmin | true |
| Rol asignado | SUPER_ADMIN con scope GLOBAL |
| Preferences | timezone: America/Mexico_City, language: es, notifications: email + push |
8.2 Tipos de Evento (9)
| # | Slug | Nombre | Icono | Secciones Default |
|---|---|---|---|---|
| 1 | wedding | Boda | ring | Hero, Couple, Itinerary, Location, RSVP, GiftRegistry, Gallery |
| 2 | xv-anos | XV Años | crown | Hero, Quinceañera, Itinerary, Location, RSVP, Gallery |
| 3 | baptism | Bautizo | church | Hero, Details, Location, RSVP, Gallery |
| 4 | birthday | Cumpleaños | cake | Hero, Details, Location, RSVP, Gallery |
| 5 | first-communion | Primera Comunión | cross | Hero, Details, Location, RSVP, Gallery |
| 6 | baby-shower | Baby Shower | bottle | Hero, Details, Location, RSVP, GiftRegistry |
| 7 | graduation | Graduación | cap | Hero, Details, Location, RSVP, Gallery |
| 8 | corporate | Evento Corporativo | bldg | Hero, Details, Itinerary, Location, RSVP |
| 9 | other | Otro | party | Hero, Details, Location, RSVP |
8.3 Paquetes de Servicios (5)
| # | Slug | Nombre | Precio (MXN) | Recomendado | Servicios Incluidos |
|---|---|---|---|---|---|
| 1 | essential | Essential | $1,499 | No | INVITATION, GUEST_LIST, RSVP, LOCATIONS |
| 2 | plus | Plus | $2,999 | Si | Essential + ITINERARY, GUEST_GROUPS, TABLES, QR_PASSES |
| 3 | vip | VIP | $4,999 | No | Plus + CHECK_IN, GALLERY, AUDIO_GUESTBOOK, GUEST_UPLOADS |
| 4 | elite | Elite | $9,999 | No | Todos los servicios del VIP (para múltiples eventos) |
| 5 | personalizado | Personalizado | $0 | No | Sin servicios predefinidos (seleccion a medida) |
8.4 Templates de Invitación (16)
| # | Slug | Nombre | Tipo Evento | Featured | Fuentes |
|---|---|---|---|---|---|
| 1 | wedding-classic | Boda Clasica Romantica | wedding | Si | Playfair Display / Lato |
| 2 | wedding-garden | Boda Jardin Botanico | wedding | Si | Cormorant Garamond / Nunito |
| 3 | wedding-modern | Boda Moderna Minimalista | wedding | Si | Raleway / DM Sans |
| 4 | xv-princess | XV Años Princesa Glamorosa | xv | Si | Cormorant Garamond / Montserrat |
| 5 | xv-modern | XV Años Moderna Elegante | xv | No | Poppins / DM Sans |
| 6 | birthday-festive | Cumpleaños Festivo Vibrante | birthday | Si | Quicksand / Nunito |
| 7 | birthday-elegant | Cumpleaños Elegante | birthday | No | Cormorant Garamond / Inter |
| 8 | baptism-celestial | Bautizo Celestial Pastel | baptism | Si | Cormorant Infant / Nunito |
| 9 | baptism-golden | Bautizo Clasico Dorado | baptism | No | Playfair Display / Lato |
| 10 | communion-serene | Primera Comunión Espiritual | communion | Si | Cormorant Garamond / Source Sans Pro |
| 11 | babyshower-sweet | Baby Shower Dulce y Tierno | babyshower | Si | Quicksand / Nunito |
| 12 | babyshower-modern | Baby Shower Moderno Neutral | babyshower | No | Poppins / DM Sans |
| 13 | graduation-classic | Graduación Academica Clasica | graduation | Si | Merriweather / Open Sans |
| 14 | graduation-bold | Graduación Moderna Bold | graduation | No | Poppins / Inter |
| 15 | corporate-clean | Corporativo Profesional | corporate | Si | Inter / DM Sans |
| 16 | other-versatile | Versatil Universal | other | No | DM Sans / Inter |
Distribucion de Templates por Tipo de Evento
| Tipo de Evento | Cantidad | Templates |
|---|---|---|
| Boda (wedding) | 3 | Classic, Garden, Modern |
| XV Años (xv) | 2 | Princess, Modern |
| Cumpleaños | 2 | Festive, Elegant |
| Bautizo | 2 | Celestial, Golden |
| Primera Comunión | 1 | Serene |
| Baby Shower | 2 | Sweet, Modern |
| Graduación | 2 | Classic, Bold |
| Corporativo | 1 | Clean |
| Otro | 1 | Versatile |
Secciones Comunes en Templates de Boda
Los templates de boda incluyen 14 secciones con variantes configurables:
hero- Encabezado principal con imagenwelcome- Mensaje de bienvenidaevent_details- Detalles del eventocountdown- Cuenta regresivastory- Historia de la pareja (timeline vertical)gallery- Galería de fotositinerary- Programa del eventolocation- Ubicación con maparegistry- Mesa de regalosaccommodation- Hospedajefaq- Preguntas frecuentesrsvp- Formulario de confirmaciónmusic- Reproductor de músicafooter- Pie de página
Notas Adicionales
Campos JSON Importantes
| Modelo | Campo | Estructura |
|---|---|---|
| Organization | settings | { timezone, language, dateFormat, features: { aiEnabled } } |
| Organization | limits | { maxEvents, maxGuestsPerEvent, maxStorage, maxAIGenerations } |
| User | preferences | { timezone, language, notifications: { email, push } } |
| Event | settings | { allowPlusOnes, requireDietaryInfo, theme, primaryColor } |
| Invitation | schema | Estructura completa de secciones y componentes de la invitación |
| Invitation | theme | { colors, fonts, spacing } - Tema visual de la invitación |
| Section | config | Configuración específica según el tipo de sección |
| Template | config | { colors, fonts, sections[] con variantes, animaciones } |
| Template | sampleData | Datos de ejemplo para preview/demo del template |
| RSVP | dietaryInfo | { vegetarian: 1, vegan: 0, allergies: ["nuts"] } |
| AuditLog | changes | Registro de cambios anteriores y nuevos valores |
GuestAccessToken — Campo shortCode
El modelo GuestAccessToken tiene un campo shortCode (12 caracteres, crypto.randomBytes, 71 bits de entropia, URL-safe) que permite generar URLs personalizadas por invitado con formato https://nvito.mx/i/{slug}?t={shortCode}. El shortCode es único a nivel global y se usa para resolver datos NO sensibles del invitado (nombre, título, groupSize) a traves del endpoint público GET /v1/invitations/public/guest/{shortCode}. El campo tiene validación de isActive y expiresAt para controlar el acceso.
Proveedores Externos
| Servicio | Proveedor | Campo de referencia |
|---|---|---|
| Autenticación | Clerk | clerkUserId, clerkOrgId |
| Resend | provider, providerId | |
| Almacenamiento | AWS S3 | htmlUrl, cssUrl, jsUrl, url |
| Mapas | Google Maps | placeId, googleMapsUrl |
| IA | Varios | provider, model en AIGeneration |