LPDI

Inventario de Correos Electrónicos

Ecosistema LPDI — Versión 14 — +2 correos de Cambio de CEO (2026-07-20) — verificado contra el código 2026-07-20

64 correos + 4 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 (64 correos + 4 eliminados)

Estado:Activo 64 se disparan hoyListo, sin disparo 0Borrador 0 diseño sin implementarEliminado 4 retirados
Los correos 39 (Beneficio no aceptado) y 48 (Cambios de evento por aprobar), antes «listo sin disparo», quedaron cableados y activos el 2026-07-07. Se agregaron los correos nuevos 63 y 64 (cambios de beneficio aprobados / no aprobados).
Actualización 2026-07-20: se agregaron los correos nuevos #67 (aviso al registrante o administrador de la entidad) y #68 (aviso al CEO anterior) del flujo de cambio de CEO explícito. Ambos son informativos y sin botón de acción: notifican un cambio ya materializado. El CEO anterior conserva su vínculo verificado, sus autorizaciones de visibilidad y sus datos; solo cambia su cargo. La visibilidad ante los ICG nunca se otorga ni se modifica por este cambio de rol (Ley 1581).
Actualización 2026-07-18: se regeneraron desde los builders reales (src/lib/server/email.ts y email-team.ts) las tarjetas de todos los correos activos que cambiaron en los ciclos 1 y 2 (designación de CEO fusionada #13, invitación al equipo de botón único #18, bienvenidas al equipo sin credenciales #20/#21, cuenta creada #65, contacto ICG fusionado #28/#29). Se agregó el correo nuevo #66 (Solicitud de visibilidad de miembro). Además, cada correo cuyo botón abre una pantalla muestra ahora el screenshot de esa pantalla (etiqueta «Pantalla que abre el botón»): #13, #18, #28/#29 y #66.
USUARIO (15) STARTUP (13) ICG (3) ENTIDADES (8) ADMINISTRATIVOS (1) PERKS (14) EVENTOS (10) ELIMINADOS (4)
#Nombre TécnicoAsunto del correoDestino CTADescripciónEstadoTyCImg
USUARIO — Correos de cuenta y autenticación (15)
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
62USUARIO/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
53USUARIO/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
65USUARIO/USER/NUEVO/NO-ED/Cuenta Creada/NO-TYC/LPDI“Tu cuenta fue creada — Ecosistema LPDI”eco.lpdi.co/loginAviso al CEO nuevo de que su cuenta quedó activa tras registrarse en el FUS. Sin contraseña (la definió él). Los miembros nuevos cumplen este rol con el correo #20/#21.ActivoNO
STARTUP — Registro, equipo y ciclo de vida de Startups/PyMEs (13)
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}”ELIMINADO — Fusionado en #13. Un único correo de designación de CEO, sin contraseña temporal. Los enlaces ya enviados siguen operativos vía /aceptar-designacion.Eliminado
13STARTUP/CEO/AMBOS/SI-ED/Designación de CEO (fusionado 12+13)/NO-TYC/LPDI“Has sido designado CEO de {empresa} en el Ecosistema LPDI”/team/confirmar?token=Designación de CEO, tenga o no cuenta. Un solo template, CTA «Revisar designación», sin contraseña temporal. TyC se aceptan en el FUS.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”eco.lpdi.co/dashboardMiembro aceptado CON permiso de edición. Sin credenciales.ActivoNO
21STARTUP/TEAM/EXIST/NO-ED/Bienvenida sin Edición/NO-TYC/LPDI“Bienvenido al equipo de {empresa} en el Ecosistema LPDI”eco.lpdi.co/dashboardMiembro aceptado SIN permiso de edición. Sin credenciales.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
14STARTUP/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
66STARTUP/TEAM/EXIST/NO-ED/Solicitud de Visibilidad/NO-TYC/LPDI“Autoriza la visibilidad de tu perfil en el equipo de {empresa}”/team/visibilidad?token=A un miembro YA verificado se le pide solo autorizar la visibilidad de su perfil (LinkedIn + género). NO re-verifica el vínculo; el botón abre la pantalla de autorización.ActivoNO
67NUEVOSTARTUP/USER/EXIST/NO-ED/Cambio de CEO (aviso al registrante)/NO-TYC/LPDI“El CEO de {empresa} ha cambiado”sin CTAAvisa al registrante o administrador de la entidad que el cargo de CEO cambió: quién salía, quién entra, quién lo ejecutó y cuándo. Informativo, sin botón de acción.ActivoNO
68NUEVOSTARTUP/CEO/EXIST/NO-ED/Cambio de CEO (aviso al CEO anterior)/NO-TYC/LPDI“Tu rol en {empresa} cambió”sin CTAAvisa al CEO anterior que deja el cargo y continúa como miembro del equipo. Su vínculo verificado y sus autorizaciones de visibilidad NO cambian. Informativo, sin botón de acción.ActivoNO
ICG — Registro y ciclo de vida de ICGs (3)
28ICG/CON/NUEVO/NO-ED/Vinculación Contacto (fusionado 28+29)/SI-TYC/LPDI“{ICG} te ha vinculado como contacto en el Ecosistema LPDI”/icg/confirmar?token=Contacto designado sin cuenta LPDI. Fusionado: sin contraseña temporal, CTA «Revisar vinculación». TyC en el FUS.ActivoSI
29ICG/CON/EXIST/NO-ED/Vinculación Contacto (fusionado 28+29)/NO-TYC/LPDI“{ICG} te ha vinculado como contacto en el Ecosistema LPDI”/icg/confirmar?token=Mismo template que #28 (rama userExists=true): contacto con cuenta LPDI. CTA «Revisar vinculación».ActivoNO
55ICG/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)
56ENTIDAD/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
57ENTIDAD/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
58ENTIDAD/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
59ENTIDAD/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
60ENTIDAD/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
61ICG/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 desde el panel admin (acción «Rechazar»). El beneficio va a «Eliminados / Rechazados» (borrado a 30 días).ActivoNO
63FP/ALIADO/Cambios Aprobados/NO-TYC/LPDI“Los cambios de tu beneficio fueron aprobados”/perks/{id}Al aliado: el admin aprobó los cambios a un beneficio ya publicado; entran al catálogo.ActivoNO
64FP/ALIADO/Cambios No Aprobados/NO-TYC/LPDI“Los cambios de tu beneficio no fueron aprobados”/perks/{id}Al aliado: el admin rechazó los cambios; el beneficio sigue publicado como estaba.ActivoNO
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
54FP/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 editor que no es de confianza editó un evento ya aprobado; los cambios pasan a revisión. Cableado 2026-07-07.ActivoNO
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 (15)

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écnicoUSUARIO/USER/NUEVO/NO-ED/Recordatorio día 3/NO-TYC/LPDI
Función en códigolpdi-confirmation-cron.py (modo reminder, plantilla branded día 3)
Asunto“Recordatorio: confirma tu cuenta en el Ecosistema LPDI”
TriggerCron de verificación (Opción B) en Hetzner — día 3 sin verificar el correo. Activo desde 2026-07-06 (crontab 45 10 * * *).
DestinatarioCualquier cuenta con el correo sin verificar (profiles.email_verified_at IS NULL), sea usuario individual, de startup o de ICG. Se excluyen las cuentas de prueba. No es exclusivo de startups.
CTABotón: “Confirmar mi cuenta”
Destino: ${confirmUrl} → URL de confirmación Supabase
DescripciónPrimer recordatorio amigable si la persona no ha verificado su correo 3 días después del registro. Muestra días restantes. Si verifica 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écnicoUSUARIO/USER/NUEVO/NO-ED/Recordatorio Urgente día 6/NO-TYC/LPDI
Función en códigolpdi-confirmation-cron.py (modo reminder, plantilla branded día 6)
Asunto“Ultimo aviso: confirma tu cuenta en el Ecosistema LPDI”
TriggerCron de verificación (Opción B) en Hetzner — día 6 sin verificar el correo. Mismo cron que #15.
DestinatarioCualquier cuenta con el correo sin verificar (profiles.email_verified_at IS NULL). Misma lógica que el correo #15.
CTABotón: “Confirmar mi cuenta”
Destino: ${confirmUrl} → URL de confirmación Supabase
DescripciónSegundo recordatorio (día 6), más cerca del vencimiento. Mismo diseño que el #15: el cron envía el mismo correo el día 3 y el día 6. Si la persona no verifica, al día 8 el cron marca la cuenta account_status=inactive y envía el correo #62 (Cuenta Inactivada), con 30 días de gracia para reactivarla verificando.
TyC / TratamientoNO — TyC ya aceptados en registro.

