LPDI

Inventario de Correos Electrónicos

Ecosistema LPDI — Versión 11 — +5 correos de Transferencia de entidades (2026-07-05) — verificado contra el código 2026-07-06

59 correos + 3 eliminados · Organizados por: USUARIO → STARTUP → ICG → ENTIDADES → ADMINISTRATIVOS → PERKS → EVENTOS

Nota (2026-07-06): el trabajo de cumplimiento de esta fecha (bitácora de acciones, versionado de TYC/PDP, controles de sesión) usa pantallas y registros, no agrega correos nuevos. El correo de anuncio de cambio de TYC/PDP (correo 53) ya está cableado y operativo: al publicar una versión nueva desde Documentos legales, una casilla (desmarcada por defecto) lo envía a todos los usuarios registrados, incluidas las cuentas sin confirmar; la regla bloquea su envío si la versión nueva no está cargada.

Taxonomía de nombres técnicos:
CATEGORÍA / DESTINATARIO / EXISTENCIA / PRIVILEGIO / TIPO MENSAJE / TYC / FUENTE
Categoría: USUARIO | STARTUP | ICG  •  Destinatario: CEO | CON | TEAM | USER  •  Existencia: NUEVO | EXIST
Privilegio: SI-ED | NO-ED  •  TyC: SI-TYC | NO-TYC  •  Fuente: SUPA | LPDI
Definición de siglas:
TYC = Términos y Condiciones de Uso del Sistema LPDI  •  PDP = Política de Tratamiento y Privacidad de Datos Personales

Índice completo (59 correos + 3 eliminados)

