Ecosistema LPDI — Versión 10 — 2026-07-03
53 correos activos + 3 eliminados · Organizados por: USUARIO → STARTUP → ICG → ENTIDADES → CRON → PERKS → EVENTOS
CATEGORÍA / DESTINATARIO / EXISTENCIA / PRIVILEGIO / TIPO MENSAJE / TYC / FUENTE| # | Nombre Técnico | Asunto del correo | Destino CTA | Descripción | TyC | Img | |
|---|---|---|---|---|---|---|---|
| USUARIO — Correos de cuenta y autenticación (11) | |||||||
| 01 | USUARIO/USER/NUEVO/NO-ED/Confirmación de Correo/NO-TYC/SUPA | “Confirma tu cuenta en el Ecosistema LPDI” | {{ .ConfirmationURL }} → eco.lpdi.co | Confirmación de email al crear cuenta nueva. | NO | ✓ | |
| 02 | USUARIO/USER/EXIST/NO-ED/Recuperación de Contraseña/NO-TYC/SUPA | “Restablece tu contraseña — Ecosistema LPDI” | eco.lpdi.co/auth/recuperar | Reset de contraseña con enlace seguro. | NO | ✓ | |
| 03 | USUARIO/USER/NUEVO/NO-ED/Magic Link/NO-TYC/SUPA | “Tu enlace de acceso — Ecosistema LPDI” | {{ .ConfirmationURL }} → eco.lpdi.co | Enlace mágico de acceso. Reservado para uso admin. | NO | ✓ | |
| 04 | USUARIO/USER/EXIST/NO-ED/Cambio de Correo/NO-TYC/SUPA | “Confirma el cambio de correo — Ecosistema LPDI” | {{ .ConfirmationURL }} → eco.lpdi.co | Verificación del nuevo correo al cambiar email. | NO | ✓ | |
| 05 | USUARIO/USER/NUEVO/NO-ED/Invitación Admin/NO-TYC/SUPA | “Has sido invitado al Ecosistema LPDI” | {{ .ConfirmationURL }} → eco.lpdi.co | Invitación directa desde Supabase Dashboard. | NO | ✓ | |
| 06 | USUARIO/USER/EXIST/NO-ED/Reautenticación OTP/NO-TYC/SUPA | “Código de verificación — Ecosistema LPDI” | Código OTP (sin botón) | Código de verificación para acciones sensibles. | NO | ✓ | |
| 07 | USUARIO/USER/EXIST/NO-ED/Notificación Correo Cambiado/NO-TYC/SUPA | “Tu correo electrónico ha sido actualizado — Ecosistema LPDI” | Sin CTA | Avisa al usuario que su correo fue actualizado. | NO | ✓ | |
| 08 | USUARIO/USER/EXIST/NO-ED/Notificación Contraseña Cambiada/NO-TYC/SUPA | “Tu contraseña ha sido cambiada — Ecosistema LPDI” | Sin CTA | Avisa al usuario que su contraseña fue actualizada. | NO | ✓ | |
| 09 | USUARIO/USER/EXIST/NO-ED/Eliminación de Cuenta/NO-TYC/LPDI | “Tu cuenta en el Ecosistema LPDI ha sido eliminada” | eco.lpdi.co | Confirmación de eliminación voluntaria de cuenta. | NO | ✓ | |
| 10 | USUARIO/USER/EXIST/NO-ED/Contraseña Actualizada/NO-TYC/LPDI | “Tu contraseña ha sido actualizada — Ecosistema LPDI” | eco.lpdi.co/auth/recuperar | Notificación del sistema LPDI cuando el usuario cambia su contraseña. | NO | ✓ | |
| 53 | NUEVO | USUARIO/USER/AMBOS/NO-ED/Actualización T&C y Política/NO-TYC/LPDI | “Actualizamos nuestras condiciones y políticas — Ecosistema LPDI” | Enlaces a T&C + Política | Aviso de publicación de versión nueva de los documentos legales (Grupo A, tácita). | NO | ✓ |
| STARTUP — Registro, equipo y ciclo de vida de Startups/PyMEs (13) | |||||||
| 11 | STARTUP/CEO/NUEVO/SI-ED/Bienvenida Registro/SI-TYC/LPDI | “Bienvenido al Ecosistema LPDI — Confirma tu cuenta” | ${confirmUrl} | Bienvenida al registrante de una startup. | SI | ✓ | |
| 12 | STARTUP/CEO/NUEVO/SI-ED/Bienvenida CEO Designado/SI-TYC/LPDI | “Bienvenido al Ecosistema LPDI — {empresa}” | eco.lpdi.co/dashboard | CEO designado sin cuenta LPDI. Incluye credenciales. | SI | ✓ | |
| 13 | STARTUP/CEO/EXIST/SI-ED/Bienvenida CEO Designado/NO-TYC/LPDI | “Has sido designado CEO de {empresa} en el Ecosistema LPDI” | eco.lpdi.co/dashboard | CEO designado ya tiene cuenta LPDI. | NO | ✓ | |
| 14 | MODIFICADO | STARTUP/CEO/EXIST/SI-ED/Seguimiento de Score/NO-TYC/LPDI | “Aumenta el score de tu perfil en el Ecosistema LPDI” | ${profileUrl} | Recordatorio para completar perfil y subir score. | NO | ✓ |
| 15 | STARTUP/CEO/NUEVO/SI-ED/Recordatorio día 3/NO-TYC/LPDI | “Recordatorio: confirma tu cuenta en el Ecosistema LPDI” | ${confirmUrl} | Recordatorio amigable día 3 si no confirmó correo. | NO | ✓ | |
| 16 | STARTUP/CEO/NUEVO/SI-ED/Recordatorio Urgente día 6/NO-TYC/LPDI | “Último aviso: confirma tu cuenta en el Ecosistema LPDI” | ${confirmUrl} | Aviso urgente día 6. Cuenta expira día 8. | NO | ✓ | |
| 18 | STARTUP/TEAM/NUEVO/NO-ED/Invitación al Equipo/SI-TYC/LPDI | “{CEO} te ha incluido en el equipo de {empresa} — confirma tu registro” | ${confirmUrl} | Invitación a persona sin cuenta LPDI. | SI | ✓ | |
| 20 | STARTUP/TEAM/EXIST/SI-ED/Bienvenida con Edición/NO-TYC/LPDI | “Bienvenido al equipo de {empresa} en el Ecosistema LPDI” | ${resetUrl} | Miembro aceptado CON permiso de edición. | NO | ✓ | |
| 21 | STARTUP/TEAM/EXIST/NO-ED/Bienvenida sin Edición/NO-TYC/LPDI | “Bienvenido al equipo de {empresa} en el Ecosistema LPDI” | ${resetUrl} | Miembro aceptado SIN permiso de edición. | NO | ✓ | |
| 22 | STARTUP/TEAM/EXIST/NO-ED/Confirmación de Rechazo/NO-TYC/LPDI | “Confirmación: no haces parte del equipo de {empresa}” | ${confirmAgainUrl} | Confirma rechazo exitoso de invitación. | NO | ✓ | |
| 23 | STARTUP/CEO/EXIST/SI-ED/Notificación Miembro Aceptó/NO-TYC/LPDI | “{miembro} aceptó la invitación al equipo de {empresa}” | eco.lpdi.co/dashboard | Avisa al equipo que un miembro aceptó. | NO | ✓ | |
| 24 | STARTUP/CEO/EXIST/SI-ED/Notificación Miembro Rechazó/NO-TYC/LPDI | “{miembro} rechazó la invitación al equipo de {empresa}” | eco.lpdi.co/dashboard | Avisa al equipo que un miembro rechazó. | NO | ✓ | |
| 25 | STARTUP/TEAM/EXIST/SI-ED/Cambio de Permisos/NO-TYC/LPDI | “Cambio de permisos en {empresa}” | eco.lpdi.co/dashboard | Notifica al miembro cuando el CEO modifica sus permisos. | NO | ✓ | |
| ICG — Registro y ciclo de vida de ICGs (3) | |||||||
| 28 | ICG/CON/NUEVO/NO-ED/Bienvenida Contacto/SI-TYC/LPDI | “{ICG} te ha asignado como contacto en el Ecosistema LPDI” | eco.lpdi.co/dashboard | Contacto designado sin cuenta LPDI. Incluye contraseña temporal. | SI | ✓ | |
| 29 | ICG/CON/EXIST/NO-ED/Bienvenida Contacto/NO-TYC/LPDI | “{ICG} te ha asignado como contacto en el Ecosistema LPDI” | eco.lpdi.co/dashboard | Contacto que ya tiene cuenta LPDI. | NO | ✓ | |
| 55 | NUEVO | ICG/USER/EXIST/NO-ED/Seguimiento de Score/NO-TYC/LPDI | “Aumenta el score de tu perfil en el Ecosistema LPDI” | /dashboard/icg/{id} | Versión ICG del Seguimiento de Score, con barra del semáforo. | NO | ✓ |
| ENTIDADES — Correos comunes a Startup e ICG (3) | |||||||
| 26 | ENTIDAD/USER/EXIST/NO-ED/Eliminación de Entidad/NO-TYC/LPDI | “El registro de {entidad} ha sido eliminado del Ecosistema LPDI” | ${dashboardUrl} | Notifica a todos los asociados que la entidad fue eliminada. | NO | ✓ | |
| 27 | ENTIDAD/USER/EXIST/NO-ED/Restauración de Entidad/NO-TYC/LPDI | “{entidad} ha sido restaurado en el Ecosistema LPDI” | ${dashboardUrl} | Notifica restauración desde la papelera. Aplica también a ICG. | NO | ✓ | |
| 56 | NUEVO | ENTIDAD/USER/NUEVO/NO-ED/Creación de Entidad/NO-TYC/LPDI | “Registraste tu {Startup/ICG} en el Ecosistema LPDI” | deep-link a la entidad | Confirma la creación de la entidad + score inicial con barra del semáforo. | NO | ✓ |
| 31 | CRON/ADMIN/EXIST/NO-ED/Reporte Diario/NO-TYC/LPDI | “Reporte diario Ecosistema LPDI — {fecha}” | CSV adjunto | Cron 6:00 AM Lima — altas/bajas + CSV de usuarios. | NO | ✓ | |
BENEFICIOS (PERKS) · notification-emails.ts (12) | |||||||
| 32 | FP/ALIADO/Registro Exitoso/NO-TYC/LPDI | “¡Registro exitoso de beneficio!” | /dashboard/beneficios | Al aliado: su beneficio quedó en revisión (al pasar a «enviado»). Funcionando. | NO | ✓ | |
| 33 | FP/EQUIPO/Nuevo por Aprobar/NO-TYC/LPDI | “Nuevo beneficio por aprobar” | /dashboard/beneficios/admin | Al admin asignado: beneficio nuevo por revisar. Funcionando. | NO | ✓ | |
| 34 | FP/ALIADO/Aprobado/NO-TYC/LPDI | “¡Beneficio aprobado!” | /perks/{id} | Al aliado: beneficio aprobado y publicado. Funcionando (admin). | NO | ✓ | |
| 35 | FP/ALIADO/Aprobado Programado/NO-TYC/LPDI | “¡Beneficio aprobado!” | /dashboard/beneficios | Al aliado: aprobado con fecha de publicación futura (F2); el cron publish-scheduled lo activa. Funcionando. | NO | ✓ | |
| 36 | FP/ALIADO/Actualizado/NO-TYC/LPDI | “¡Beneficio actualizado!” | /perks/{id} | Al aliado: cambios guardados (al editar un publicado → «edición»). Funcionando. | NO | ✓ | |
| 37 | FP/EQUIPO/Cambios por Aprobar/NO-TYC/LPDI | “Cambios de beneficio por aprobar” | /dashboard/beneficios/admin | Al equipo: un beneficio publicado tiene cambios por revisar (de «edición» → «enviado»). Funcionando. | NO | ✓ | |
| 38 | FP/ALIADO/Solicitud de Ajustes/NO-TYC/LPDI | “Tu beneficio necesita unos ajustes” | /dashboard/beneficios | Al aliado: el admin pide ajustes (status «cambios», recuperable: ajusta y reenvía). Incluye el detalle. Funcionando. | NO | ✓ | |
| 39 | FP/ALIADO/No Aceptado/NO-TYC/LPDI | “Beneficio no aceptado” | /dashboard/beneficios | Al aliado: rechazo definitivo. Template disponible; sin acción que lo dispare hoy (solicitar cambios usa el #38). | NO | ✓ | |
| 40 | FP/ALIADO/Terminado/NO-TYC/LPDI | “Beneficio terminado” | /dashboard/beneficios | Al aliado: beneficio cerrado (manual o por vigencia). Funcionando (admin desactivar). | NO | ✓ | |
| 41 | FP/ALIADO/Eliminado/NO-TYC/LPDI | “Beneficio eliminado” | /dashboard/beneficios | Al aliado: beneficio eliminado (enviado a papelera). Funcionando. | NO | ✓ | |
| 42 | FP/ALIADO/Registro en Beneficio/NO-TYC/LPDI | “¡Nuevo registro en tu beneficio!” | /dashboard/beneficios/referidos | Al aliado (cc partners@lpdi.co): un usuario se registró en su beneficio, con sus datos y el tipo de registro. Funcionando. | NO | ✓ | |
| 54 | NUEVO | FP/USUARIO/Solicitud recibida/NO-TYC/LPDI | “Recibimos tu solicitud — Ecosistema LPDI” | eco.lpdi.co | Al usuario (cc partners@lpdi.co): confirma que su solicitud de beneficio fue enviada al aliado + tipología. Funcionando. | NO | ✓ |
EVENTOS · notification-emails.ts (10) | |||||||
| 43 | FE/ORGANIZADOR/Registro Exitoso/NO-TYC/LPDI | “¡Registro exitoso de evento!” | /dashboard | Al organizador: evento registrado y en revisión (incluye código). Funcionando. | NO | ✓ | |
| 44 | FE/EQUIPO/Nuevo por Aprobar/NO-TYC/LPDI | “Nuevo evento por aprobar” | /dashboard | Al admin asignado: evento nuevo por revisar. Funcionando. | NO | ✓ | |
| 45 | FE/ORGANIZADOR/Aprobado/NO-TYC/LPDI | “¡Evento aprobado!” | /dashboard | Al organizador: evento aprobado. Funcionando. | NO | ✓ | |
| 46 | FE/ORGANIZADOR/Aprobado Programado/NO-TYC/LPDI | “¡Evento aprobado!” | /dashboard | Al organizador: aprobado con fecha de publicación futura (F2). Funcionando. | NO | ✓ | |
| 47 | FE/ORGANIZADOR/Actualizado/NO-TYC/LPDI | “¡Evento actualizado!” | /dashboard | Al organizador: su evento publicado fue actualizado. Funcionando. | NO | ✓ | |
| 48 | FE/EQUIPO/Cambios por Aprobar/NO-TYC/LPDI | “Cambios de evento por aprobar” | /dashboard | Al equipo: un usuario sin auto-aprobación envió cambios que deben revisarse. Pendiente — se activa con «Mis eventos». | NO | ✓ | |
| 49 | FE/ORGANIZADOR/No Aceptado/NO-TYC/LPDI | “Evento no aceptado” | /dashboard | Al organizador: evento no aceptado. Funcionando. | NO | ✓ | |
| 50 | FE/ORGANIZADOR/Eliminado/NO-TYC/LPDI | “Evento eliminado” | /dashboard | Al organizador: evento eliminado. Funcionando. | NO | ✓ | |
| 51 | FE/ORGANIZADOR/Publicación Automática/NO-TYC/LPDI | “¡Publicación automática de evento!” | /dashboard | Al organizador (cc admin): evento publicado automáticamente por privilegio de auto-publicación (F6). Funcionando. | NO | ✓ | |
| 52 | FE/ORGANIZADOR/Solicitud de Ajustes/NO-TYC/LPDI | “Tu evento necesita unos ajustes” | /dashboard | Al organizador (cc al admin que la envía): el admin pide ajustes a un evento, con el detalle. Espejo del #38 de FP. Funcionando. | NO | ✓ | |
| CORREOS ELIMINADOS — consolidados o retirados del sistema (3) | |||||||
| 17 | ELIMINADO | Expiración de Registro (Startup) — No se obliga a confirmar la creación de una startup. | |||||
| 19 | ELIMINADO | Invitación al Equipo (usuario existente) — Consolidado en #18 — mismo template (buildTeamInvitationHtml), las dos ramas (usuario nuevo / usuario existente) las maneja el flag userExists. | |||||
| 30 | ELIMINADO | Expiración de Registro ICG — No se obliga a confirmar la creación de un ICG. | |||||
| Nombre técnico | USUARIO/USER/NUEVO/NO-ED/Confirmación de Correo/NO-TYC/SUPA |
| Función en código | Supabase Auth — Confirm signup template |
| Asunto | “Confirma tu cuenta en el Ecosistema LPDI” |
| Trigger | Supabase Auth dispara tras signup o signInWithOtp |
| Destinatario | Email del usuario nuevo |
| CTA | Botón: “Confirmar mi cuenta” Destino: {{ .ConfirmationURL }} → redirige a https://eco.lpdi.co/ (SITE_URL con token de confirmación) |
| Descripción | Correo automático de Supabase para verificar que el email es válido al crear una cuenta nueva. El diseño usa el template personalizado configurado en el dashboard de Supabase con branding LPDI. |
| TyC / Tratamiento | NO — Los TyC se aceptan en el formulario de la aplicación ANTES de que Supabase envíe este correo. |
PREVIEW DEL CORREO
| Nombre técnico | USUARIO/USER/EXIST/NO-ED/Recuperación de Contraseña/NO-TYC/SUPA |
| Función en código | Supabase Auth — Reset password template |
| Asunto | “Restablece tu contraseña — Ecosistema LPDI” |
| Trigger | Usuario solicita reset de contraseña vía /auth/reset |
| Destinatario | Email del usuario |
| CTA | Botón: “Restablecer mi contraseña” Destino: https://eco.lpdi.co/auth/recuperar?token_hash=...&type=recovery |
| Descripción | Permite al usuario restablecer su contraseña mediante un enlace seguro con expiración (por defecto 24h). Template personalizado con branding LPDI. |
| TyC / Tratamiento | NO — Acción de seguridad/recuperación. No requiere aceptación. |
PREVIEW DEL CORREO
| Nombre técnico | USUARIO/USER/NUEVO/NO-ED/Magic Link/NO-TYC/SUPA |
| Función en código | Supabase Auth — Magic link template |
| Asunto | “Tu enlace de acceso — Ecosistema LPDI” |
| Trigger | Admin invita usuario vía supabase.auth.admin.inviteUserByEmail() |
| Destinatario | Email del usuario invitado |
| CTA | Botón: “Iniciar sesión” Destino: {{ .ConfirmationURL }} → redirige a https://eco.lpdi.co/ (SITE_URL) |
| Descripción | Enlace mágico para acceso directo sin contraseña. Actualmente NO se usa en el flujo principal (las invitaciones van por correos #14/#15). Reservado para invitaciones administrativas manuales. |
| TyC / Tratamiento | NO — TyC deberían validarse en la aplicación al llegar. |
PREVIEW DEL CORREO
| Nombre técnico | USUARIO/USER/EXIST/NO-ED/Cambio de Correo/NO-TYC/SUPA |
| Función en código | Supabase Auth — Change email template |
| Asunto | “Confirma el cambio de correo — Ecosistema LPDI” |
| Trigger | Usuario cambia su email desde configuración de cuenta |
| Destinatario | Email nuevo del usuario |
| CTA | Botón: “Confirmar cambio de correo” Destino: {{ .ConfirmationURL }} → redirige a https://eco.lpdi.co/ (SITE_URL) |
| Descripción | Verificación del nuevo correo cuando el usuario actualiza su dirección de email. El email anterior sigue activo hasta que se confirme el nuevo. |
| TyC / Tratamiento | NO — Verificación de identidad. No requiere nueva aceptación. |
PREVIEW DEL CORREO
| Nombre técnico | USUARIO/USER/NUEVO/NO-ED/Invitación Admin/NO-TYC/SUPA |
| Función en código | Supabase Auth — Invite template |
| Asunto | “Has sido invitado al Ecosistema LPDI” |
| Trigger | Admin invita usuario desde Supabase Dashboard vía inviteUserByEmail() |
| Destinatario | Email del usuario invitado por admin |
| CTA | Botón: “Aceptar invitación” Destino: {{ .ConfirmationURL }} → redirige a https://eco.lpdi.co/ (SITE_URL) |
| Descripción | Template de invitación directa. Actualmente NO se usa en el flujo normal del sistema (las invitaciones de equipo van por correos #14/#15 del sistema LPDI). Disponible para invitaciones manuales desde el dashboard de Supabase. |
| TyC / Tratamiento | NO — TyC se validan en la aplicación al llegar. |
PREVIEW DEL CORREO
| Nombre técnico | USUARIO/USER/EXIST/NO-ED/Reautenticación OTP/NO-TYC/SUPA |
| Función en código | Supabase Auth — Reauthentication template |
| Asunto | “Código de verificación — Ecosistema LPDI” |
| Trigger | Usuario intenta una acción que requiere reautenticación (ej: cambio de contraseña, eliminación de cuenta) |
| Destinatario | Email del usuario |
| CTA | Sin botón CTA — muestra código OTP {{ .Token }} en el cuerpo del correo |
| Descripción | Envía un código numérico de verificación para acciones sensibles. El usuario debe ingresar el código en la aplicación para continuar. |
| TyC / Tratamiento | NO — Es verificación de identidad para seguridad. |
PREVIEW DEL CORREO
| Nombre técnico | USUARIO/USER/EXIST/NO-ED/Notificación Correo Cambiado/NO-TYC/SUPA |
| Función en código | Supabase Auth — Email changed notification |
| Asunto | “Tu correo electrónico ha sido actualizado — Ecosistema LPDI” |
| Trigger | Supabase detecta que el email del usuario fue cambiado exitosamente |
| Destinatario | Email anterior del usuario (el que se reemplazó) |
| CTA | Sin CTA — correo informativo (notificación de seguridad) |
| Descripción | Notificación automática de seguridad enviada al email ANTERIOR cuando el usuario cambia su dirección. Permite al usuario detectar cambios no autorizados. |
| TyC / Tratamiento | NO — Correo informativo de seguridad. |
PREVIEW DEL CORREO
| Nombre técnico | USUARIO/USER/EXIST/NO-ED/Notificación Contraseña Cambiada/NO-TYC/SUPA |
| Función en código | Supabase Auth — Password changed notification |
| Asunto | “Tu contraseña ha sido cambiada — Ecosistema LPDI” |
| Trigger | Supabase detecta que la contraseña del usuario fue cambiada |
| Destinatario | Email del usuario |
| CTA | Sin CTA — correo informativo (notificación de seguridad) |
| Descripción | Notificación automática de seguridad enviada por Supabase cuando se detecta un cambio de contraseña. Diferente al correo #10 que es enviado por el sistema LPDI. |
| TyC / Tratamiento | NO — Correo informativo de seguridad. |
PREVIEW DEL CORREO
| Nombre técnico | USUARIO/USER/EXIST/NO-ED/Eliminación de Cuenta/NO-TYC/LPDI |
| Función en código | sendAccountDeletedEmail |
| Asunto | “Tu cuenta en el Ecosistema LPDI ha sido eliminada” |
| Trigger | Usuario elimina su cuenta desde /api/account/delete |
| Destinatario | Email del usuario que eliminó su cuenta |
| CTA | Botón: “Registrarme de nuevo” Destino: https://eco.lpdi.co (hardcoded) |
| Descripción | Confirmación de que la cuenta fue eliminada voluntariamente. Los datos se marcan para eliminación. Si desea volver, debe registrarse de nuevo. |
| TyC / Tratamiento | NO — Correo informativo. Si se re-registra, se pedirán TyC nuevamente. |
PREVIEW DEL CORREO
| Nombre técnico | USUARIO/USER/EXIST/NO-ED/Contraseña Actualizada/NO-TYC/LPDI |
| Función en código | sendPasswordChangedEmail |
| Asunto | “Tu contraseña ha sido actualizada — Ecosistema LPDI” |
| Trigger | Usuario cambia su contraseña exitosamente desde el sistema LPDI |
| Destinatario | Email del usuario |
| CTA | Botón: “Restablecer contraseña” (emergencia) Destino: https://eco.lpdi.co/auth/recuperar (hardcoded) |
| Descripción | Notificación enviada por el sistema LPDI (no Supabase) que confirma al usuario que su contraseña fue actualizada. Complementa al correo #08 de Supabase. |
| TyC / Tratamiento | NO — Correo informativo de seguridad. |
PREVIEW DEL CORREO
| Nombre técnico | USUARIO/USER/AMBOS/NO-ED/Actualización T&C y Política/NO-TYC/LPDI |
| Función en código | sendAccountUpdateNotificationEmail |
| Asunto | “Actualizamos nuestras condiciones y políticas — Ecosistema LPDI” |
| Trigger | Publicación de una versión nueva de T&C / Política de Datos (cutover del lifecycle) |
| Destinatario | Usuarios con aceptación válida previa (Grupo A) — aceptación tácita por uso continuado |
| CTA | Enlaces a los documentos actualizados (T&C + Política). Sin botón de acción. |
| Descripción | Informa la publicación de una versión nueva de los documentos legales. Reutilizable: parámetros changes / termsUrl / privacyUrl para futuras actualizaciones. El Grupo B (nunca aceptó válidamente, <25-may) NO recibe tácita: va por casilla expresa al próximo login. |
| TyC / Tratamiento | SÍ (informativo) — Aceptación TÁCITA por uso continuado; no incluye casilla. Aprobado por Frank 2026-07-02. |
PREVIEW DEL CORREO
| Nombre técnico | STARTUP/CEO/NUEVO/SI-ED/Bienvenida Registro/SI-TYC/LPDI |
| Función en código | sendStartupWelcomeEmail |
| Asunto | “Bienvenido al Ecosistema LPDI — Confirma tu cuenta” |
| Trigger | Registro de startup en /registro-startup (formulario completado) |
| Destinatario | Email del CEO que registra la startup |
| CTA | Botón: “Confirmar mi cuenta y ver mi registro” Destino: ${confirmUrl} → URL de confirmación Supabase (redirige a SITE_URL) |
| Descripción | Correo de bienvenida al registrante de una startup. La startup queda en estado “pendiente” hasta que el CEO confirme. Si no confirma en 7 días, se activan los correos #15, #16 y eventualmente #17. |
| TyC / Tratamiento | SÍ — El formulario de registro (/registro-startup) tiene checkbox obligatorio de TyC y Política de Tratamiento de Datos ANTES de enviar. El consent se graba en consent_log con flow=“FS”. |
PREVIEW DEL CORREO
| Nombre técnico | STARTUP/CEO/NUEVO/SI-ED/Bienvenida CEO Designado/SI-TYC/LPDI |
| Función en código | sendCeoWelcomeEmail (userExists=false) |
| Asunto | “Bienvenido al Ecosistema LPDI — {empresa}” |
| Trigger | Registro de startup → el email del CEO NO existe como usuario en Supabase Auth |
| Destinatario | Email del CEO designado durante registro de startup |
| CTA | Botón: “Ver mi registro” (existente) / “Confirmar mi cuenta” (nuevo) Destino: Existente: https://eco.lpdi.co/dashboard | Nuevo: ${resetUrl} (reset Supabase) |
| Descripción | Se envía cuando el registrante de la startup designa un CEO cuyo email no tiene cuenta en LPDI. Incluye contraseña temporal visible. Solo ocurre cuando el CEO es persona distinta al registrante. |
| TyC / Tratamiento | SÍ — El flujo destino (/auth/reset-password) detecta 0 registros en consent_log y muestra checkboxes obligatorios de TyC y Tratamiento de Datos. Implementado en LAP-325. |
PREVIEW DEL CORREO
| Nombre técnico | STARTUP/CEO/EXIST/SI-ED/Bienvenida CEO Designado/NO-TYC/LPDI |
| Función en código | sendCeoWelcomeEmail (userExists=true) |
| Asunto | “Has sido designado CEO de {empresa} en el Ecosistema LPDI” |
| Trigger | Registro de startup → el email del CEO YA existe como usuario |
| Destinatario | Email del CEO |
| CTA | Botón: “Ver mi registro” (existente) / “Establecer nueva contraseña” (nuevo) Destino: Existente: https://eco.lpdi.co/dashboard | Nuevo: ${resetUrl} (reset Supabase) |
| Descripción | Se envía cuando el CEO designado ya tiene cuenta LPDI. No se muestra contraseña. Botón directo al dashboard. |
| TyC / Tratamiento | NO — El CEO ya tiene cuenta y aceptó TyC previamente. |
PREVIEW DEL CORREO
| Nombre técnico | STARTUP/CEO/EXIST/SI-ED/Seguimiento de Score/NO-TYC/LPDI |
| Función en código | sendStartupFollowupEmail |
| Asunto | “Aumenta el score de tu perfil en el Ecosistema LPDI” |
| Trigger | Cron pg_cron horario → POST /api/cron/startup-followup. Procesa DOS ventanas por corrida:• Día 2 — startups creadas hace 24–48 h; marca followup_sent_at.• Día 30 — startups creadas hace 720–744 h; marca followup_30d_sent_at.Condiciones por ventana: la marca respectiva en NULL, deleted_at IS NULL y la cuenta registradora con email confirmado. La ventana de día 30 queda inerte hasta aplicar la migración 090 (columna followup_30d_sent_at). |
| Destinatario | Contacto de la startup (contact_email) + miembros de startup_founders con can_edit_form=true y verification_status='verified'. |
| CTA | Botón: “Aumentar mi score” Destino: ${profileUrl} → perfil de la startup en dashboard |
| Descripción | Recordatorio automático para que el equipo complete el perfil de la startup y suba su score de visibilidad. El correo muestra el score actual con la barra del semáforo. Nota: el cron NO filtra por score en la consulta — se envía a toda startup confirmada dentro de la ventana que aún no tenga la marca correspondiente. |
| TyC / Tratamiento | NO — El usuario ya aceptó TyC durante el registro. |
PREVIEW DEL CORREO
| Nombre técnico | STARTUP/CEO/NUEVO/SI-ED/Recordatorio día 3/NO-TYC/LPDI |
| Función en código | sendStartupReminderEmail (isUrgent=false) |
| Asunto | “Recordatorio: confirma tu cuenta en el Ecosistema LPDI” |
| Trigger | Cron /api/cron/startup-welcome-reminders — día 3 sin confirmar email |
| Destinatario | Todos los miembros de la startup que no han confirmado su cuenta (email_confirmed_at IS NULL). Nota: en código se consulta startup_founders, que incluye CEO y equipo. Usar “miembros” para distinguir de futuros “founders” formales. |
| CTA | Botón: “Confirmar mi cuenta” Destino: ${confirmUrl} → URL de confirmación Supabase |
| Descripción | Primer recordatorio amigable si los miembros no han confirmado su correo 3 días después del registro. Muestra días restantes (4 días). Si confirman antes del día 6, no se envía el correo #16. |
| TyC / Tratamiento | NO — TyC ya fueron aceptados en el registro. |
PREVIEW DEL CORREO
| Nombre técnico | STARTUP/CEO/NUEVO/SI-ED/Recordatorio Urgente día 6/NO-TYC/LPDI |
| Función en código | sendStartupReminderEmail (isUrgent=true) |
| Asunto | “Ultimo aviso: confirma tu cuenta en el Ecosistema LPDI” |
| Trigger | Cron /api/cron/startup-welcome-reminders — día 6 sin confirmar email |
| Destinatario | Todos los miembros de la startup que no han confirmado su cuenta (email_confirmed_at IS NULL). Misma lógica que correo #15. |
| CTA | Botón: “Confirmar mi cuenta” Destino: ${confirmUrl} → URL de confirmación Supabase |
| Descripción | Aviso urgente con banner amarillo “tu cuenta expira en menos de 24 horas”. Si ningún miembro confirma, al día 8 el cron hace soft-delete del registro de la startup (marca deleted_at + delete_scheduled_for a 30 días); ese paso NO envía ningún correo. |
| TyC / Tratamiento | NO — TyC ya aceptados en registro. |
PREVIEW DEL CORREO
/api/cron/startup-welcome-reminders, que consulta la tabla startups, arma el correo con el nombre de la empresa y, al día 8, hace soft-delete del registro de la startup (vía sendStartupReminderEmail). Por eso se clasifican bajo STARTUP y no bajo USUARIO.| Nombre técnico | STARTUP/TEAM/NUEVO/NO-ED/Invitación al Equipo/SI-TYC/LPDI · STARTUP/TEAM/EXIST/NO-ED/Invitación al Equipo/NO-TYC/LPDI |
| Función en código | sendTeamInvitationEmail (paramía por userExists + canEdit + addedByName) |
| Asunto | “{Nombre de quien agrega} te ha incluido en el equipo de {empresa} — confirma tu registro” |
| Trigger | Un miembro con privilegio de edición agrega miembro en Panel 6 (Equipo). El template se ejecuta sea cual sea el estado del invitado: usuario nuevo o existente. |
| Destinatario | Email del miembro invitado (ingresado por quien tiene privilegio de edición) |
| CTA | 2 botones: “Confirmar mi vinculación” (verde) / “No hago parte” (rojo) Destino: Confirmar: ${confirmUrl} | Rechazar: ${rejectUrl} (rutas /team/confirmar) |
| Descripción | Invitación a unirse al equipo de una startup. Muestra tabla con datos registrados (nombre, email, cargo, permiso de edición asignado). El bloque de TyC solo aparece cuando el invitado aún no tiene cuenta LPDI. |
| Variantes | 4 variantes por cruce de 2 ejes: usuario nuevo/existente × con/sin permiso de edición. (a) Nuevo + CON edición: Persona sin cuenta LPDI, con permiso de editar. Al confirmar, se le piden TyC y Tratamiento de Datos (checkboxes obligatorios en pantalla de confirmación). El consent se graba en consent_log con flow=“team_invitation”.(b) Nuevo + SIN edición: Persona sin cuenta LPDI, solo lectura. Misma lógica de TyC que variante (a). (c) Existente + CON edición: Persona con cuenta LPDI activa + permiso de editar. NO se piden TyC (ya los aceptó previamente). Solo confirma vinculación. (d) Existente + SIN edición: Persona con cuenta LPDI activa, solo lectura. NO se piden TyC. Solo confirma vinculación. |
| TyC / Tratamiento | Variantes (a) y (b) — SÍ (usuario nuevo, acepta en pantalla de confirmación) · Variantes (c) y (d) — NO (usuario existente, ya tiene consent previo) |
can_edit_form=true) puede agregar a otro miembro al equipo. El privilegio que se asigna al invitado (SI-ED o NO-ED) lo decide quien crea la invitación al momento de capturar el miembro./team/confirmar, donde aparecen (o no) los checkboxes según si el usuario ya tiene cuenta.PREVIEW — Variante (a) Nuevo + CON edición
PREVIEW — Variante (b) Nuevo + SIN edición
PREVIEW — Variante (c) Existente + CON edición
PREVIEW — Variante (d) Existente + SIN edición
| Nombre técnico | STARTUP/TEAM/EXIST/SI-ED/Bienvenida con Edición/NO-TYC/LPDI |
| Función en código | sendTeamWelcomeWithEditEmail |
| Asunto | “Bienvenido al equipo de {empresa} en el Ecosistema LPDI” |
| Trigger | Miembro hace clic en “Confirmar mi vinculación” + tiene canEdit=true |
| Destinatario | Email del miembro que confirmó su vinculación |
| CTA | Botón: “Ir al dashboard” Destino: eco.lpdi.co/dashboard |
| Descripción | Confirma al miembro (usuario existente) que fue aceptado en el equipo CON permiso de edición. No incluye contraseña temporal (el usuario ya existe y usa su propia contraseña). Nota: “tu CEO te otorgó permisos para editar”. |
| TyC / Tratamiento | NO — TyC ya fueron aceptados en el correo de invitación (#18) o en su registro original. |
PREVIEW DEL CORREO
| Nombre técnico | STARTUP/TEAM/EXIST/NO-ED/Bienvenida sin Edición/NO-TYC/LPDI |
| Función en código | sendTeamWelcomeNoEditEmail |
| Asunto | “Bienvenido al equipo de {empresa} en el Ecosistema LPDI” |
| Trigger | Miembro confirma vinculación + tiene canEdit=false |
| Destinatario | Email del miembro que confirmó su vinculación |
| CTA | Botón: “Ir al dashboard” Destino: eco.lpdi.co/dashboard |
| Descripción | Confirma al miembro que fue aceptado en el equipo SIN permiso de edición. Solo puede ver información, no modificarla. No incluye contraseña temporal (el usuario ya existe en el sistema y usa su propia contraseña). |
| TyC / Tratamiento | NO — Mismo caso que correo #20. TyC ya aceptados previamente. |
PREVIEW DEL CORREO
| Nombre técnico | STARTUP/TEAM/EXIST/NO-ED/Confirmación de Rechazo/NO-TYC/LPDI |
| Función en código | sendTeamRejectionConfirmationEmail |
| Asunto | “Confirmación: no haces parte del equipo de {empresa}” |
| Trigger | Miembro hace clic en “No hago parte de la compañía” desde correo #18 o #19 |
| Destinatario | Email del miembro que rechazó la invitación |
| CTA | Botón condicional: “Confirmar mi vinculación” (si fue error) Destino: ${confirmAgainUrl} (condicional, puede ser null → sin CTA) |
| Descripción | Confirma al miembro que rechazó exitosamente la invitación. Si fue un error, puede contactar al CEO para que lo vuelva a invitar. |
| TyC / Tratamiento | NO — Correo informativo de confirmación de rechazo. |
PREVIEW DEL CORREO
| Nombre técnico | STARTUP/CEO/EXIST/SI-ED/Notificación Miembro Aceptó/NO-TYC/LPDI |
| Función en código | sendCeoMemberConfirmationEmail |
| Asunto | “{miembro} aceptó la invitación al equipo de {empresa}” |
| Trigger | Miembro acepta invitación (hace clic en “Confirmar mi vinculación”) |
| Destinatario | Todos los miembros del equipo de la startup |
| CTA | Botón: “Ir al dashboard” Destino: https://eco.lpdi.co/dashboard (hardcoded) |
| Descripción | Avisa al equipo que un miembro aceptó la invitación. Muestra quién confirmó, su email y los permisos asignados. |
| TyC / Tratamiento | NO — Correo informativo al CEO. |
PREVIEW DEL CORREO
| Nombre técnico | STARTUP/CEO/EXIST/SI-ED/Notificación Miembro Rechazó/NO-TYC/LPDI |
| Función en código | sendCeoMemberRejectionEmail |
| Asunto | “{miembro} rechazó la invitación al equipo de {empresa}” |
| Trigger | Miembro rechaza invitación (hace clic en “No hago parte de la compañía”) |
| Destinatario | Todos los miembros del equipo de la startup |
| CTA | Botón: “Ir al dashboard” Destino: https://eco.lpdi.co/dashboard (hardcoded) |
| Descripción | Avisa al equipo que un miembro rechazó la invitación. Sugiere comunicarse con la persona si fue un error. |
| TyC / Tratamiento | NO — Correo informativo al CEO. |
PREVIEW DEL CORREO
| Nombre técnico | STARTUP/TEAM/EXIST/SI-ED/Cambio de Permisos/NO-TYC/LPDI |
| Función en código | sendPermissionChangeEmail |
| Asunto | “Cambio de permisos en {empresa}” |
| Trigger | Cualquier usuario con permisos de edición modifica los permisos de otro miembro del equipo |
| Destinatario | Email del miembro cuyo permiso cambió |
| CTA | Botón: “Ir al dashboard” Destino: https://eco.lpdi.co/dashboard (hardcoded) |
| Descripción | Notifica al miembro cuando el CEO modifica sus permisos de edición en el equipo (por ejemplo, de solo lectura a edición o viceversa). Detectado en código, no estaba en el reporte v1. |
| TyC / Tratamiento | NO — Correo informativo. |
PREVIEW DEL CORREO
| Nombre técnico | ICG/CON/NUEVO/NO-ED/Bienvenida Contacto/SI-TYC/LPDI |
| Función en código | sendContactWelcomeEmail (userExists=false) |
| Asunto | “{ICG} te ha asignado como contacto en el Ecosistema LPDI” |
| Trigger | ICG registra contacto de compañía en /registro-icg o /dashboard/icg/nuevo — el contacto NO tiene cuenta LPDI |
| Destinatario | Email del contacto designado por el ICG |
| CTA | Botón: “Ver mi registro” (existente) / “Establecer nueva contraseña” (nuevo) Destino: Existente: https://eco.lpdi.co/dashboard | Nuevo: ${resetUrl} (reset Supabase) |
| Descripción | Se envía al contacto designado por un ICG cuando NO tiene cuenta LPDI. Incluye contraseña temporal visible. Si isNewIcg=false, dice “ha actualizado su perfil” en vez de “se ha registrado”. |
| TyC / Tratamiento | SÍ — El flujo destino (/auth/reset-password) detecta 0 registros en consent_log y muestra checkboxes obligatorios. Guard en /dashboard redirige a /aceptar-terminos si no hay consent. |
PREVIEW DEL CORREO
| Nombre técnico | ICG/CON/EXIST/NO-ED/Bienvenida Contacto/NO-TYC/LPDI |
| Función en código | sendContactWelcomeEmail (userExists=true) |
| Asunto | “{ICG} te ha asignado como contacto en el Ecosistema LPDI” |
| Trigger | ICG registra contacto de compañía — el contacto YA tiene cuenta LPDI |
| Destinatario | Email del contacto designado por el ICG |
| CTA | Botón: “Ver mi registro” (existente) / “Confirmar mi cuenta” (nuevo) Destino: Existente: https://eco.lpdi.co/dashboard | Nuevo: ${resetUrl} (reset Supabase) |
| Descripción | Se envía al contacto que ya tiene cuenta LPDI. NO se muestra contraseña temporal. Solo le notifica la nueva vinculación como contacto del ICG. |
| TyC / Tratamiento | NO — Ya tiene cuenta y aceptó TyC previamente. Guard en /dashboard verifica como red de seguridad. |
PREVIEW DEL CORREO
| Nombre técnico | ICG/USER/EXIST/NO-ED/Seguimiento de Score/NO-TYC/LPDI |
| Función en código | sendIcgFollowupEmail |
| Asunto | “Aumenta el score de tu perfil en el Ecosistema LPDI” |
| Trigger | Cron pg_cron horario → POST /api/cron/icg-followup. DOS ventanas por corrida: día 2 (creados hace 24–48 h, marca followup_sent_at) y día 30 (creados hace 720–744 h, marca followup_30d_sent_at), solo con la cuenta dueña confirmada y deleted_at IS NULL. El correo se envía al contact_email del ICG. |
| Destinatario | Contacto/responsable del ICG |
| CTA | Botón: “Completar mi perfil” → deep-link /dashboard/icg/{id} |
| Descripción | Versión ICG del Seguimiento de Score. Muestra el score con la barra del semáforo (rojo/ámbar/verde). Espejo del de startup (#14). |
| Estado | Correo listo; cron codificado con ambas ventanas (día 2 + día 30), INERTE hasta la migración 090 (agrega las columnas followup_sent_at y followup_30d_sent_at a icgs). |
PREVIEW DEL CORREO

sendEntityCreatedEmail para startup e ICG. Para ICG se dispara en registro-icg, dashboard/icg/nuevo y dashboard/icg/nuevo-simplificado.| Nombre técnico | STARTUP/USER/EXIST/NO-ED/Eliminación de Entidad/NO-TYC/LPDI |
| Función en código | sendEntityDeletedEmail |
| Asunto | “El registro de {entidad} ha sido eliminado del Ecosistema LPDI” |
| Trigger | Usuario elimina startup o ICG desde /api/entities/delete |
| Destinatario | Miembros asociados a la entidad (CEO, equipo, contacto) CON permiso de edición. Miembros SIN edición reciben variante informativa (correo #26b) sin CTA Restaurar. |
| CTA | Botón: “Restaurar” Destino: https://eco.lpdi.co/dashboard (sección papelera) |
| Descripción | Notifica a los miembros con edición que la entidad fue eliminada. Incluye quién dio la orden. Los datos se eliminan permanentemente en 30 días. Miembros sin edición reciben un correo solo informativo con el contacto del responsable. |
| TyC / Tratamiento | NO — Correo informativo. La restauración no requiere nueva aceptación. |
sendEntityDeletedEmail es genérica.PREVIEW — CON EDICIÓN (CTA Restaurar)
PREVIEW — SIN EDICIÓN (solo informativo)
| Nombre técnico | STARTUP/USER/EXIST/NO-ED/Restauración de Entidad/NO-TYC/LPDI |
| Función en código | sendEntityRestoredEmail |
| Asunto | “{entidad} ha sido restaurado en el Ecosistema LPDI” |
| Trigger | Usuario restaura una entidad desde la papelera del dashboard |
| Destinatario | Miembros asociados a la entidad restaurada |
| CTA | Botón: “Ver en Dashboard” Destino: ${dashboardUrl} → https://eco.lpdi.co/dashboard |
| Descripción | Notifica a los asociados que la entidad fue restaurada exitosamente desde la papelera. Aplica tanto a Startups como a ICGs. |
| TyC / Tratamiento | NO — Correo informativo. |
PREVIEW DEL CORREO
| Nombre técnico | ENTIDAD/USER/NUEVO/NO-ED/Creación de Entidad/NO-TYC/LPDI |
| Función en código | sendEntityCreatedEmail |
| Asunto | “Registraste tu {Startup/ICG} en el Ecosistema LPDI” |
| Trigger | Al crear una entidad, best-effort (no bloqueante), en TODAS las vías de registro: • Startup: registro-startup, dashboard/startups/nuevo, dashboard/startups/nuevo-detallado.• ICG: registro-icg, dashboard/icg/nuevo, dashboard/icg/nuevo-simplificado. |
| Destinatario | Usuario que registró la entidad |
| CTA | Botón: “Completar mi perfil” → deep-link a la entidad (/dashboard/startups/{id} o /dashboard/icg/{id}) |
| Variantes | 2: Startup e ICG (mismo diseño, label dinámico) |
| Descripción | Confirma que la entidad se creó correctamente + muestra el score inicial con la barra del semáforo. Motiva a completar el perfil. |
| Estado | Correo listo y CABLEADO — sendEntityCreatedEmail se invoca (best-effort) en las 6 vías de creación de startup e ICG. |
PREVIEW DEL CORREO

| Nombre técnico | CRON/ADMIN/EXIST/NO-ED/Reporte Diario/NO-TYC/LPDI |
| Función en código | buildDailyReportHtml + sendDailyReportEmail (email-daily-report.ts) |
| Endpoint | GET /api/cron/daily-report (protegido con Authorization: Bearer ${CRON_SECRET}) |
| Asunto | “Reporte diario Ecosistema LPDI — {fecha}” |
| Trigger | Cron diario configurado a las 6:00 AM Lima/Bogotá (11:00 UTC) en vercel.json |
| Destinatario | comunidad@lpdi.co (configurable vía DAILY_REPORT_TO) |
| Remitente | “Ecosistema LPDI” <no-reply@lpdi.co> vía Resend SMTP |
| Secciones |
• Altas del día anterior — Startups (STARTUP/PYME/SCALEUP), ICGs (todos los tipos), usuarios individuales (profiles sin entidad). Incluye fila “Total usuarios registrados” = usuarios individuales + miembros sumados a una entidad existente + responsables de las nuevas entidades. • Bajas del día anterior — Startups e ICGs (soft-delete vía deleted_at) + usuarios individuales (vía profile_deletions_log)• Acumulado — Entidades — Subtotales por tipo de Startup (STARTUP/PYME/SCALEUP) e ICG (INVESTOR_INDIVIDUAL/CORPORATE/HUB_NETWORK/etc.) + TOTAL ENTIDADES • Acumulado — Usuarios — Usuarios individuales (sin entidad) + Total usuarios registrados (destacado, todos los profiles del sistema) |
| CSV adjuntos (2) | Sí — (1) Altas: ecosistema-lpdi-usuarios-YYYY-MM-DD.csv con columnas: Email, Nombre completo, Fecha de registro, Tipo de usuario, Subcategoría del rol, País. (2) Bajas (Frank 26-jun): anexo aparte con usuarios y/o entidades dados de baja el día. Ambos van como attachment. |
| Preview | ![]() |
| CTA | Sin botón — correo informativo con datos tabulares. |
| TyC / Tratamiento | NO — Correo administrativo interno. No requiere consentimiento del destinatario. |
| Audit log | Las bajas de usuarios individuales se consultan desde profile_deletions_log (migración 045). Datos identificables < 12 meses; anonimización automática tras 12 meses (purga corre desde purge_expired_entities RPC). |

| Nombre técnico | FP/ALIADO/Registro Exitoso |
| Función en código | sendPerkNotification('registro_exitoso') |
| Asunto | “¡Registro exitoso de beneficio!” |
| Trigger | PATCH /api/perks/[id] al pasar a enviado (desde otro estado). |
| Destinatario | Aliado (correo del registrante) |
| CTA | Botón: “Ver registro” → /dashboard/beneficios |
| Descripción | Confirma al aliado que su beneficio quedó en revisión por el equipo LPDI. |
| Estado | Funcionando. |
PREVIEW DEL CORREO
| Nombre técnico | FP/EQUIPO/Nuevo por Aprobar |
| Función en código | sendPerkNotification('nuevo_por_aprobar') |
| Asunto | “Nuevo beneficio por aprobar” |
| Trigger | PATCH → enviado desde borrador/cambios. |
| Destinatario | Admin asignado |
| CTA | Botón: “Revisar beneficio” → /dashboard/beneficios/admin |
| Descripción | Avisa al equipo que hay un beneficio nuevo pendiente de aprobación. |
| Estado | Funcionando. |
PREVIEW DEL CORREO
| Nombre técnico | FP/ALIADO/Aprobado |
| Función en código | sendPerkNotification('aprobado') |
| Asunto | “¡Beneficio aprobado!” |
| Trigger | Acción admin aprobar_y_publicar/publicar. |
| Destinatario | Aliado |
| CTA | Botón: “Ver beneficio” → /perks/{id} |
| Descripción | Notifica al aliado que su beneficio fue aprobado y publicado. |
| Estado | Funcionando. |
PREVIEW DEL CORREO
| Nombre técnico | FP/ALIADO/Aprobado Programado |
| Función en código | sendPerkNotification('aprobado_programado') |
| Asunto | “¡Beneficio aprobado!” |
| Trigger | Acción admin aprobar con fecha de publicación futura (vigencia posterior a la aprobación). |
| Destinatario | Aliado |
| CTA | Botón: “Ver registro” → /dashboard/beneficios |
| Descripción | Segundo flujo del Correo 34 (F2): notifica la aprobación e informa la fecha futura en que el beneficio se publicará automáticamente. El cron publish-scheduled lo activa en esa fecha. |
| Estado | Funcionando. NUEVO (F2). |
PREVIEW DEL CORREO
| Nombre técnico | FP/ALIADO/Actualizado |
| Función en código | sendPerkNotification('actualizado') |
| Asunto | “¡Beneficio actualizado!” |
| Trigger | PATCH al pasar un publicado a edicion. |
| Destinatario | Aliado |
| CTA | Botón: “Ver beneficio” → /perks/{id} |
| Descripción | Confirma que los cambios se guardaron y pasarán por aprobación. |
| Estado | Funcionando. |
PREVIEW DEL CORREO
| Nombre técnico | FP/EQUIPO/Cambios por Aprobar |
| Función en código | sendPerkNotification('cambios_por_aprobar') |
| Asunto | “Cambios de beneficio por aprobar” |
| Trigger | PATCH → enviado desde edicion. |
| Destinatario | Admin asignado |
| CTA | Botón: “Revisar cambios” → /dashboard/beneficios/admin |
| Descripción | Avisa al equipo que un beneficio publicado tiene cambios por revisar. |
| Estado | Funcionando. |
PREVIEW DEL CORREO
| Nombre técnico | FP/ALIADO/Solicitud de Ajustes |
| Función en código | sendPerkNotification('cambios_solicitados') |
| Asunto | “Tu beneficio necesita unos ajustes” |
| Trigger | Acción admin solicitar_cambios (→ cambios, recuperable). |
| Destinatario | Aliado |
| CTA | Botón: “Ajustar beneficio” → /dashboard/beneficios |
| Descripción | El admin pide ajustes antes de publicar (incluye el detalle). Reemplaza al “no aceptado” en esta acción porque el estado es recuperable. |
| Estado | Funcionando. NUEVO. |
PREVIEW DEL CORREO
| Nombre técnico | FP/ALIADO/No Aceptado |
| Función en código | sendPerkNotification('no_aceptado') |
| Asunto | “Beneficio no aceptado” |
| Trigger | Rechazo definitivo. |
| Destinatario | Aliado |
| CTA | Botón: “Ver registro” → /dashboard/beneficios |
| Descripción | Plantilla para rechazo definitivo. Hoy ninguna acción la dispara (solicitar cambios usa la #38); queda lista si se define una acción de rechazo. |
| Estado | Disponible (sin trigger). |
PREVIEW DEL CORREO
| Nombre técnico | FP/ALIADO/Terminado |
| Función en código | sendPerkNotification('terminado') |
| Asunto | “Beneficio terminado” |
| Trigger | Acción admin desactivar o cierre por vigencia. |
| Destinatario | Aliado · con copia (cc) al admin asignado |
| CTA | Botón: “Ver registro” → /dashboard/beneficios |
| Descripción | Notifica que el beneficio fue cerrado y ya no aparece en el catálogo. |
| Estado | Funcionando (admin desactivar). |
PREVIEW DEL CORREO
| Nombre técnico | FP/ALIADO/Eliminado |
| Función en código | sendPerkNotification('eliminado') |
| Asunto | “Beneficio eliminado” |
| Trigger | DELETE /api/perks/[id] (soft-delete → papelera). |
| Destinatario | Aliado · con copia (cc) al admin asignado |
| CTA | Botón: “Validar en la base de datos” → /dashboard/beneficios |
| Descripción | Notifica que el beneficio fue enviado a la papelera (recuperable 30 días). |
| Estado | Funcionando. |
PREVIEW DEL CORREO
| Nombre técnico | FP/ALIADO/Registro en Beneficio |
| Función en código | sendPerkRegistrationEmail() |
| Asunto | “¡Nuevo registro en tu beneficio!” |
| Trigger | Un usuario se registra para obtener el beneficio — cualquier tipo (código, enlace, agenda o «dejar datos»), en /api/perks/[id]/redeem. |
| Destinatario | Aliado (dueño del beneficio) · con copia (cc) a partners@lpdi.co |
| CTA | Botón: “Ver referido” → /dashboard/beneficios/referidos (Mis referidos) |
| Descripción | Avisa al aliado que un usuario se registró en su beneficio, con los datos del registrante (nombre, correo, teléfono, empresa tomada del perfil del usuario) y el tipo de registro. Unifica el antiguo correo de «lead» al diseño FP y lo extiende a todos los tipos de redención. |
| Estado | Funcionando. NUEVO. |
PREVIEW DEL CORREO
| Nombre técnico | FP/USUARIO/Solicitud recibida/NO-TYC/LPDI |
| Función en código | sendPerkRedemptionUserEmail |
| Asunto | “Recibimos tu solicitud — Ecosistema LPDI” |
| Trigger | El usuario solicita un beneficio en /api/perks/[id]/redeem (cualquier tipo de canje). |
| Destinatario | Usuario que solicitó el beneficio · copia a partners@lpdi.co |
| CTA | Botón: “Ir al ecosistema” → eco.lpdi.co |
| Descripción | Confirma al usuario que su solicitud fue enviada al aliado + muestra la tipología (Código de descuento / Enlace de redención / Dejó sus datos de contacto / Agendó una cita). Espejo (al usuario) del aviso al aliado. Aprobado por Frank 2026-07-02. |
| Estado | Funcionando. |
PREVIEW DEL CORREO
| Nombre técnico | FE/ORGANIZADOR/Registro Exitoso |
| Función en código | sendEventNotification('registro_exitoso') |
| Asunto | “¡Registro exitoso de evento!” |
| Trigger | Action submit de /registro-evento (evento en PENDING). |
| Destinatario | Organizador (contact_email) |
| CTA | Botón: “Ver registro” → /dashboard |
| Descripción | Confirma al organizador que su evento quedó en revisión. Incluye el código. |
| Estado | Funcionando. |
PREVIEW DEL CORREO
| Nombre técnico | FE/EQUIPO/Nuevo por Aprobar |
| Función en código | sendEventNotification('nuevo_por_aprobar') |
| Asunto | “Nuevo evento por aprobar” |
| Trigger | Action submit de /registro-evento. |
| Destinatario | Admin asignado |
| CTA | Botón: “Revisar evento” → /dashboard |
| Descripción | Avisa al equipo que hay un evento nuevo pendiente de revisión. |
| Estado | Funcionando. |
PREVIEW DEL CORREO
| Nombre técnico | FE/ORGANIZADOR/Aprobado |
| Función en código | sendEventNotification('aprobado') |
| Asunto | “¡Evento aprobado!” |
| Trigger | Acción admin del panel de eventos (N13). |
| Destinatario | Organizador |
| CTA | Botón: “Ver evento” → /dashboard |
| Descripción | Notifica al organizador que su evento fue aprobado. |
| Estado | Funcionando. |
PREVIEW DEL CORREO
| Nombre técnico | FE/ORGANIZADOR/Aprobado Programado |
| Función en código | sendEventNotification('aprobado_programado') |
| Asunto | “¡Evento aprobado!” |
| Trigger | Acción admin aprobar con fecha de publicación futura. |
| Destinatario | Organizador |
| CTA | Botón: “Ver registro” → /dashboard |
| Descripción | Segundo flujo de aprobación de evento (F2): informa la fecha futura de publicación automática. Incluye el badge del código del evento. |
| Estado | Funcionando. NUEVO (F2). |
PREVIEW DEL CORREO
| Nombre técnico | FE/ORGANIZADOR/Actualizado |
| Función en código | sendEventNotification('actualizado') |
| Asunto | “¡Evento actualizado!” |
| Trigger | Edición de un evento ya aprobado (se guarda manteniendo el estado aprobado). |
| Destinatario | Organizador |
| CTA | Botón: “Ver evento” → /dashboard |
| Descripción | Al organizador: su evento publicado fue actualizado. |
| Estado | Funcionando. |
PREVIEW DEL CORREO
| Nombre técnico | FE/EQUIPO/Cambios por Aprobar |
| Función en código | sendEventNotification('cambios_por_aprobar') |
| Asunto | “Cambios de evento por aprobar” |
| Trigger | Un usuario que NO es «editor de confianza» envía un cambio a su evento que sí requiere aprobación. (El editor de confianza auto-aprueba, así que su edición no genera este correo.) |
| Destinatario | Admin asignado |
| CTA | Botón: “Revisar cambios” → /dashboard |
| Descripción | Avisa al equipo que un evento tiene cambios enviados por un usuario sin auto-aprobación y deben revisarse. |
| Estado | Pendiente — se activa con el flujo de «Mis eventos». |
PREVIEW DEL CORREO
| Nombre técnico | FE/ORGANIZADOR/No Aceptado |
| Función en código | sendEventNotification('no_aceptado') |
| Asunto | “Evento no aceptado” |
| Trigger | Acción admin de rechazo (N13). |
| Destinatario | Organizador |
| CTA | Botón: “Ver registro” → /dashboard |
| Descripción | Notifica al organizador que su evento no fue aceptado. |
| Estado | Funcionando. |
PREVIEW DEL CORREO
| Nombre técnico | FE/ORGANIZADOR/Eliminado |
| Función en código | sendEventNotification('eliminado') |
| Asunto | “Evento eliminado” |
| Trigger | Eliminación de un evento (N13). |
| Destinatario | Organizador · con copia (cc) al admin asignado |
| CTA | Botón: “Ver registro” → /dashboard |
| Descripción | Notifica al organizador que su evento fue eliminado. |
| Estado | Funcionando. |
PREVIEW DEL CORREO
| Nombre técnico | FE/ORGANIZADOR/Publicación Automática |
| Función en código | sendEventNotification('publicacion_exitosa') |
| Asunto | “¡Publicación automática de evento!” |
| Trigger | Registro de evento por un usuario con privilegio de auto-publicación (F6): el evento se publica sin pasar por aprobación. |
| Destinatario | Organizador · con copia (cc) al admin asignado |
| CTA | Botón: “Ver evento” → /dashboard |
| Descripción | Confirma que el evento se publicó automáticamente. El privilegio se administra en el panel de admin de eventos (sección de privilegios de auto-publicación por correo). |
| Estado | Funcionando. NUEVO (F6). |
PREVIEW DEL CORREO
| Nombre técnico | FE/ORGANIZADOR/Solicitud de Ajustes |
| Función en código | sendEventNotification('cambios_solicitados') |
| Asunto | “Tu evento necesita unos ajustes” |
| Trigger | El admin pide cambios a un evento (acción «solicitar cambios» en el panel de aprobación). |
| Destinatario | Organizador · con copia (cc) al admin que la envía |
| CTA | Botón: “Ajustar evento” → /dashboard |
| Descripción | Al organizador: el admin solicita ajustes e incluye el detalle de lo que debe corregir; con copia al admin que la envía, para trazabilidad. Es el espejo del correo #38 (Solicitud de Ajustes) de Beneficios. |
| Estado | Funcionando. NUEVO. |
PREVIEW DEL CORREO
| Estado | ELIMINADO — No se obliga a confirmar la creación de una startup; lo que se confirma son las cuentas de usuario. El cron de purga (soft-delete a los 8 días) sigue activo, pero ya no envía notificación por email. |
| Función eliminada | sendStartupPurgedEmail (removido de email.ts) |
| Estado | ELIMINADO — Consolidado en #18. |
| Razón | El sistema usa una única función (sendTeamInvitationEmail) para ambos casos (usuario nuevo y usuario existente). La diferencia se controla con el flag userExists, no con dos templates distintos. Mantener dos entradas duplicaba el mismo correo en el inventario. |
| Dónde queda documentado | Las dos variantes (usuario nuevo + SI-TYC · usuario existente + NO-TYC) ahora se describen dentro de #18. |
| Estado | ELIMINADO — No se obliga a confirmar la creación de un ICG; lo que se confirma son las cuentas de usuario. El cron de purga (purge_expired_entities RPC) sigue activo, pero ya no envía notificación por email. |
| Función eliminada | sendIcgPurgedEmail (removido de email.ts) |