PREVIEW DEL CORREO

Preview
62Cuenta 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.

PREVIEW DEL CORREO

Preview correo 62
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
53Actualizació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
65Tu cuenta fue creadaActivo↑ índice
Nombre técnicoUSUARIO/USER/NUEVO/NO-ED/Cuenta Creada/NO-TYC/LPDI
Función en códigobuildAccountCreatedNotificationHtml / sendAccountCreatedNotificationEmail
Asunto“Tu cuenta fue creada — Ecosistema LPDI”
TriggerUn CEO designado sin cuenta previa completa su registro en el FUS (/registro-usuario) tras aceptar la designación. Sustituye al aviso de credenciales del antiguo correo #12.
DestinatarioEmail del CEO recién registrado
CTABotón: “Iniciar sesión”
Destino: https://eco.lpdi.co/login
DescripciónAviso breve de que la cuenta quedó activa. Sin contraseña: la persona la definió ella misma en el FUS. Los miembros nuevos no reciben este correo; su bienvenida #20/#21 ya cumple ese rol (para no mandar dos correos al mismo buzón en el mismo flujo).
TyC / TratamientoNO — Los TyC ya se aceptaron en el FUS al crear la cuenta.

PREVIEW DEL CORREO (regenerado 2026-07-17 desde buildAccountCreatedNotificationHtml)