Estado:Activo 57 se disparan hoyListo, sin disparo 2 plantilla lista, sin proceso que la dispareBorrador 0 diseño sin implementarEliminado 3 retirados
Los Listo, sin disparo (39 Beneficio no aceptado, 48 Cambios de evento por aprobar) tienen la plantilla lista y probada, pero hoy ninguna acción ni proceso los dispara. El estado se determinó contra la evidencia real de envío (registros de envío en base de datos), no contra la configuración del repositorio.
USUARIO (14) STARTUP (11) ICG (3) ENTIDADES (8) ADMINISTRATIVOS (1) PERKS (12) EVENTOS (10) ELIMINADOS (3)
#Nombre TécnicoAsunto del correoDestino CTADescripciónEstadoTyCImg
USUARIO — Correos de cuenta y autenticación (14)
01USUARIO/USER/NUEVO/NO-ED/Confirmación de Correo/NO-TYC/SUPA“Confirma tu cuenta en el Ecosistema LPDI”{{ .ConfirmationURL }} → eco.lpdi.coConfirmación de email al crear cuenta nueva.ActivoNO
15USUARIO/USER/NUEVO/NO-ED/Recordatorio día 3/NO-TYC/LPDI“Recordatorio: confirma tu cuenta en el Ecosistema LPDI”${confirmUrl}Recordatorio día 3 si no verifica su correo. Lo envía el cron de verificación (Opción B), activo desde 2026-07-06.ActivoNO
16USUARIO/USER/NUEVO/NO-ED/Recordatorio Urgente día 6/NO-TYC/LPDI“Último aviso: confirma tu cuenta en el Ecosistema LPDI”${confirmUrl}Aviso día 6. Si no verifica, la cuenta se inactiva el día 8. Lo envía el cron de verificación (Opción B), activo.ActivoNO
62NUEVOUSUARIO/USER/EXIST/NO-ED/Cuenta Inactivada/NO-TYC/LPDI“Tu cuenta fue inactivada — confírmala para reactivarla”/auth/verificarDía 8 sin verificar: la cuenta se inactiva y este correo avisa que tiene 30 días para reactivarla verificando su correo. Lo envía el cron de verificación (Opción B).ActivoNO
05USUARIO/USER/NUEVO/NO-ED/Invitación Admin/NO-TYC/SUPA“Has sido invitado al Ecosistema LPDI”{{ .ConfirmationURL }} → eco.lpdi.coInvitación directa desde Supabase Dashboard.ActivoNO
03USUARIO/USER/NUEVO/NO-ED/Magic Link/NO-TYC/SUPA“Tu enlace de acceso — Ecosistema LPDI”{{ .ConfirmationURL }} → eco.lpdi.coEnlace mágico de acceso. Reservado para uso admin.ActivoNO
06USUARIO/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.ActivoNO
02USUARIO/USER/EXIST/NO-ED/Recuperación de Contraseña/NO-TYC/SUPA“Restablece tu contraseña — Ecosistema LPDI”eco.lpdi.co/auth/recuperarReset de contraseña con enlace seguro.ActivoNO
10USUARIO/USER/EXIST/NO-ED/Contraseña Actualizada/NO-TYC/LPDI“Tu contraseña ha sido actualizada — Ecosistema LPDI”eco.lpdi.co/auth/recuperarNotificación del sistema LPDI cuando el usuario cambia su contraseña.ActivoNO
08USUARIO/USER/EXIST/NO-ED/Notificación Contraseña Cambiada/NO-TYC/SUPA“Tu contraseña ha sido cambiada — Ecosistema LPDI”Sin CTAAvisa al usuario que su contraseña fue actualizada.ActivoNO
04USUARIO/USER/EXIST/NO-ED/Cambio de Correo/NO-TYC/SUPA“Confirma el cambio de correo — Ecosistema LPDI”{{ .ConfirmationURL }} → eco.lpdi.coVerificación del nuevo correo al cambiar email.ActivoNO
07USUARIO/USER/EXIST/NO-ED/Notificación Correo Cambiado/NO-TYC/SUPA“Tu correo electrónico ha sido actualizado — Ecosistema LPDI”Sin CTAAvisa al usuario que su correo fue actualizado.ActivoNO
09USUARIO/USER/EXIST/NO-ED/Eliminación de Cuenta/NO-TYC/LPDI“Tu cuenta en el Ecosistema LPDI ha sido eliminada”eco.lpdi.coConfirmación de eliminación voluntaria de cuenta.ActivoNO
53NUEVOUSUARIO/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íticaAviso de publicación de versión nueva de los documentos legales (Grupo A, tácita).ActivoNO
STARTUP — Registro, equipo y ciclo de vida de Startups/PyMEs (11)
11STARTUP/CEO/NUEVO/SI-ED/Bienvenida Registro/SI-TYC/LPDI“Bienvenido al Ecosistema LPDI — Confirma tu cuenta”${confirmUrl}Bienvenida al registrante de una startup.ActivoSI
12STARTUP/CEO/NUEVO/SI-ED/Bienvenida CEO Designado/SI-TYC/LPDI“Bienvenido al Ecosistema LPDI — {empresa}”eco.lpdi.co/dashboardCEO designado sin cuenta LPDI. Incluye credenciales.ActivoSI
13STARTUP/CEO/EXIST/SI-ED/Bienvenida CEO Designado/NO-TYC/LPDI“Has sido designado CEO de {empresa} en el Ecosistema LPDI”eco.lpdi.co/dashboardCEO designado ya tiene cuenta LPDI.ActivoNO
18STARTUP/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.ActivoSI
20STARTUP/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.ActivoNO
21STARTUP/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.ActivoNO
22STARTUP/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.ActivoNO
23STARTUP/CEO/EXIST/SI-ED/Notificación Miembro Aceptó/NO-TYC/LPDI“{miembro} aceptó la invitación al equipo de {empresa}”eco.lpdi.co/dashboardAvisa al equipo que un miembro aceptó.ActivoNO
24STARTUP/CEO/EXIST/SI-ED/Notificación Miembro Rechazó/NO-TYC/LPDI“{miembro} rechazó la invitación al equipo de {empresa}”eco.lpdi.co/dashboardAvisa al equipo que un miembro rechazó.ActivoNO
25STARTUP/TEAM/EXIST/SI-ED/Cambio de Permisos/NO-TYC/LPDI“Cambio de permisos en {empresa}”eco.lpdi.co/dashboardNotifica al miembro cuando el CEO modifica sus permisos.ActivoNO
14MODIFICADOSTARTUP/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.ActivoNO
ICG — Registro y ciclo de vida de ICGs (3)
28ICG/CON/NUEVO/NO-ED/Bienvenida Contacto/SI-TYC/LPDI“{ICG} te ha asignado como contacto en el Ecosistema LPDI”eco.lpdi.co/dashboardContacto designado sin cuenta LPDI. Incluye contraseña temporal.ActivoSI
29ICG/CON/EXIST/NO-ED/Bienvenida Contacto/NO-TYC/LPDI“{ICG} te ha asignado como contacto en el Ecosistema LPDI”eco.lpdi.co/dashboardContacto que ya tiene cuenta LPDI.ActivoNO
55NUEVOICG/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.ActivoNO
ENTIDADES — Correos comunes a Startup e ICG (8)
56NUEVOENTIDAD/USER/NUEVO/NO-ED/Creación de Entidad/NO-TYC/LPDI“Registraste tu {Startup/ICG} en el Ecosistema LPDI”deep-link a la entidadConfirma la creación de la entidad + score inicial con barra del semáforo.ActivoNO
26ENTIDAD/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.ActivoNO
27ENTIDAD/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.ActivoNO
57NUEVOENTIDAD/RECEPTOR/AMBOS/NO-ED/Invitación de Transferencia/NO-TYC/LPDI“Te transfieren una entidad — Ecosistema LPDI”/transferencia/{token}Invita al receptor a aceptar/rechazar una transferencia (10 días). Nota TYC/PDP si es cuenta nueva.ActivoNO
58NUEVOENTIDAD/RECEPTOR/AMBOS/NO-ED/Recordatorio de Transferencia/NO-TYC/LPDI“Recordatorio: transferencia pendiente — Ecosistema LPDI”/transferencia/{token}Recordatorio al receptor (días 3/6/10) de una transferencia pendiente.ActivoNO
59NUEVOENTIDAD/RECEPTOR/AMBOS/NO-ED/Transferencia Confirmada/NO-TYC/LPDI“Transferencia confirmada — Ecosistema LPDI”/dashboard/perfil-{startup|icg}Confirma al nuevo responsable que la transferencia se completó.ActivoNO
60NUEVOENTIDAD/PROPIETARIO/AMBOS/NO-ED/Transferencia No Completada/NO-TYC/LPDI“La transferencia no se completó — Ecosistema LPDI”/dashboard/perfil-{startup|icg}Avisa al propietario que la transferencia no se completó (vencida/rechazada/cancelada).ActivoNO
61NUEVOICG/PROPIETARIO/EXIST/NO-ED/ICG Sin Contacto/NO-TYC/LPDI“Tu ICG quedó sin persona de contacto — Ecosistema LPDI”/dashboard/icg/nuevo (FID)Avisa al propietario del ICG que su contacto cerró la cuenta; CTA a registrar uno nuevo.ActivoNO
ADMINISTRATIVOS — Reportes automáticos internos (1)
31CRON/ADMIN/EXIST/NO-ED/Reporte Diario/NO-TYC/LPDI“Reporte diario Ecosistema LPDI — {fecha}”CSV adjuntoCron 6:00 AM Lima — altas/bajas + CSV de usuarios.ActivoNO
BENEFICIOS (PERKS) · notification-emails.ts (12)
32FP/ALIADO/Registro Exitoso/NO-TYC/LPDI“¡Registro exitoso de beneficio!”/dashboard/beneficiosAl aliado: su beneficio quedó en revisión (al pasar a «enviado»). Funcionando.ActivoNO
33FP/EQUIPO/Nuevo por Aprobar/NO-TYC/LPDI“Nuevo beneficio por aprobar”/dashboard/beneficios/adminAl admin asignado: beneficio nuevo por revisar. Funcionando.ActivoNO
34FP/ALIADO/Aprobado/NO-TYC/LPDI“¡Beneficio aprobado!”/perks/{id}Al aliado: beneficio aprobado y publicado. Funcionando (admin).ActivoNO
35FP/ALIADO/Aprobado Programado/NO-TYC/LPDI“¡Beneficio aprobado!”/dashboard/beneficiosAl aliado: aprobado con fecha de publicación futura (F2); el cron publish-scheduled lo activa. Funcionando.ActivoNO
36FP/ALIADO/Actualizado/NO-TYC/LPDI“¡Beneficio actualizado!”/perks/{id}Al aliado: cambios guardados (al editar un publicado → «edición»). Funcionando.ActivoNO
37FP/EQUIPO/Cambios por Aprobar/NO-TYC/LPDI“Cambios de beneficio por aprobar”/dashboard/beneficios/adminAl equipo: un beneficio publicado tiene cambios por revisar (de «edición» → «enviado»). Funcionando.ActivoNO
38FP/ALIADO/Solicitud de Ajustes/NO-TYC/LPDI“Tu beneficio necesita unos ajustes”/dashboard/beneficiosAl aliado: el admin pide ajustes (status «cambios», recuperable: ajusta y reenvía). Incluye el detalle. Funcionando.ActivoNO
39FP/ALIADO/No Aceptado/NO-TYC/LPDI“Beneficio no aceptado”/dashboard/beneficiosAl aliado: rechazo definitivo. Template disponible; sin acción que lo dispare hoy (solicitar cambios usa el #38).Listo, sin disparoNO
40FP/ALIADO/Terminado/NO-TYC/LPDI“Beneficio terminado”/dashboard/beneficiosAl aliado: beneficio cerrado (manual o por vigencia). Funcionando (admin desactivar).ActivoNO
41FP/ALIADO/Eliminado/NO-TYC/LPDI“Beneficio eliminado”/dashboard/beneficiosAl aliado: beneficio eliminado (enviado a papelera). Funcionando.ActivoNO
42FP/ALIADO/Registro en Beneficio/NO-TYC/LPDI“¡Nuevo registro en tu beneficio!”/dashboard/beneficios/referidosAl aliado (cc partners@lpdi.co): un usuario se registró en su beneficio, con sus datos y el tipo de registro. Funcionando.ActivoNO
54NUEVOFP/USUARIO/Solicitud recibida/NO-TYC/LPDI“Recibimos tu solicitud — Ecosistema LPDI”eco.lpdi.coAl usuario (cc partners@lpdi.co): confirma que su solicitud de beneficio fue enviada al aliado + tipología. Funcionando.ActivoNO
EVENTOS · notification-emails.ts (10)
43FE/ORGANIZADOR/Registro Exitoso/NO-TYC/LPDI“¡Registro exitoso de evento!”/dashboardAl organizador: evento registrado y en revisión (incluye código). Funcionando.ActivoNO
44FE/EQUIPO/Nuevo por Aprobar/NO-TYC/LPDI“Nuevo evento por aprobar”/dashboardAl admin asignado: evento nuevo por revisar. Funcionando.ActivoNO
45FE/ORGANIZADOR/Aprobado/NO-TYC/LPDI“¡Evento aprobado!”/dashboardAl organizador: evento aprobado. Funcionando.ActivoNO
46FE/ORGANIZADOR/Aprobado Programado/NO-TYC/LPDI“¡Evento aprobado!”/dashboardAl organizador: aprobado con fecha de publicación futura (F2). Funcionando.ActivoNO
47FE/ORGANIZADOR/Actualizado/NO-TYC/LPDI“¡Evento actualizado!”/dashboardAl organizador: su evento publicado fue actualizado. Funcionando.ActivoNO
48FE/EQUIPO/Cambios por Aprobar/NO-TYC/LPDI“Cambios de evento por aprobar”/dashboardAl equipo: un usuario sin auto-aprobación envió cambios que deben revisarse. Pendiente — se activa con «Mis eventos».Listo, sin disparoNO
49FE/ORGANIZADOR/No Aceptado/NO-TYC/LPDI“Evento no aceptado”/dashboardAl organizador: evento no aceptado. Funcionando.ActivoNO
50FE/ORGANIZADOR/Eliminado/NO-TYC/LPDI“Evento eliminado”/dashboardAl organizador: evento eliminado. Funcionando.ActivoNO
51FE/ORGANIZADOR/Publicación Automática/NO-TYC/LPDI“¡Publicación automática de evento!”/dashboardAl organizador (cc admin): evento publicado automáticamente por privilegio de auto-publicación (F6). Funcionando.ActivoNO
52FE/ORGANIZADOR/Solicitud de Ajustes/NO-TYC/LPDI“Tu evento necesita unos ajustes”/dashboardAl organizador (cc al admin que la envía): el admin pide ajustes a un evento, con el detalle. Espejo del #38 de FP. Funcionando.ActivoNO
CORREOS ELIMINADOS — consolidados o retirados del sistema (3)
17ELIMINADOExpiración de Registro (Startup) — No se obliga a confirmar la creación de una startup.
19ELIMINADOInvitación al Equipo (usuario existente) — Consolidado en #18 — mismo template (buildTeamInvitationHtml), las dos ramas (usuario nuevo / usuario existente) las maneja el flag userExists.
30ELIMINADOExpiración de Registro ICG — No se obliga a confirmar la creación de un ICG.

USUARIO — Correos de cuenta y autenticación (14)

01Confirmación de CorreoActivo↑ índice
Nombre técnicoUSUARIO/USER/NUEVO/NO-ED/Confirmación de Correo/NO-TYC/SUPA
Función en códigoSupabase Auth — Confirm signup template
Asunto“Confirma tu cuenta en el Ecosistema LPDI”
TriggerSupabase Auth dispara tras signup o signInWithOtp
DestinatarioEmail del usuario nuevo
CTABotón: “Confirmar mi cuenta”
Destino: {{ .ConfirmationURL }} → redirige a https://eco.lpdi.co/ (SITE_URL con token de confirmación)
DescripciónCorreo 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 / TratamientoNO — Los TyC se aceptan en el formulario de la aplicación ANTES de que Supabase envíe este correo.

PREVIEW DEL CORREO

Preview
15Recordatorio de Confirmación (día 3)Activo↑ índice
Nombre técnicoSTARTUP/CEO/NUEVO/SI-ED/Recordatorio día 3/NO-TYC/LPDI
Función en códigosendStartupReminderEmail (isUrgent=false)
Asunto“Recordatorio: confirma tu cuenta en el Ecosistema LPDI”
TriggerCron /api/cron/startup-welcome-reminders — día 3 sin confirmar email
DestinatarioTodos 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.
CTABotón: “Confirmar mi cuenta”
Destino: ${confirmUrl} → URL de confirmación Supabase
DescripciónPrimer 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 / TratamientoNO — TyC ya fueron aceptados en el registro.

PREVIEW DEL CORREO

Preview
16Recordatorio Urgente (día 6)Activo↑ índice
Nombre técnicoSTARTUP/CEO/NUEVO/SI-ED/Recordatorio Urgente día 6/NO-TYC/LPDI
Función en códigosendStartupReminderEmail (isUrgent=true)
Asunto“Ultimo aviso: confirma tu cuenta en el Ecosistema LPDI”
TriggerCron /api/cron/startup-welcome-reminders — día 6 sin confirmar email
DestinatarioTodos los miembros de la startup que no han confirmado su cuenta (email_confirmed_at IS NULL). Misma lógica que correo #15.
CTABotón: “Confirmar mi cuenta”
Destino: ${confirmUrl} → URL de confirmación Supabase
DescripciónAviso 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 / TratamientoNO — TyC ya aceptados en registro.

PREVIEW DEL CORREO

Preview
Los correos #15 y #16 pertenecen al ciclo de vida de la STARTUP: los dispara el cron /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.
62NUEVOCuenta Inactivada por no VerificarActivo↑ índice
Nombre técnicoUSUARIO/USER/EXIST/NO-ED/Cuenta Inactivada/NO-TYC/LPDI
Asunto“Tu cuenta fue inactivada — confírmala para reactivarla”
TriggerCiclo de verificación (Opción B): al día 8 sin verificar el correo, el cron marca la cuenta account_status=inactive y programa borrado a 30 días.
DescripciónAvisa que la cuenta quedó inactivada por no verificar el correo y que tiene 30 días de gracia para reactivarla verificando (enlace magiclink → /auth/verificar).
EnvíoCron DB-direct lpdi-confirmation-cron.py (Hetzner, diario), vía Resend. Activo.
05Invitación AdministrativaActivo↑ índice
Nombre técnicoUSUARIO/USER/NUEVO/NO-ED/Invitación Admin/NO-TYC/SUPA
Función en códigoSupabase Auth — Invite template
Asunto“Has sido invitado al Ecosistema LPDI”
TriggerAdmin invita usuario desde Supabase Dashboard vía inviteUserByEmail()
DestinatarioEmail del usuario invitado por admin
CTABotón: “Aceptar invitación”
Destino: {{ .ConfirmationURL }} → redirige a https://eco.lpdi.co/ (SITE_URL)
DescripciónTemplate 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 / TratamientoNO — TyC se validan en la aplicación al llegar.

PREVIEW DEL CORREO

Preview
03Magic Link de AccesoActivo↑ índice
Nombre técnicoUSUARIO/USER/NUEVO/NO-ED/Magic Link/NO-TYC/SUPA
Función en códigoSupabase Auth — Magic link template
Asunto“Tu enlace de acceso — Ecosistema LPDI”
TriggerAdmin invita usuario vía supabase.auth.admin.inviteUserByEmail()
DestinatarioEmail del usuario invitado
CTABotón: “Iniciar sesión”
Destino: {{ .ConfirmationURL }} → redirige a https://eco.lpdi.co/ (SITE_URL)
DescripciónEnlace 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 / TratamientoNO — TyC deberían validarse en la aplicación al llegar.

PREVIEW DEL CORREO

Preview
06Reautenticación (Código OTP)Activo↑ índice
Nombre técnicoUSUARIO/USER/EXIST/NO-ED/Reautenticación OTP/NO-TYC/SUPA
Función en códigoSupabase Auth — Reauthentication template
Asunto“Código de verificación — Ecosistema LPDI”
TriggerUsuario intenta una acción que requiere reautenticación (ej: cambio de contraseña, eliminación de cuenta)
DestinatarioEmail del usuario
CTASin botón CTA — muestra código OTP {{ .Token }} en el cuerpo del correo
DescripciónEnví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 / TratamientoNO — Es verificación de identidad para seguridad.

PREVIEW DEL CORREO

Preview
02Recuperación de ContraseñaActivo↑ índice
Nombre técnicoUSUARIO/USER/EXIST/NO-ED/Recuperación de Contraseña/NO-TYC/SUPA
Función en códigoSupabase Auth — Reset password template
Asunto“Restablece tu contraseña — Ecosistema LPDI”
TriggerUsuario solicita reset de contraseña vía /auth/reset
DestinatarioEmail del usuario
CTABotón: “Restablecer mi contraseña”
Destino: https://eco.lpdi.co/auth/recuperar?token_hash=...&type=recovery
DescripciónPermite al usuario restablecer su contraseña mediante un enlace seguro con expiración (por defecto 24h). Template personalizado con branding LPDI.
TyC / TratamientoNO — Acción de seguridad/recuperación. No requiere aceptación.

PREVIEW DEL CORREO

Preview
10Contraseña Actualizada (Sistema LPDI)Activo↑ índice
Nombre técnicoUSUARIO/USER/EXIST/NO-ED/Contraseña Actualizada/NO-TYC/LPDI
Función en códigosendPasswordChangedEmail
Asunto“Tu contraseña ha sido actualizada — Ecosistema LPDI”
TriggerUsuario cambia su contraseña exitosamente desde el sistema LPDI
DestinatarioEmail del usuario
CTABotón: “Restablecer contraseña” (emergencia)
Destino: https://eco.lpdi.co/auth/recuperar (hardcoded)
DescripciónNotificació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 / TratamientoNO — Correo informativo de seguridad.

PREVIEW DEL CORREO

Preview
08Notificación: Contraseña Cambiada (Supabase)Activo↑ índice
Nombre técnicoUSUARIO/USER/EXIST/NO-ED/Notificación Contraseña Cambiada/NO-TYC/SUPA
Función en códigoSupabase Auth — Password changed notification
Asunto“Tu contraseña ha sido cambiada — Ecosistema LPDI”
TriggerSupabase detecta que la contraseña del usuario fue cambiada
DestinatarioEmail del usuario
CTASin CTA — correo informativo (notificación de seguridad)
DescripciónNotificació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 / TratamientoNO — Correo informativo de seguridad.

PREVIEW DEL CORREO

Preview
04Cambio de Correo ElectrónicoActivo↑ índice
Nombre técnicoUSUARIO/USER/EXIST/NO-ED/Cambio de Correo/NO-TYC/SUPA
Función en códigoSupabase Auth — Change email template
Asunto“Confirma el cambio de correo — Ecosistema LPDI”
TriggerUsuario cambia su email desde configuración de cuenta
DestinatarioEmail nuevo del usuario
CTABotón: “Confirmar cambio de correo”
Destino: {{ .ConfirmationURL }} → redirige a https://eco.lpdi.co/ (SITE_URL)
DescripciónVerificació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 / TratamientoNO — Verificación de identidad. No requiere nueva aceptación.

PREVIEW DEL CORREO

Preview
07Notificación: Correo CambiadoActivo↑ índice
Nombre técnicoUSUARIO/USER/EXIST/NO-ED/Notificación Correo Cambiado/NO-TYC/SUPA
Función en códigoSupabase Auth — Email changed notification
Asunto“Tu correo electrónico ha sido actualizado — Ecosistema LPDI”
TriggerSupabase detecta que el email del usuario fue cambiado exitosamente
DestinatarioEmail anterior del usuario (el que se reemplazó)
CTASin CTA — correo informativo (notificación de seguridad)
DescripciónNotificación automática de seguridad enviada al email ANTERIOR cuando el usuario cambia su dirección. Permite al usuario detectar cambios no autorizados.
TyC / TratamientoNO — Correo informativo de seguridad.

PREVIEW DEL CORREO

Preview
09Eliminación de CuentaActivo↑ índice
Nombre técnicoUSUARIO/USER/EXIST/NO-ED/Eliminación de Cuenta/NO-TYC/LPDI
Función en códigosendAccountDeletedEmail
Asunto“Tu cuenta en el Ecosistema LPDI ha sido eliminada”
TriggerUsuario elimina su cuenta desde /api/account/delete
DestinatarioEmail del usuario que eliminó su cuenta
CTABotón: “Registrarme de nuevo”
Destino: https://eco.lpdi.co (hardcoded)
DescripciónConfirmación de que la cuenta fue eliminada voluntariamente. Los datos se marcan para eliminación. Si desea volver, debe registrarse de nuevo.
TyC / TratamientoNO — Correo informativo. Si se re-registra, se pedirán TyC nuevamente.

PREVIEW DEL CORREO

Preview
53NUEVOActualización de Términos y PolíticasActivo↑ índice
Nombre técnicoUSUARIO/USER/AMBOS/NO-ED/Actualización T&C y Política/NO-TYC/LPDI
Función en códigosendAccountUpdateNotificationEmail
Asunto“Actualizamos nuestras condiciones y políticas — Ecosistema LPDI”
TriggerPublicación de una versión nueva de T&C / Política de Datos (cutover del lifecycle)
DestinatarioUsuarios con aceptación válida previa (Grupo A) — aceptación tácita por uso continuado
CTAEnlaces a los documentos actualizados (T&C + Política). Sin botón de acción.
DescripciónInforma 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 / TratamientoSÍ (informativo) — Aceptación TÁCITA por uso continuado; no incluye casilla. Aprobado por Frank 2026-07-02.

PREVIEW DEL CORREO

Preview

STARTUP — Registro, equipo y ciclo de vida (11)

11Bienvenida Registro de StartupActivo↑ índice
Nombre técnicoSTARTUP/CEO/NUEVO/SI-ED/Bienvenida Registro/SI-TYC/LPDI
Función en códigosendStartupWelcomeEmail
Asunto“Bienvenido al Ecosistema LPDI — Confirma tu cuenta”
TriggerRegistro de startup en /registro-startup (formulario completado)
DestinatarioEmail del CEO que registra la startup
CTABotón: “Confirmar mi cuenta y ver mi registro”
Destino: ${confirmUrl} → URL de confirmación Supabase (redirige a SITE_URL)
DescripciónCorreo 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 / TratamientoSÍ — 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

Preview
12Bienvenida CEO Designado (usuario nuevo)Activo↑ índice
Nombre técnicoSTARTUP/CEO/NUEVO/SI-ED/Bienvenida CEO Designado/SI-TYC/LPDI
Función en códigosendCeoWelcomeEmail (userExists=false)
Asunto“Bienvenido al Ecosistema LPDI — {empresa}”
TriggerRegistro de startup → el email del CEO NO existe como usuario en Supabase Auth
DestinatarioEmail del CEO designado durante registro de startup
CTABotón: “Ver mi registro” (existente) / “Confirmar mi cuenta” (nuevo)
Destino: Existente: https://eco.lpdi.co/dashboard | Nuevo: ${resetUrl} (reset Supabase)
DescripciónSe 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 / TratamientoSÍ — 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

Preview
13Bienvenida CEO Designado (usuario existente)Activo↑ índice
Nombre técnicoSTARTUP/CEO/EXIST/SI-ED/Bienvenida CEO Designado/NO-TYC/LPDI
Función en códigosendCeoWelcomeEmail (userExists=true)
Asunto“Has sido designado CEO de {empresa} en el Ecosistema LPDI”
TriggerRegistro de startup → el email del CEO YA existe como usuario
DestinatarioEmail del CEO
CTABotón: “Ver mi registro” (existente) / “Establecer nueva contraseña” (nuevo)
Destino: Existente: https://eco.lpdi.co/dashboard | Nuevo: ${resetUrl} (reset Supabase)
DescripciónSe envía cuando el CEO designado ya tiene cuenta LPDI. No se muestra contraseña. Botón directo al dashboard.
TyC / TratamientoNO — El CEO ya tiene cuenta y aceptó TyC previamente.

PREVIEW DEL CORREO

Preview
18Invitación al EquipoActivo↑ índice
Nombre técnicoSTARTUP/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ódigosendTeamInvitationEmail (paramía por userExists + canEdit + addedByName)
Asunto“{Nombre de quien agrega} te ha incluido en el equipo de {empresa} — confirma tu registro”
TriggerUn 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.
DestinatarioEmail del miembro invitado (ingresado por quien tiene privilegio de edición)
CTA2 botones: “Confirmar mi vinculación” (verde) / “No hago parte” (rojo)
Destino: Confirmar: ${confirmUrl} | Rechazar: ${rejectUrl} (rutas /team/confirmar)
DescripciónInvitació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.
Variantes4 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 / TratamientoVariantes (a) y (b) — SÍ (usuario nuevo, acepta en pantalla de confirmación) · Variantes (c) y (d) — NO (usuario existente, ya tiene consent previo)
El trigger no está restringido al CEO: cualquier miembro con privilegio de edición (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.

Importante: Los TyC NO se aceptan en el email. El email es informativo. La aceptación ocurre en la pantalla /team/confirmar, donde aparecen (o no) los checkboxes según si el usuario ya tiene cuenta.

PREVIEW — Variante (a) Nuevo + CON edición

Preview nuevo + edición

PREVIEW — Variante (b) Nuevo + SIN edición

Preview nuevo + sin edición

PREVIEW — Variante (c) Existente + CON edición

Preview existente + edición

PREVIEW — Variante (d) Existente + SIN edición

Preview existente + sin edición
20Bienvenida al Equipo con EdiciónActivo↑ índice
Nombre técnicoSTARTUP/TEAM/EXIST/SI-ED/Bienvenida con Edición/NO-TYC/LPDI
Función en códigosendTeamWelcomeWithEditEmail
Asunto“Bienvenido al equipo de {empresa} en el Ecosistema LPDI”
TriggerMiembro hace clic en “Confirmar mi vinculación” + tiene canEdit=true
DestinatarioEmail del miembro que confirmó su vinculación
CTABotón: “Ir al dashboard”
Destino: eco.lpdi.co/dashboard
DescripciónConfirma 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 / TratamientoNO — TyC ya fueron aceptados en el correo de invitación (#18) o en su registro original.

PREVIEW DEL CORREO

Preview
21Bienvenida al Equipo sin EdiciónActivo↑ índice
Nombre técnicoSTARTUP/TEAM/EXIST/NO-ED/Bienvenida sin Edición/NO-TYC/LPDI
Función en códigosendTeamWelcomeNoEditEmail
Asunto“Bienvenido al equipo de {empresa} en el Ecosistema LPDI”
TriggerMiembro confirma vinculación + tiene canEdit=false
DestinatarioEmail del miembro que confirmó su vinculación
CTABotón: “Ir al dashboard”
Destino: eco.lpdi.co/dashboard
DescripciónConfirma 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 / TratamientoNO — Mismo caso que correo #20. TyC ya aceptados previamente.

PREVIEW DEL CORREO

Preview
22Confirmación de Rechazo de InvitaciónActivo↑ índice
Nombre técnicoSTARTUP/TEAM/EXIST/NO-ED/Confirmación de Rechazo/NO-TYC/LPDI
Función en códigosendTeamRejectionConfirmationEmail
Asunto“Confirmación: no haces parte del equipo de {empresa}”
TriggerMiembro hace clic en “No hago parte de la compañía” desde correo #18 o #19
DestinatarioEmail del miembro que rechazó la invitación
CTABotón condicional: “Confirmar mi vinculación” (si fue error)
Destino: ${confirmAgainUrl} (condicional, puede ser null → sin CTA)
DescripciónConfirma al miembro que rechazó exitosamente la invitación. Si fue un error, puede contactar al CEO para que lo vuelva a invitar.
TyC / TratamientoNO — Correo informativo de confirmación de rechazo.

PREVIEW DEL CORREO

Preview
23Notificación al CEO: Miembro AceptóActivo↑ índice
Nombre técnicoSTARTUP/CEO/EXIST/SI-ED/Notificación Miembro Aceptó/NO-TYC/LPDI
Función en códigosendCeoMemberConfirmationEmail
Asunto“{miembro} aceptó la invitación al equipo de {empresa}”
TriggerMiembro acepta invitación (hace clic en “Confirmar mi vinculación”)
DestinatarioTodos los miembros del equipo de la startup
CTABotón: “Ir al dashboard”
Destino: https://eco.lpdi.co/dashboard (hardcoded)
DescripciónAvisa al equipo que un miembro aceptó la invitación. Muestra quién confirmó, su email y los permisos asignados.
TyC / TratamientoNO — Correo informativo al CEO.

PREVIEW DEL CORREO

Preview
24Notificación al CEO: Miembro RechazóActivo↑ índice
Nombre técnicoSTARTUP/CEO/EXIST/SI-ED/Notificación Miembro Rechazó/NO-TYC/LPDI
Función en códigosendCeoMemberRejectionEmail
Asunto“{miembro} rechazó la invitación al equipo de {empresa}”
TriggerMiembro rechaza invitación (hace clic en “No hago parte de la compañía”)
DestinatarioTodos los miembros del equipo de la startup
CTABotón: “Ir al dashboard”
Destino: https://eco.lpdi.co/dashboard (hardcoded)
DescripciónAvisa al equipo que un miembro rechazó la invitación. Sugiere comunicarse con la persona si fue un error.
TyC / TratamientoNO — Correo informativo al CEO.

PREVIEW DEL CORREO

Preview
25Cambio de PermisosActivo↑ índice
Nombre técnicoSTARTUP/TEAM/EXIST/SI-ED/Cambio de Permisos/NO-TYC/LPDI
Función en códigosendPermissionChangeEmail
Asunto“Cambio de permisos en {empresa}”
TriggerCualquier usuario con permisos de edición modifica los permisos de otro miembro del equipo
DestinatarioEmail del miembro cuyo permiso cambió
CTABotón: “Ir al dashboard”
Destino: https://eco.lpdi.co/dashboard (hardcoded)
DescripciónNotifica 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 / TratamientoNO — Correo informativo.

PREVIEW DEL CORREO

Preview
14MODIFICADOSeguimiento de ScoreActivo↑ índice
Nombre técnicoSTARTUP/CEO/EXIST/SI-ED/Seguimiento de Score/NO-TYC/LPDI
Función en códigosendStartupFollowupEmail
Asunto“Aumenta el score de tu perfil en el Ecosistema LPDI”
TriggerCron 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).
DestinatarioContacto de la startup (contact_email) + miembros de startup_founders con can_edit_form=true y verification_status='verified'.
CTABotón: “Aumentar mi score”
Destino: ${profileUrl} → perfil de la startup en dashboard
DescripciónRecordatorio 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 / TratamientoNO — El usuario ya aceptó TyC durante el registro.

PREVIEW DEL CORREO

Preview

ICG — Registro y ciclo de vida (3)

28Bienvenida Contacto (usuario nuevo)Activo↑ índice
Nombre técnicoICG/CON/NUEVO/NO-ED/Bienvenida Contacto/SI-TYC/LPDI
Función en códigosendContactWelcomeEmail (userExists=false)
Asunto“{ICG} te ha asignado como contacto en el Ecosistema LPDI”
TriggerICG registra contacto de compañía en /registro-icg o /dashboard/icg/nuevo — el contacto NO tiene cuenta LPDI
DestinatarioEmail del contacto designado por el ICG
CTABotón: “Ver mi registro” (existente) / “Establecer nueva contraseña” (nuevo)
Destino: Existente: https://eco.lpdi.co/dashboard | Nuevo: ${resetUrl} (reset Supabase)
DescripciónSe 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 / TratamientoSÍ — 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

Preview
29Bienvenida Contacto (usuario existente)Activo↑ índice
Nombre técnicoICG/CON/EXIST/NO-ED/Bienvenida Contacto/NO-TYC/LPDI
Función en códigosendContactWelcomeEmail (userExists=true)
Asunto“{ICG} te ha asignado como contacto en el Ecosistema LPDI”
TriggerICG registra contacto de compañía — el contacto YA tiene cuenta LPDI
DestinatarioEmail del contacto designado por el ICG
CTABotón: “Ver mi registro” (existente) / “Confirmar mi cuenta” (nuevo)
Destino: Existente: https://eco.lpdi.co/dashboard | Nuevo: ${resetUrl} (reset Supabase)
DescripciónSe 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 / TratamientoNO — Ya tiene cuenta y aceptó TyC previamente. Guard en /dashboard verifica como red de seguridad.

PREVIEW DEL CORREO

Preview
55NUEVOSeguimiento de Score (ICG)Activo↑ índice
Nombre técnicoICG/USER/EXIST/NO-ED/Seguimiento de Score/NO-TYC/LPDI
Función en códigosendIcgFollowupEmail
Asunto“Aumenta el score de tu perfil en el Ecosistema LPDI”
TriggerCron 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.
DestinatarioContacto/responsable del ICG
CTABotón: “Completar mi perfil” → deep-link /dashboard/icg/{id}
DescripciónVersión ICG del Seguimiento de Score. Muestra el score con la barra del semáforo (rojo/ámbar/verde). Espejo del de startup (#14).
EstadoCorreo 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

Preview
La confirmación de creación de un ICG usa el correo #56 — Creación de Entidad (categoría ENTIDADES), función genérica sendEntityCreatedEmail para startup e ICG. Para ICG se dispara en registro-icg, dashboard/icg/nuevo y dashboard/icg/nuevo-simplificado.

ENTIDADES — Correos comunes a Startup e ICG (8)

56NUEVOConfirmación de creación de entidadActivo↑ índice
Nombre técnicoENTIDAD/USER/NUEVO/NO-ED/Creación de Entidad/NO-TYC/LPDI
Función en códigosendEntityCreatedEmail
Asunto“Registraste tu {Startup/ICG} en el Ecosistema LPDI”
TriggerAl 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.
DestinatarioUsuario que registró la entidad
CTABotón: “Completar mi perfil” → deep-link a la entidad (/dashboard/startups/{id} o /dashboard/icg/{id})
Variantes2: Startup e ICG (mismo diseño, label dinámico)
DescripciónConfirma que la entidad se creó correctamente + muestra el score inicial con la barra del semáforo. Motiva a completar el perfil.
EstadoCorreo listo y CABLEADOsendEntityCreatedEmail se invoca (best-effort) en las 6 vías de creación de startup e ICG.

PREVIEW DEL CORREO — 2 variantes

Variante Startup

Preview variante Startup

Variante ICG

Preview variante ICG
26Eliminación de EntidadActivo↑ índice
Nombre técnicoSTARTUP/USER/EXIST/NO-ED/Eliminación de Entidad/NO-TYC/LPDI
Función en códigosendEntityDeletedEmail
Asunto“El registro de {entidad} ha sido eliminado del Ecosistema LPDI”
TriggerUsuario elimina startup o ICG desde /api/entities/delete
DestinatarioMiembros asociados a la entidad (CEO, equipo, contacto) CON permiso de edición.
Miembros SIN edición reciben variante informativa (correo #26b) sin CTA Restaurar.
CTABotón: “Restaurar”
Destino: https://eco.lpdi.co/dashboard (sección papelera)
DescripciónNotifica 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 / TratamientoNO — Correo informativo. La restauración no requiere nueva aceptación.
Este correo aplica tanto a Startups como a ICGs. Se clasifica bajo STARTUP porque es el caso de uso principal, pero la función sendEntityDeletedEmail es genérica.

PREVIEW — CON EDICIÓN (CTA Restaurar)

Preview con edición

PREVIEW — SIN EDICIÓN (solo informativo)

Preview sin edición
27Restauración de EntidadActivo↑ índice
Nombre técnicoSTARTUP/USER/EXIST/NO-ED/Restauración de Entidad/NO-TYC/LPDI
Función en códigosendEntityRestoredEmail
Asunto“{entidad} ha sido restaurado en el Ecosistema LPDI”
TriggerUsuario restaura una entidad desde la papelera del dashboard
DestinatarioMiembros asociados a la entidad restaurada
CTABotón: “Ver en Dashboard”
Destino: ${dashboardUrl}https://eco.lpdi.co/dashboard
DescripciónNotifica a los asociados que la entidad fue restaurada exitosamente desde la papelera. Aplica tanto a Startups como a ICGs.
TyC / TratamientoNO — Correo informativo.

PREVIEW DEL CORREO

Preview
57NUEVOInvitación de transferenciaActivo↑ índice
Nombre técnicoENTIDAD/RECEPTOR/AMBOS/NO-ED/Invitación de Transferencia/NO-TYC/LPDI
Función en códigosendTransferNotification('invitation')
Asunto“Te transfieren una entidad — Ecosistema LPDI”
TriggerAl crear una transferencia (POST /api/entity-transfer/create, rank 1) y al activar el siguiente rank de sucesión (cron ~/bin/lpdi-entity-transfer-cron.py).
DestinatarioEl receptor de la transferencia (founder/contacto o correo indicado)
CTABotón: “Revisar y responder” → /transferencia/{token}
DescripciónInvita a aceptar o rechazar la transferencia; explica el plazo de 10 días. Si el correo no tiene cuenta, incluye la nota de TYC/PDP (se marcan en la página).
TyC / TratamientoNO — Correo transaccional. La aceptación de TYC/PDP (cuentas nuevas) ocurre en la página de aceptación, no por correo.
EstadoCorreo listo y CABLEADO — se envía desde el endpoint de creación (rank 1) y desde el cron al avanzar la sucesión.

PREVIEW DEL CORREO

Preview Invitación de transferencia
58NUEVORecordatorio de transferenciaActivo↑ índice
Nombre técnicoENTIDAD/RECEPTOR/AMBOS/NO-ED/Recordatorio de Transferencia/NO-TYC/LPDI
Función en códigosendTransferNotification('reminder')
Asunto“Recordatorio: transferencia pendiente — Ecosistema LPDI”
TriggerCron diario (lpdi-entity-transfer-cron.py, entity_transfer_tick): días 3, 6 y 10 desde que el rank quedó activo.
DestinatarioEl receptor con la transferencia activa
CTABotón: “Revisar y responder” → /transferencia/{token}
DescripciónRecuerda al receptor que tiene una transferencia pendiente antes de que venza el plazo de 10 días.
TyC / TratamientoNO — Correo transaccional. La aceptación de TYC/PDP (cuentas nuevas) ocurre en la página de aceptación, no por correo.
EstadoCorreo listo y CABLEADO — lo dispara el cron diario.

PREVIEW DEL CORREO

Preview Recordatorio de transferencia
59NUEVOTransferencia confirmadaActivo↑ índice
Nombre técnicoENTIDAD/RECEPTOR/AMBOS/NO-ED/Transferencia Confirmada/NO-TYC/LPDI
Función en códigosendTransferNotification('confirmed')
Asunto“Transferencia confirmada — Ecosistema LPDI”
TriggerAl aceptar la transferencia en la página pública (/transferencia/[token]).
DestinatarioEl nuevo responsable (quien aceptó)
CTABotón: “Ir a la entidad” → perfil de la entidad
DescripciónConfirma que la transferencia se completó e indica con qué estatus entra (miembro en Startup / administrador en ICG).
TyC / TratamientoNO — Correo transaccional. La aceptación de TYC/PDP (cuentas nuevas) ocurre en la página de aceptación, no por correo.
EstadoCorreo listo y CABLEADO — se envía tras aceptar.

PREVIEW DEL CORREO

Preview Transferencia confirmada
60NUEVOTransferencia no completadaActivo↑ índice
Nombre técnicoENTIDAD/PROPIETARIO/AMBOS/NO-ED/Transferencia No Completada/NO-TYC/LPDI
Función en códigosendTransferNotification('fallen')
Asunto“La transferencia no se completó — Ecosistema LPDI”
TriggerCron: cuando la cadena de sucesión se agota (todos los sucesores vencen/rechazan sin aceptar).
DestinatarioEl propietario original
CTABotón: “Ir a la entidad” → perfil de la entidad
DescripciónInforma que la transferencia no prosperó y que sigue siendo el propietario; puede reiniciar el proceso.
TyC / TratamientoNO — Correo transaccional. La aceptación de TYC/PDP (cuentas nuevas) ocurre en la página de aceptación, no por correo.
EstadoCorreo listo y CABLEADO — lo dispara el cron al agotarse la cadena.

PREVIEW DEL CORREO

Preview Transferencia no completada
61NUEVOICG sin contactoActivo↑ índice
Nombre técnicoICG/PROPIETARIO/EXIST/NO-ED/ICG Sin Contacto/NO-TYC/LPDI
Función en códigosendTransferNotification('icg_sin_contacto')
Asunto“Tu ICG quedó sin persona de contacto — Ecosistema LPDI”
TriggerCuando el contacto de un ICG (que no es el propietario) cierra su cuenta (POST /api/account/delete).
DestinatarioEl propietario del ICG
CTABotón: “Registrar nuevo contacto” → FID (/dashboard/icg/nuevo)
DescripciónAvisa que el contacto ya no está disponible y que se limpiaron sus datos; invita a registrar un contacto nuevo.
TyC / TratamientoNO — Correo transaccional. La aceptación de TYC/PDP (cuentas nuevas) ocurre en la página de aceptación, no por correo.
EstadoCorreo listo y CABLEADO — se envía al cerrar la cuenta del contacto.

PREVIEW DEL CORREO

Preview ICG sin contacto

ADMINISTRATIVOS — Reportes automáticos internos (1)

31Reporte Diario Ecosistema LPDIActivo↑ índice
Nombre técnicoCRON/ADMIN/EXIST/NO-ED/Reporte Diario/NO-TYC/LPDI
Función en códigobuildDailyReportHtml + sendDailyReportEmail (email-daily-report.ts)
EndpointGET /api/cron/daily-report (protegido con Authorization: Bearer ${CRON_SECRET})
Asunto“Reporte diario Ecosistema LPDI — {fecha}”
TriggerCron diario configurado a las 6:00 AM Lima/Bogotá (11:00 UTC) en vercel.json
Destinatariocomunidad@lpdi.co (configurable vía DAILY_REPORT_TO)
Remitente“Ecosistema LPDI” <no-reply@lpdi.co> vía Resend SMTP
SeccionesAltas 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)(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.
PreviewPreview Reporte Diario
CTASin botón — correo informativo con datos tabulares.
TyC / TratamientoNO — Correo administrativo interno. No requiere consentimiento del destinatario.
Audit logLas 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).
LPDI
Ecosistema LPDI · eco.lpdi.co
Versión 11 — +5 correos de Transferencia de entidades (2026-07-05) — Reporte Diario v3 (Entidades + Usuarios separados) — 2026-07-03
58 correos + 3 eliminados · Fuentes: Supabase Management API + código LPDI + evidencia de envío en base de datos
SMTP: no-reply@lpdi.co vía Resend (operativo en producción) · Sender: “Ecosistema LPDI”

BENEFICIOS (PERKS) (12)

32Registro exitoso de beneficio (FP)Activo↑ índice
Nombre técnicoFP/ALIADO/Registro Exitoso
Función en códigosendPerkNotification('registro_exitoso')
Asunto“¡Registro exitoso de beneficio!”
TriggerPATCH /api/perks/[id] al pasar a enviado (desde otro estado).
DestinatarioAliado (correo del registrante)
CTABotón: “Ver registro” → /dashboard/beneficios
DescripciónConfirma al aliado que su beneficio quedó en revisión por el equipo LPDI.
EstadoFuncionando.

PREVIEW DEL CORREO

Preview
33Nuevo beneficio por aprobar (FP · equipo)Activo↑ índice
Nombre técnicoFP/EQUIPO/Nuevo por Aprobar
Función en códigosendPerkNotification('nuevo_por_aprobar')
Asunto“Nuevo beneficio por aprobar”
TriggerPATCH → enviado desde borrador/cambios.
DestinatarioAdmin asignado
CTABotón: “Revisar beneficio” → /dashboard/beneficios/admin
DescripciónAvisa al equipo que hay un beneficio nuevo pendiente de aprobación.
EstadoFuncionando.

PREVIEW DEL CORREO

Preview
34Beneficio aprobado (FP)Activo↑ índice
Nombre técnicoFP/ALIADO/Aprobado
Función en códigosendPerkNotification('aprobado')
Asunto“¡Beneficio aprobado!”
TriggerAcción admin aprobar_y_publicar/publicar.
DestinatarioAliado
CTABotón: “Ver beneficio” → /perks/{id}
DescripciónNotifica al aliado que su beneficio fue aprobado y publicado.
EstadoFuncionando.

PREVIEW DEL CORREO

Preview
35Beneficio aprobado — publicación programada (FP)Activo↑ índice
Nombre técnicoFP/ALIADO/Aprobado Programado
Función en códigosendPerkNotification('aprobado_programado')
Asunto“¡Beneficio aprobado!”
TriggerAcción admin aprobar con fecha de publicación futura (vigencia posterior a la aprobación).
DestinatarioAliado
CTABotón: “Ver registro” → /dashboard/beneficios
DescripciónSegundo 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.
EstadoFuncionando. NUEVO (F2).

PREVIEW DEL CORREO

Preview
36Beneficio actualizado (FP)Activo↑ índice
Nombre técnicoFP/ALIADO/Actualizado
Función en códigosendPerkNotification('actualizado')
Asunto“¡Beneficio actualizado!”
TriggerPATCH al pasar un publicado a edicion.
DestinatarioAliado
CTABotón: “Ver beneficio” → /perks/{id}
DescripciónConfirma que los cambios se guardaron y pasarán por aprobación.
EstadoFuncionando.

PREVIEW DEL CORREO

Preview
37Cambios de beneficio por aprobar (FP · equipo)Activo↑ índice
Nombre técnicoFP/EQUIPO/Cambios por Aprobar
Función en códigosendPerkNotification('cambios_por_aprobar')
Asunto“Cambios de beneficio por aprobar”
TriggerPATCH → enviado desde edicion.
DestinatarioAdmin asignado
CTABotón: “Revisar cambios” → /dashboard/beneficios/admin
DescripciónAvisa al equipo que un beneficio publicado tiene cambios por revisar.
EstadoFuncionando.

PREVIEW DEL CORREO

Preview
38Solicitud de ajustes (FP)Activo↑ índice
Nombre técnicoFP/ALIADO/Solicitud de Ajustes
Función en códigosendPerkNotification('cambios_solicitados')
Asunto“Tu beneficio necesita unos ajustes”
TriggerAcción admin solicitar_cambios (→ cambios, recuperable).
DestinatarioAliado
CTABotón: “Ajustar beneficio” → /dashboard/beneficios
DescripciónEl admin pide ajustes antes de publicar (incluye el detalle). Reemplaza al “no aceptado” en esta acción porque el estado es recuperable.
EstadoFuncionando. NUEVO.

PREVIEW DEL CORREO

Preview
39Beneficio no aceptado (FP)Listo, sin disparo↑ índice
Nombre técnicoFP/ALIADO/No Aceptado
Función en códigosendPerkNotification('no_aceptado')
Asunto“Beneficio no aceptado”
TriggerRechazo definitivo.
DestinatarioAliado
CTABotón: “Ver registro” → /dashboard/beneficios
DescripciónPlantilla para rechazo definitivo. Hoy ninguna acción la dispara (solicitar cambios usa la #38); queda lista si se define una acción de rechazo.
EstadoDisponible (sin trigger).

PREVIEW DEL CORREO

Preview
40Beneficio terminado (FP)Activo↑ índice
Nombre técnicoFP/ALIADO/Terminado
Función en códigosendPerkNotification('terminado')
Asunto“Beneficio terminado”
TriggerAcción admin desactivar o cierre por vigencia.
DestinatarioAliado · con copia (cc) al admin asignado
CTABotón: “Ver registro” → /dashboard/beneficios
DescripciónNotifica que el beneficio fue cerrado y ya no aparece en el catálogo.
EstadoFuncionando (admin desactivar).

PREVIEW DEL CORREO

Preview
41Beneficio eliminado (FP)Activo↑ índice
Nombre técnicoFP/ALIADO/Eliminado
Función en códigosendPerkNotification('eliminado')
Asunto“Beneficio eliminado”
TriggerDELETE /api/perks/[id] (soft-delete → papelera).
DestinatarioAliado · con copia (cc) al admin asignado
CTABotón: “Validar en la base de datos” → /dashboard/beneficios
DescripciónNotifica que el beneficio fue enviado a la papelera (recuperable 30 días).
EstadoFuncionando.

PREVIEW DEL CORREO

Preview
42Nuevo registro en tu beneficio (FP)Activo↑ índice
Nombre técnicoFP/ALIADO/Registro en Beneficio
Función en códigosendPerkRegistrationEmail()
Asunto“¡Nuevo registro en tu beneficio!”
TriggerUn usuario se registra para obtener el beneficio — cualquier tipo (código, enlace, agenda o «dejar datos»), en /api/perks/[id]/redeem.
DestinatarioAliado (dueño del beneficio) · con copia (cc) a partners@lpdi.co
CTABotón: “Ver referido” → /dashboard/beneficios/referidos (Mis referidos)
DescripciónAvisa 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.
EstadoFuncionando. NUEVO.

PREVIEW DEL CORREO

Preview
54NUEVOConfirmación de solicitud de beneficio (al usuario)Activo↑ índice
Nombre técnicoFP/USUARIO/Solicitud recibida/NO-TYC/LPDI
Función en códigosendPerkRedemptionUserEmail
Asunto“Recibimos tu solicitud — Ecosistema LPDI”
TriggerEl usuario solicita un beneficio en /api/perks/[id]/redeem (cualquier tipo de canje).
DestinatarioUsuario que solicitó el beneficio · copia a partners@lpdi.co
CTABotón: “Ir al ecosistema” → eco.lpdi.co
DescripciónConfirma 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.
EstadoFuncionando.

PREVIEW DEL CORREO

Preview

EVENTOS (10)

43Registro exitoso de evento (FE)Activo↑ índice
Nombre técnicoFE/ORGANIZADOR/Registro Exitoso
Función en códigosendEventNotification('registro_exitoso')
Asunto“¡Registro exitoso de evento!”
TriggerAction submit de /registro-evento (evento en PENDING).
DestinatarioOrganizador (contact_email)
CTABotón: “Ver registro” → /dashboard
DescripciónConfirma al organizador que su evento quedó en revisión. Incluye el código.
EstadoFuncionando.

PREVIEW DEL CORREO

Preview
44Nuevo evento por aprobar (FE · equipo)Activo↑ índice
Nombre técnicoFE/EQUIPO/Nuevo por Aprobar
Función en códigosendEventNotification('nuevo_por_aprobar')
Asunto“Nuevo evento por aprobar”
TriggerAction submit de /registro-evento.
DestinatarioAdmin asignado
CTABotón: “Revisar evento” → /dashboard
DescripciónAvisa al equipo que hay un evento nuevo pendiente de revisión.
EstadoFuncionando.

PREVIEW DEL CORREO

Preview
45Evento aprobado (FE)Activo↑ índice
Nombre técnicoFE/ORGANIZADOR/Aprobado
Función en códigosendEventNotification('aprobado')
Asunto“¡Evento aprobado!”
TriggerAcción admin del panel de eventos (N13).
DestinatarioOrganizador
CTABotón: “Ver evento” → /dashboard
DescripciónNotifica al organizador que su evento fue aprobado.
EstadoFuncionando.

PREVIEW DEL CORREO

Preview
46Evento aprobado — publicación programada (FE)Activo↑ índice
Nombre técnicoFE/ORGANIZADOR/Aprobado Programado
Función en códigosendEventNotification('aprobado_programado')
Asunto“¡Evento aprobado!”
TriggerAcción admin aprobar con fecha de publicación futura.
DestinatarioOrganizador
CTABotón: “Ver registro” → /dashboard
DescripciónSegundo flujo de aprobación de evento (F2): informa la fecha futura de publicación automática. Incluye el badge del código del evento.
EstadoFuncionando. NUEVO (F2).

PREVIEW DEL CORREO

Preview
47Evento actualizado (FE)Activo↑ índice
Nombre técnicoFE/ORGANIZADOR/Actualizado
Función en códigosendEventNotification('actualizado')
Asunto“¡Evento actualizado!”
TriggerEdición de un evento ya aprobado (se guarda manteniendo el estado aprobado).
DestinatarioOrganizador
CTABotón: “Ver evento” → /dashboard
DescripciónAl organizador: su evento publicado fue actualizado.
EstadoFuncionando.

PREVIEW DEL CORREO

Preview
48Cambios de evento por aprobar (FE · equipo)Listo, sin disparo↑ índice
Nombre técnicoFE/EQUIPO/Cambios por Aprobar
Función en códigosendEventNotification('cambios_por_aprobar')
Asunto“Cambios de evento por aprobar”
TriggerUn 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.)
DestinatarioAdmin asignado
CTABotón: “Revisar cambios” → /dashboard
DescripciónAvisa al equipo que un evento tiene cambios enviados por un usuario sin auto-aprobación y deben revisarse.
EstadoPendiente — se activa con el flujo de «Mis eventos».

PREVIEW DEL CORREO

Preview
49Evento no aceptado (FE)Activo↑ índice
Nombre técnicoFE/ORGANIZADOR/No Aceptado
Función en códigosendEventNotification('no_aceptado')
Asunto“Evento no aceptado”
TriggerAcción admin de rechazo (N13).
DestinatarioOrganizador
CTABotón: “Ver registro” → /dashboard
DescripciónNotifica al organizador que su evento no fue aceptado.
EstadoFuncionando.

PREVIEW DEL CORREO

Preview
50Evento eliminado (FE)Activo↑ índice
Nombre técnicoFE/ORGANIZADOR/Eliminado
Función en códigosendEventNotification('eliminado')
Asunto“Evento eliminado”
TriggerEliminación de un evento (N13).
DestinatarioOrganizador · con copia (cc) al admin asignado
CTABotón: “Ver registro” → /dashboard
DescripciónNotifica al organizador que su evento fue eliminado.
EstadoFuncionando.

PREVIEW DEL CORREO

Preview
51Publicación automática de evento (FE)Activo↑ índice
Nombre técnicoFE/ORGANIZADOR/Publicación Automática
Función en códigosendEventNotification('publicacion_exitosa')
Asunto“¡Publicación automática de evento!”
TriggerRegistro de evento por un usuario con privilegio de auto-publicación (F6): el evento se publica sin pasar por aprobación.
DestinatarioOrganizador · con copia (cc) al admin asignado
CTABotón: “Ver evento” → /dashboard
DescripciónConfirma 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).
EstadoFuncionando. NUEVO (F6).

PREVIEW DEL CORREO

Preview
52Solicitud de ajustes (FE)Activo↑ índice
Nombre técnicoFE/ORGANIZADOR/Solicitud de Ajustes
Función en códigosendEventNotification('cambios_solicitados')
Asunto“Tu evento necesita unos ajustes”
TriggerEl admin pide cambios a un evento (acción «solicitar cambios» en el panel de aprobación).
DestinatarioOrganizador · con copia (cc) al admin que la envía
CTABotón: “Ajustar evento” → /dashboard
DescripciónAl 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.
EstadoFuncionando. NUEVO.

PREVIEW DEL CORREO

Preview

CORREOS ELIMINADOS — consolidados o retirados del sistema (3)

17ELIMINADOExpiración de RegistroEliminado↑ índice
EstadoELIMINADO — 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 eliminadasendStartupPurgedEmail (removido de email.ts)
19ELIMINADOInvitación al Equipo (usuario existente)Eliminado↑ índice
EstadoELIMINADO — Consolidado en #18.
RazónEl 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 documentadoLas dos variantes (usuario nuevo + SI-TYC · usuario existente + NO-TYC) ahora se describen dentro de #18.
30ELIMINADOExpiración de Registro ICGEliminado↑ índice
EstadoELIMINADO — 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 eliminadasendIcgPurgedEmail (removido de email.ts)