Preview

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

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
12ELIMINADOBienvenida CEO Designado (usuario nuevo)Eliminado↑ índice
EstadoELIMINADO — Fusionado en #13.
RazónLa designación de CEO ya no crea cuenta ni contraseña temporal: el correo #13 pasó a ser un único template que se envía tenga o no cuenta el CEO. El CTA «Revisar designación» lleva a /team/confirmar; el usuario nuevo crea su cuenta y acepta TyC en el FUS (/registro-usuario). Mantener un correo aparte «con credenciales» para el CEO sin cuenta quedó sin sentido.
Enlaces en vueloLos correos 12/13 ya enviados siguen operativos: sus enlaces magiclink resuelven vía /aceptar-designacion (ruta legacy viva, sin sellar visibilidad automáticamente). El flujo nuevo deja de generarlos.
Dónde queda documentadoEl correo de designación de CEO, ahora único, se describe en #13.
13Designación de CEO (fusionado 12+13)Activo↑ índice
Nombre técnicoSTARTUP/CEO/AMBOS/SI-ED/Designación de CEO/NO-TYC/LPDI
Función en códigobuildCeoWelcomeHtml / sendCeoWelcomeEmail — un solo template (sin rama userExists)
Asunto“Has sido designado CEO de {empresa} en el Ecosistema LPDI”
TriggerSe designa un CEO (registro de startup FS/FD o Panel 6), tenga o no cuenta previa. Absorbe al antiguo correo #12.
DestinatarioEmail del CEO designado
CTABotón único: “Revisar designación”
Destino: ${originUrl}/team/confirmar?token=${token}
DescripciónNotifica al CEO que {designatorName} lo designó CEO de la empresa. Sin contraseña temporal y sin rama usuario nuevo/existente: la pantalla /team/confirmar resuelve la diferencia (usuario nuevo va al FUS a crear su cuenta; usuario existente confirma y va a login). El pie remite al correo corporativo de la empresa para dudas.
TyC / TratamientoNO en el correo — Los TyC y el Tratamiento de Datos se aceptan en el FUS (/registro-usuario) cuando el usuario nuevo crea su cuenta con su propia contraseña. El usuario existente ya los aceptó.

PREVIEW DEL CORREO (regenerado 2026-07-18 desde buildCeoWelcomeHtml)

Preview

PANTALLA QUE ABRE EL BOTÓN — “Revisar designación” → /team/confirmar?token= (variante CEO)

Pantalla /team/confirmar variante CEO
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ódigobuildTeamInvitationHtml / sendTeamInvitationEmail (un template, 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)
CTABotón único (azul): “Revisar vinculación”
Destino: ${confirmUrl}/team/confirmar. El correo ya no decide (se quitó el botón de rechazo ${rejectUrl}): solo lleva a la pantalla donde se acepta o rechaza y se marca la casilla de visibilidad.
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

PANTALLA QUE ABRE EL BOTÓN — “Revisar vinculación” → /team/confirmar?token= (variante miembro)

Pantalla /team/confirmar variante miembro
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 que fue aceptado en el equipo CON permiso de edición. Ninguna variante lleva credenciales: el usuario existente usa su contraseña y el usuario nuevo (creado en el FUS) ya definió la suya — solo se le informa «Tu cuenta fue creada. Inicia sesión con el correo y la contraseña que definiste». 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. Ninguna variante lleva credenciales: usuario existente usa su contraseña; usuario nuevo (FUS) ya definió la suya y solo recibe el aviso «Tu cuenta fue creada».
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
14Seguimiento 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
66Solicitud de Visibilidad (miembro verificado)Activo↑ índice
Nombre técnicoSTARTUP/TEAM/EXIST/NO-ED/Solicitud de Visibilidad/NO-TYC/LPDI
Función en códigobuildVisibilityRequestHtml / sendVisibilityRequestEmail (email-team.ts)
Asunto“Autoriza la visibilidad de tu perfil en el equipo de {empresa}”
TriggerA un miembro ya verificado se le pide únicamente que autorice la visibilidad de su perfil. NO re-verifica su vínculo con el equipo (ciclo 2, D5).
DestinatarioEmail del miembro verificado del equipo de la startup
CTABotón (verde): “Autorizar visibilidad”
Destino: ${visibilityUrl}/team/visibilidad?token=. La casilla/decisión vive en la pantalla, nunca dentro del botón del correo (DESIGN.md §9).
DescripciónExplica que al autorizar, su perfil de LinkedIn y su género serán visibles para los ICG cuando consulten el perfil de la compañía, y enumera qué pierde si no autoriza. Su vínculo con el equipo ya está confirmado; esta autorización es una decisión aparte y voluntaria.
TyC / TratamientoNO — No re-verifica ni re-acepta TyC. El clic en “Autorizar visibilidad” ES el acto expreso de consentimiento (Ley 1581); no autorizar = no actuar.

PREVIEW DEL CORREO (regenerado 2026-07-18 desde buildVisibilityRequestHtml)

Preview correo solicitud de visibilidad

PANTALLA QUE ABRE EL BOTÓN — “Autorizar visibilidad” → /team/visibilidad?token=

Pantalla /team/visibilidad
67NUEVOCambio de CEO (aviso al registrante / administrador)Activo↑ índice
Nombre técnicoSTARTUP/USER/EXIST/NO-ED/Cambio de CEO (aviso al registrante)/NO-TYC/LPDI
Función en códigobuildCeoChangeAdminHtml / sendCeoChangeAdminEmail (email-team.ts)
Asunto“El CEO de {empresa} ha cambiado”
TriggerAl completarse el cambio de CEO (flujo explícito de designación con aceptación, punto 52). Se envía siempre que el cambio se materializa, incluso si quien lo ejecutó es el propio destinatario: la notificación es evidencia, no cortesía.
DestinatarioRegistrante o administrador de la entidad. Dedup: si el registrante y el CEO anterior son la misma persona, recibe sólo el #68.
CTANinguna. Correo informativo, sin botón de acción. Cierra con la vía de contacto soporte@lpdi.co por si el cambio no corresponde.
DescripciónCuadro con CEO anterior, CEO actual, quién realizó el cambio y fecha; luego explica que el CEO anterior deja el cargo y continúa como miembro del equipo con su vínculo intacto, y que el nuevo CEO pasa a gestionar el perfil de la compañía. Molde visual del correo #13 (logo, franja azul, título navy, footer estándar).
TyC / TratamientoNO — No re-verifica ni re-acepta TyC. Ley 1581: el correo no otorga ni insinúa visibilidad ante los ICG; esa autorización es siempre expresa y aparte, y no cambia por el cambio de rol.

PREVIEW DEL CORREO (generado 2026-07-20 desde buildCeoChangeAdminHtml)

Preview correo 67 cambio de CEO aviso al registrante
68NUEVOCambio de CEO (aviso al CEO anterior)Activo↑ índice
Nombre técnicoSTARTUP/CEO/EXIST/NO-ED/Cambio de CEO (aviso al CEO anterior)/NO-TYC/LPDI
Función en códigobuildCeoChangeFormerCeoHtml / sendCeoChangeFormerCeoEmail (email-team.ts)
Asunto“Tu rol en {empresa} cambió”
TriggerAl completarse el cambio de CEO, en el mismo paso que el #67. Si no había CEO vinculado anterior, va al correo de la fila degradada; si no había fila alguna, sólo sale el #67.
DestinatarioCEO anterior de la startup / PyMe.
CTANinguna. Correo informativo, sin botón de acción. Cierra con la vía de contacto soporte@lpdi.co por si el cambio no corresponde.
DescripciónLe informa que deja el cargo de CEO y continúa como miembro del equipo. Dice explícitamente que su vínculo verificado y sus autorizaciones de visibilidad no cambian, que sus datos se conservan tal como los registró y que lo único que cambia es su cargo, editable desde el perfil de la compañía. Cierra indicando quién asumió el cargo, quién realizó el cambio y en qué fecha.
TyC / TratamientoNO — No re-verifica ni re-acepta TyC. Ley 1581: las columnas de consentimiento de visibilidad no se tocan en el cambio de rol y el correo lo declara al destinatario.

PREVIEW DEL CORREO (generado 2026-07-20 desde buildCeoChangeFormerCeoHtml)

Preview correo 68 cambio de CEO aviso al CEO anterior

ICG — Registro y ciclo de vida (3)

28Vinculación de Contacto ICG (usuario nuevo)Activo↑ índice
Nombre técnicoICG/CON/NUEVO/NO-ED/Vinculación Contacto (fusionado 28+29)/SI-TYC/LPDI
Función en códigobuildIcgContactInvitationHtml / sendIcgContactInvitationEmail (userExists=false) — reemplaza al deprecado sendContactWelcomeEmail
Asunto“{ICG} te ha vinculado 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 de la persona de contacto designada por el ICG
CTABotón único: “Revisar vinculación”
Destino: ${reviewUrl}/icg/confirmar?token=. La pantalla resuelve la rama: usuario nuevo va al FUS a crear cuenta; usuario existente confirma directo. La cuenta NUNCA se crea en el correo.
DescripciónFusionado (antes 28+29), como el 12+13 del CEO. Un solo template; la única rama es el párrafo del CTA según userExists. Sin contraseña temporal (la cuenta nace en el FUS). Informa qué datos se comparten con el ecosistema (nombres, apellidos, cargo en el ICG y LinkedIn) y que el celular es privado.
TyC / TratamientoSÍ — Se aceptan en el FUS (/registro-usuario) al crear la cuenta, no en el correo. El usuario existente ya los aceptó.

PREVIEW DEL CORREO (regenerado 2026-07-18 desde buildIcgContactInvitationHtml, userExists=false)

Preview correo contacto ICG (nuevo)

PANTALLA QUE ABRE EL BOTÓN — “Revisar vinculación” → /icg/confirmar?token=

Pantalla /icg/confirmar
29Vinculación de Contacto ICG (usuario existente)Activo↑ índice
Nombre técnicoICG/CON/EXIST/NO-ED/Vinculación Contacto (fusionado 28+29)/NO-TYC/LPDI
Función en códigobuildIcgContactInvitationHtml / sendIcgContactInvitationEmail (userExists=true) — mismo template que #28
Asunto“{ICG} te ha vinculado como contacto en el Ecosistema LPDI”
TriggerICG registra contacto de compañía — el contacto YA tiene cuenta LPDI
DestinatarioEmail de la persona de contacto designada por el ICG
CTABotón único: “Revisar vinculación”
Destino: ${reviewUrl}/icg/confirmar?token=. Al ser usuario existente, la pantalla confirma la vinculación sin crear cuenta.
DescripciónRama userExists=true del template fusionado: cambia solo el párrafo del CTA («Ya tienes una cuenta… Revisa la vinculación y decide si aceptas»). Mismo bloque informativo de datos compartidos y celular privado.
TyC / TratamientoNO — Ya tiene cuenta y aceptó TyC previamente.

PREVIEW DEL CORREO (regenerado 2026-07-18 desde buildIcgContactInvitationHtml, userExists=true)

Preview correo contacto ICG (existente)

PANTALLA QUE ABRE EL BOTÓN — misma pantalla /icg/confirmar?token= (ver #28); para usuario existente el botón confirma sin crear cuenta.

55Seguimiento 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)

56Confirmació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écnicoENTIDAD/USER/EXIST/SI-ED/Eliminación de Entidad/NO-TYC/LPDI — aplica a Startup e ICG (función genérica)
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.

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
Correos 57 a 60 (transferencia): el texto es dinámico y aplica por igual a Startup e ICG (sendTransferNotification con entityKind y entityLabel: inserta el nombre real de la entidad, sea “la startup Acme” o “la ICG Fondo X”). Los previews de abajo usan una startup de ejemplo solo para ilustrar; en producción el nombre cambia según la entidad transferida.
57Invitació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
58Recordatorio 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
59Transferencia 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
60Transferencia 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
61ICG 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 14 — Correos 67/68 nuevos (cambio de CEO: aviso al registrante y al CEO anterior) — 2026-07-20
64 correos + 4 eliminados (64 activos) · 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) (14)

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)Activo↑ índice
Nombre técnicoFP/ALIADO/No Aceptado
Función en códigosendPerkNotification('no_aceptado')
Asunto“Beneficio no aceptado”
TriggerAcción «Rechazar» en el panel de admin de beneficios (primera revisión). Cableado 2026-07-07.
DestinatarioAliado
CTABotón: “Ver registro” → /dashboard/beneficios
DescripciónRechazo definitivo de un beneficio en primera revisión. El beneficio pasa a estado rechazado y va a «Eliminados / Rechazados» (borrado a los 30 días). Distinto de «Solicitar cambios» (#38), que es recuperable.
EstadoActivo.

PREVIEW DEL CORREO

Preview
63Cambios de beneficio aprobados (FP)Activo↑ índice
Nombre técnicoFP/ALIADO/Cambios Aprobados/NO-TYC/LPDI
Función en códigosendPerkNotification('cambios_aprobados')
Asunto“Los cambios de tu beneficio fueron aprobados”
TriggerEl admin aprueba (Aprobar y publicar / Publicar) los cambios de un beneficio ya publicado (venía de estado edicion). Cableado 2026-07-07.
DestinatarioAliado
CTABotón: “Ver beneficio” → perfil público del beneficio
DescripciónConfirma al aliado que los cambios que envió a un beneficio ya publicado fueron aprobados y ya están en el catálogo. Diferente del #33 (primera aprobación).
EstadoActivo.

PREVIEW DEL CORREO

Preview correo 63
64Cambios de beneficio no aprobados (FP)Activo↑ índice
Nombre técnicoFP/ALIADO/Cambios No Aprobados/NO-TYC/LPDI
Función en códigosendPerkNotification('cambios_rechazados')
Asunto“Los cambios de tu beneficio no fueron aprobados”
TriggerEl admin rechaza los cambios de un beneficio ya publicado (estado edicion). Cableado 2026-07-07.
DestinatarioAliado
CTABotón: “Ver beneficio” → perfil público del beneficio
DescripciónAvisa al aliado que los cambios que envió no fueron aprobados y que el beneficio sigue publicado tal como estaba antes (se descartan los cambios). Incluye el motivo si el admin lo indicó.
EstadoActivo.

PREVIEW DEL CORREO

Preview correo 64
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
54Confirmació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)Activo↑ í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)