LPDI Actualizado: 24-ago-2026 · Versión 22
LPDI

Inventario de Correos Electrónicos

Ecosistema LPDI — Versión 23 — Correos globales migrados a español de Colombia (es-CO/Bogotá) — corrige «setiembre»→«septiembre» — y #91 (Resumen de postulaciones) informa el período como día(s) calendario completos en la zona horaria de la campaña — 2026-09-13

87 correos + 4 eliminados · Organizados por: USUARIO → STARTUP → ICG → ENTIDADES → ADMINISTRATIVOS → PERKS → EVENTOS → SCOUTING

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

Estado:Activo 87 se disparan hoyListo, sin disparo 0Borrador 0 diseño sin implementarEliminado 4 retirados
Historial de versiones (9 actualizaciones) · la más reciente primero
Actualización 2026-09-13 (Versión 23 — locale es-CO + período de #91): dos cambios ya desplegados en producción. (a) Los correos globales de LPDI (Reporte Diario #31, Contraseña Actualizada #10, Ideas y mejoras #89, Solicitud de alianza #69) formateaban sus fechas con locale es-PE (Perú) + zona America/Lima, que produce «setiembre» en vez de «septiembre» (reportado por Frank). Se migraron a una fuente única, src/lib/server/email-locale.ts (es-CO / America/Bogota): Lima y Bogotá comparten el mismo offset GMT-5 (ninguno usa horario de verano), así que las horas mostradas NO cambian, solo el idioma regional del mes. Los correos por-campaña (Scouting, #90-#93) NO usan esta fuente; siguen con la zona configurada en cada convocatoria (sin cambios por este punto). (b) El correo #91 («Resumen de postulaciones», modo resumen) cambió el encabezado del período: antes informaba «de la primera a la última postulación»; ahora informa el/los día(s) calendario completos (00:00 a 23:59) en la zona horaria de la campaña — un solo día: «8 de septiembre de 2026 desde las 00:00 hasta las 23:59 (GMT-5)»; varios días: «desde el 8 de septiembre de 2026 a las 00:00 hasta el 10 de septiembre de 2026 a las 23:59 (GMT-5)». El listado numerado que sigue conserva la hora exacta de cada postulación, sin cambios. Los conteos del inventario no cambian (siguen 87 correos + 4 eliminados; no se agregan ni eliminan correos). Se regeneró el preview «con acceso al panel» de #91. Los previews de #31, #10, #89 y #69 no mostraban «setiembre» en la fecha de su captura vigente (mes sin diferencia de grafía) y no requirieron regenerarse; #70 (acuse de alianza al usuario) no muestra fecha alguna en el correo.
Actualización 2026-08-24 (Scouting: copy sincronizado con producción): los 4 correos ya estaban desplegados; esta actualización corrige el texto de sus tarjetas para que coincida con lo que reciben los destinatarios hoy. #90 ahora deja constancia de que la fecha y hora incluyen el huso horario, ej. «24 de agosto de 2026 a las 9:47 a. m. (GMT-5)». #91 queda documentado en sus dos modos reales: inmediato («Hay una nueva postulación en la convocatoria X») y resumen (intro con el conteo y el período, «Ingresa al dashboard para revisarlas.» en párrafo aparte, y las postulaciones numeradas de la más reciente a la más antigua); el botón real es «Ver aplicaciones». #92 queda documentado con sus dos diseños reales: a la startup («[correo] dio la orden de retirar la postulación…», botón «Aplicar de nuevo») y al convocante («[startup] retiró su postulación…», botón «Mis campañas»). #93 ahora incluye quién designó al destinatario («Fuiste designado por [correo] para recibir las notificaciones…»). Se actualizaron los 4 previews con capturas reales de producción; #91 y #92 suman una segunda captura para su variante adicional.
Actualización 2026-08-22 (Scouting + ciclo de vida de borradores): se agregaron 7 correos nuevos. Nueva sección SCOUTING (migración 190): #90 confirmación al que aplica (siempre, sin importar la configuración del organizador), #91 aviso al organizador de nuevas postulaciones (inmediato o resumen diario/semanal/al cierre, según notify_applications_enabled), #92 aviso de retiro de postulación (a la entidad siempre, al convocante si notify_withdrawals_enabled está activo) y #93 invitación al organizador designado que aún no tiene cuenta. En ENTIDADES (migración 191, ciclo de vida de borradores 180 días): #94 recordatorio de formalizar (hitos 30/60/90/120/150 días), #95 aviso de cierre (hitos 15 y 3 días antes del corte) y #96 aviso de que el borrador pasó a la papelera. Los 3 correos de borradores los dispara el cron purge-draft-entities, idempotente vía la columna draft_reminder_stage.
Actualización 2026-08-01 (punto 5, modal «Ideas y mejoras»): se agrega el correo administrativo #89 (sendIdeaNotificationEmail): cuando un usuario envía una propuesta desde el modal, llega a soporte@lpdi.co (ahora configurable vía IDEAS_NOTIFY_EMAIL) con hasta 3 imágenes adjuntas. Además la propuesta se persiste en idea_submissions y se consulta en Administración → Sistema → Propuestas de mejora (solo Superadmin).
Actualización 2026-07-30 (tarea 35 «Referir a LPDI»): se agregaron 3 correos nuevos #86 (al prospecto: lo recomendaron y se le invita al ecosistema), #87 (acuse al referente) y #88 (aviso a partners@lpdi.co con los datos del prospecto y del referente). Se disparan al guardar un referido en el modal «Referir a LPDI» (sendLpdiReferralEmails), best-effort: un fallo de envío no revierte el referido ya registrado.
Ampliación 2026-07-20 (pedido de Frank): al cambiar de CEO ahora se elige el destino del CEO saliente: continúa como miembro (opción por defecto, comportamiento anterior) o se retira del equipo por completo, igual que cuando se retira a cualquier miembro. Los correos #67 y #68 tienen ahora dos variantes de texto: decirle a alguien que «continúa como miembro y su vínculo no cambia» sería falso cuando salió del equipo. La evidencia de sus autorizaciones de visibilidad queda en la bitácora antes de retirar la fila (Ley 1581).
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.
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).
USUARIO (15) STARTUP (13) ICG (3) ENTIDADES (11) ADMINISTRATIVOS (1) PERKS (17) EVENTOS (10) SCOUTING (4) 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. El párrafo del CEO anterior cambia según su destino (continúa como miembro / fue retirado del equipo). 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ó” (destino miembro) · “Tu vínculo con {empresa} finalizó” (destino retirado)sin CTADos variantes según el destino del CEO saliente. (a) Miembro: deja el cargo y continúa en el equipo; su vínculo verificado y sus autorizaciones de visibilidad NO cambian. (b) Retirado: su vínculo con la compañía terminó; su perfil sale del equipo y sus autorizaciones dentro de ese equipo dejan de aplicar, con constancia en la bitácora. 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 (11)
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
94NUEVOENTIDAD/USER/EXIST/NO-ED/Recordatorio de Borrador/NO-TYC/LPDI“Formaliza tu registro en el Ecosistema LPDI”perfil de la entidadRecordatorio escalonado (30/60/90/120/150 días) al dueño de un borrador sin formalizar. Cron purge-draft-entities. Nuevo (2026-08-22).ActivoNO
95NUEVOENTIDAD/USER/EXIST/NO-ED/Aviso de Cierre de Borrador/NO-TYC/LPDI“Aviso de cierre: formaliza tu registro en {N} días”perfil de la entidadAviso de cierre (15 y 3 días antes de los 180) al dueño de un borrador. Cron purge-draft-entities. Nuevo (2026-08-22).ActivoNO
96NUEVOENTIDAD/USER/EXIST/NO-ED/Borrador a Papelera/NO-TYC/LPDI“Tu borrador pasó a la papelera del Ecosistema LPDI”/dashboard (papelera)Aviso al dueño del borrador cuando cumple 180 días sin formalizar y pasa a papelera (30 días para restaurar). Cron purge-draft-entities. Nuevo (2026-08-22).ActivoNO
97NUEVOADMIN/EXIST/NO-ED/Respuesta a Propuesta/NO-TYC/LPDI“Respuesta a tu propuesta”/dashboard/admin/propuestasRespuesta del equipo LPDI al autor de una propuesta, escrita desde el panel de Propuestas de mejora. Botón al ecosistema. Nuevo (2026-09-03).ActivoNO
ADMINISTRATIVOS — Reportes automáticos internos (3)
31CRON/ADMIN/EXIST/NO-ED/Reporte Diario/NO-TYC/LPDI“Reporte diario Ecosistema LPDI — {fecha}”CSV adjuntoCron 6:00 AM Lima — altas + bajas del día diferenciadas: 1) órdenes de baja (gestionables, en papelera con ventana de 30 días) y 2) anonimizados en firme (definitivos). CSV de usuarios y de bajas. Actualizado 2026-08-04.ActivoNO
89ADMIN/EXIST/NO-ED/Ideas y Mejoras/NO-TYC/LPDI“[categoría] {título de la propuesta}”soporte@lpdi.coUsuario envía una propuesta desde el modal «Ideas y mejoras»; adjunta hasta 3 imágenes. Destino configurable vía IDEAS_NOTIFY_EMAIL. Persiste en idea_submissions (panel Admin → Sistema → Propuestas de mejora). Nuevo (2026-08-01).ActivoNO
BENEFICIOS (PERKS) · notification-emails.ts (15)
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
69FP/LPDI/Solicitud de Alianza/NO-TYC/LPDI“Nueva solicitud de alianza — [nombre]”partners@lpdi.coAl equipo LPDI: solicitud «Quiero ser aliado» con los datos del usuario y de la entidad en dos secciones. Funcionando. Nuevo (2026-07-23).ActivoNO
70FP/USUARIO/Solicitud de Alianza/NO-TYC/USUARIO“Recibimos tu solicitud de alianza”/agenda30minAl usuario solicitante: acuse de recibo distinto del interno, con CTA para agendar una reunión. Funcionando. Nuevo (2026-07-23).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
86FP/PROSPECTO/Referido a LPDI/NO-TYC/PROSPECTO“Una recomendación para conectar con La Punta del Iceberg”/registro-usuarioAl prospecto: referido comercial (no invitación). Un miembro lo recomendó con LPDI para construir sinergias; LPDI lo contactará en los próximos días. CTA para crear cuenta. Funcionando. Nuevo (2026-07-30).ActivoNO
87FP/REFERENTE/Acuse Referido/NO-TYC/USUARIO“Recibimos tu recomendación — Ecosistema LPDI”/dashboard/beneficios/referidosAl referente: acuse de que su recomendación a LPDI quedó registrada. Funcionando. Nuevo (2026-07-30).ActivoNO
88FP/LPDI/Nuevo Prospecto Referido/NO-TYC/LPDI“Nuevo prospecto referido a La Punta del Iceberg”partners@lpdi.coAl equipo LPDI: ficha del prospecto (nombre, correo, teléfono, empresa, estado; si ya existe: cargo, LinkedIn, web) y del referente (nombre, correo, teléfono, empresa, cargo, LinkedIn). Responder-a al referente. Funcionando. Nuevo (2026-07-30).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
80NUEVOFE/ORGANIZADOR/Invitación al Ecosistema/NO-TYC/LPDI“Te invitaron a registrarte — Ecosistema LPDI”/registro-usuarioA un coorganizador de un evento SIN entidad registrada: crear cuenta y registrar su entidad para figurar en el directorio.ActivoNO
81NUEVOFE/ORGANIZADOR/Recordatorio Invitación/NO-TYC/LPDI“Recordatorio: te invitaron a registrarte — Ecosistema LPDI”/registro-usuarioRecordatorio (cron ~3 días) de la invitación al organizador no registrado.ActivoNO
82NUEVOFE/SPEAKER/Invitación al Ecosistema/NO-TYC/LPDI“Te invitaron como speaker — Ecosistema LPDI”/registro-usuarioA un speaker no registrado de un evento: crear cuenta para confirmar su participación y aparecer con el distintivo.ActivoNO
83NUEVOFE/HOST/Invitación al Ecosistema/NO-TYC/LPDI“Te invitaron como host — Ecosistema LPDI”/registro-usuarioA un host no registrado de un evento: crear cuenta para confirmar su participación y aparecer con el distintivo.ActivoNO
84NUEVOFE/SPEAKER/Recordatorio Invitación/NO-TYC/LPDI“Recordatorio: te invitaron como speaker — Ecosistema LPDI”/registro-usuarioRecordatorio (cron ~3 días) al speaker no registrado.ActivoNO
85NUEVOFE/HOST/Recordatorio Invitación/NO-TYC/LPDI“Recordatorio: te invitaron como host — Ecosistema LPDI”/registro-usuarioRecordatorio (cron ~3 días) al host no registrado.ActivoNO
SCOUTING · Convocatorias y postulaciones (migración 190) · notification-emails.ts (4)
90NUEVOSCOUT/APLICANTE/Confirmación Postulación/NO-TYC/LPDI“Recibimos tu postulación en {convocatoria}”/dashboard/convocatorias/mis-aplicacionesA la startup que se postula: confirma el registro de la postulación con fecha y hora con GMT, más el resumen de campos enviados. Siempre se envía. Nuevo (2026-08-22, copy sincronizado 2026-08-24).ActivoNO
91NUEVOSCOUT/ORGANIZADOR/Nueva Postulación o Resumen/NO-TYC/LPDI“Nueva postulación” / “Resumen de postulaciones”/dashboard/postulaciones (con acceso)Al organizador (correo de Notificaciones de la convocatoria): postulación inmediata o resumen diario/semanal/al cierre con las postulaciones numeradas de la más reciente a la más antigua. El botón es «Ver postulaciones» (al panel) si el destinatario tiene acceso, o «Ver convocatoria» (al formulario público /scouting/{slug}) si no. Solo si el aviso está activo. Actualizado 2026-09-03.ActivoNO
92NUEVOSCOUT/ENTIDAD-ORGANIZADOR/Retiro de Postulación/NO-TYC/LPDI“Se retiró la postulación de {startup}...”/dashboardAl retirar una postulación: siempre al admin/CEO de la entidad (botón «Aplicar de nuevo»); al convocante solo si tiene activo el aviso de retiros (botón «Mis campañas»). Nuevo (2026-08-22, copy sincronizado 2026-08-24).ActivoNO
93NUEVOSCOUT/ORGANIZADOR-NO-REGISTRADO/Invitación/NO-TYC/LPDI“Fuiste designado para recibir notificaciones de {convocatoria}”/auth/verificarAl correo designado en Notificaciones que aún no tiene cuenta: se le crea, se le dice quién lo designó y se le invita a activarla. Nuevo (2026-08-22, copy sincronizado 2026-08-24).ActivoNO
ASOCIACIÓN DE ENTIDADES (Tarea 67) · email-join-requests.ts (9)
71ASOC/SOLICITANTE/Solicitud Enviada“Tu solicitud fue enviada”/api/entidades/solicitudesAcuse al solicitante: su solicitud de asociación fue enviada a los administradores de la entidad; vigencia 10 días.ActivoNO
72ASOC/APROBADOR/Nueva Solicitud“Nueva solicitud de asociación”/api/entidades/solicitudesA quienes administran la entidad: alguien pidió asociarse; enlace a revisar en el panel (PS/PI) para aceptar con cargo y permisos.ActivoNO
73ASOC/APROBADOR/Recordatorio“Recordatorio: solicitud pendiente”/api/entidades/solicitudesRecordatorio al aprobador: la solicitud sigue pendiente y vence pronto.ActivoNO
74ASOC/SOLICITANTE/Aprobada“Ya haces parte de [entidad]”/api/entidades/solicitudesAl solicitante: su solicitud fue aprobada (con su cargo) y ya quedó asociado a la entidad.ActivoNO
75ASOC/APROBADOR/Aprobada“Solicitud aprobada”/api/entidades/solicitudesConstancia al aprobador de que aprobó la solicitud y el miembro quedó registrado.ActivoNO
76ASOC/SOLICITANTE/Rechazada“Sobre tu solicitud de asociación”/api/entidades/solicitudesAl solicitante: su solicitud no fue aprobada (sin exponer quién rechazó).ActivoNO
77ASOC/APROBADOR/Rechazada“Solicitud rechazada”/api/entidades/solicitudesConstancia al aprobador del rechazo; sin cambios en la entidad.ActivoNO
78ASOC/SOLICITANTE/Expirada“Tu solicitud venció sin respuesta”/api/entidades/solicitudesAl solicitante: la solicitud venció a los 10 días sin respuesta; puede reintentar o crear su entidad.ActivoNO
79ASOC/APROBADOR/Expirada“Solicitud vencida”/api/entidades/solicitudesConstancia informativa al aprobador de que la solicitud venció sin respuesta.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 qué pasó con el CEO anterior según el destino elegido (continúa como miembro con su vínculo intacto, o su vínculo con el equipo se retiró y su perfil sale de la compañía), y que el nuevo CEO pasa a gestionar el perfil de la compañía. En la variante retirada la fila del cuadro dice «CEO anterior (retirado)». 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, variante el saliente continua como miembro

VARIANTE «EL CEO SALIENTE SE RETIRA DEL EQUIPO»

Preview correo 67 cambio de CEO variante el saliente fue retirado del equipo
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ó” si el saliente continúa como miembro; “Tu vínculo con {empresa} finalizó” si se retira del equipo. El asunto cambia porque el hecho notificado es otro.
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ónDos variantes según el destino que se eligió para el CEO saliente al designar al nuevo (ampliación del 2026-07-20).
(a) Continúa como miembro (opción por defecto): le 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.
(b) Se retira del equipo: le informa que su vínculo con la compañía terminó, que su perfil ya no aparece en el equipo y que pierde el acceso a la información de la compañía; que las autorizaciones de visibilidad que había dado dentro de ese equipo dejan de aplicar y queda constancia de ellas en el registro de la operación; y que su cuenta personal LPDI sigue activa con sus datos intactos. Nunca afirma que continúa como miembro: eso sería falso.
Ambas cierran 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: en el destino miembro las columnas de consentimiento de visibilidad no se tocan y el correo lo declara al destinatario. En el destino retirado no se ponen en NULL: desaparece la fila entera del equipo, y su evidencia (fechas de consentimiento y de revocación) queda volcada a la bitácora append-only team_member_unlinked ANTES del borrado, que es la misma vía de cualquier miembro retirado.

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

Preview correo 68 cambio de CEO aviso al CEO anterior, variante continua como miembro

VARIANTE «TE RETIRAS DEL EQUIPO»

Preview correo 68 cambio de CEO variante el CEO anterior se retira del equipo

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 (11)

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
Correos #94 a #96 (ciclo de vida de borradores, plan 2026-08-22): aplican por igual a Startup e ICG sin formalizar (formalized_at IS NULL). El cron diario purge-draft-entities resuelve el correo del dueño del borrador vía la cuenta que lo registró (registered_by_id), con respaldo en el correo de contacto de la entidad. Idempotencia por la columna draft_reminder_stage (solo avanza, nunca retrocede) y por el filtro deleted_at IS NULL.
94NUEVOFormaliza tu registro (recordatorio de borrador)Activo↑ índice
Nombre técnicoENTIDAD/USER/EXIST/NO-ED/Recordatorio de Borrador/NO-TYC/LPDI
Función en códigodraftReminderSpec() / sendDraftReminderEmail() con isClosing=false (notification-emails.ts)
Asunto“Formaliza tu registro en el Ecosistema LPDI”
TriggerCron diario POST /api/cron/purge-draft-entities: recordatorio escalonado a los 30, 60, 90, 120 y 150 días desde created_at de un borrador (formalized_at IS NULL, deleted_at IS NULL). No repite un mismo hito.
DestinatarioEl dueño del borrador (Startup o ICG sin formalizar): correo de la cuenta que lo registró, o el correo de contacto de la entidad como respaldo.
CTABotón: “Formalizar mi registro” → perfil de la entidad
DescripciónInvita a formalizar el registro (visibilidad ante el ecosistema, beneficios y conexiones) e indica los días restantes antes de que el borrador pase a la papelera (corte a los 180 días).
TyC / TratamientoNO.

PREVIEW DEL CORREO

Preview correo 94 recordatorio de borrador
95NUEVOAviso de cierre de borradorActivo↑ índice
Nombre técnicoENTIDAD/USER/EXIST/NO-ED/Aviso de Cierre de Borrador/NO-TYC/LPDI
Función en códigodraftReminderSpec() / sendDraftReminderEmail() con isClosing=true (notification-emails.ts) — misma función que #94, con copy de cierre
Asunto“Aviso de cierre: formaliza tu registro en {N} días”
TriggerCron diario purge-draft-entities: hitos a los 165 y 177 días desde created_at (15 y 3 días antes del corte de 180). No repite un mismo aviso.
DestinatarioEl dueño del borrador (Startup o ICG sin formalizar)
CTABotón: “Formalizar mi registro” → perfil de la entidad
DescripciónMismo correo que #94 con tono más urgente: indica cuántos días quedan antes de que el borrador pase a la papelera.
TyC / TratamientoNO.

PREVIEW DEL CORREO

Preview correo 95 aviso de cierre de borrador
96NUEVOTu borrador pasó a la papeleraActivo↑ índice
Nombre técnicoENTIDAD/USER/EXIST/NO-ED/Borrador a Papelera/NO-TYC/LPDI
Función en códigodraftTrashedSpec() / sendDraftTrashedEmail() (notification-emails.ts)
Asunto“Tu borrador pasó a la papelera del Ecosistema LPDI”
TriggerCron diario purge-draft-entities, cuando el borrador cumple 180 días sin formalizar: se mueve a papelera (soft-delete, delete_scheduled_for = +30 días) y este correo se envía en la misma corrida.
DestinatarioEl dueño del borrador (Startup o ICG sin formalizar)
CTABotón: “Restaurar mi registro” → dashboard (sección papelera)
DescripciónAvisa que el borrador pasó a la papelera y que tiene 30 días para restaurarlo antes de la eliminación definitiva.
TyC / TratamientoNO.

PREVIEW DEL CORREO

Preview correo 96 borrador a papelera

ADMINISTRATIVOS — Reportes automáticos internos (3)

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).
89Propuesta desde «Ideas y mejoras»Activo↑ índice
Nombre técnicoADMIN/EXIST/NO-ED/Ideas y Mejoras/NO-TYC/LPDI
Función en códigosendIdeaNotificationEmail (email.ts)
EndpointPOST /api/ideas (rate-limit 3/15 min por IP)
Asunto“[categoría] {título de la propuesta}”
TriggerUn usuario envía una propuesta desde el modal «Ideas y mejoras» (footer / dashboard / ecosistema / /ideas).
Destinatariosoporte@lpdi.co (configurable vía IDEAS_NOTIFY_EMAIL; si no está seteada, usa el fallback soporte@lpdi.co)
Remitente“Ecosistema LPDI” <no-reply@lpdi.co> vía Resend SMTP. Responder-a al correo del usuario que envió la propuesta.
ContenidoCategoría, título, descripción, nombre y correo del remitente, y número de imágenes adjuntas.
Imágenes — hasta 3 imágenes opcionales (png/jpg/webp, ≤2 MB c/u) que el usuario adjunta; viajan anexas al correo.
PersistenciaDesde 2026-08-01 cada propuesta se guarda en idea_submissions (+ idea_attachments) y se consulta en Administración → Sistema → Propuestas de mejora (solo Superadmin). Un fallo del correo ya no pierde la propuesta (email_sent=false la marca).
PreviewPreview del correo Ideas y mejoras
CTASin botón — correo informativo interno.
TyC / TratamientoNO — Correo administrativo interno. No requiere consentimiento del destinatario.
97NUEVORespuesta a tu propuestaActivo↑ índice
Nombre técnicoADMIN/EXIST/NO-ED/Respuesta a Propuesta/NO-TYC/LPDI
Función en códigosendIdeaReplyEmail() (notification-emails.ts)
Asunto“Respuesta a tu propuesta”
TriggerUn super_admin escribe una respuesta desde Administración → Sistema → Propuestas de mejora y presiona «Enviar respuesta por correo».
DestinatarioEl autor de la propuesta, al correo con el que la envió.
CTABotón: “Ir al ecosistema” → eco.lpdi.co
ContenidoSaludo, el título de la propuesta en negrita y el mensaje que el equipo escribió (respeta los saltos de párrafo).
TyC / TratamientoNO.

PREVIEW DEL CORREO

Preview correo 97 respuesta a propuesta
LPDI
Ecosistema LPDI · eco.lpdi.co
Versión 23 — Correos globales en es-CO/Bogotá (corrige «setiembre») y #91 con período por día(s) calendario en la zona de la campaña — 2026-09-13
87 correos + 4 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) (19)

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
69Solicitud de alianza — equipo LPDI (FP)Activo↑ índice
Nombre técnicoFP/LPDI/Solicitud de Alianza/NO-TYC/LPDI
Función en códigosendAllianceRequestEmail() · email.ts
Asunto“Nueva solicitud de alianza — [nombre]”
TriggerPOST /api/alianzas desde el pop-up “Quiero ser aliado”.
Destinatariopartners@lpdi.co (reply-to al usuario)
CTAResponder directamente al correo para contactar al solicitante.
DescripciónVersión interna. Dos secciones: “Datos del usuario solicitante” (nombres y apellidos, correo, teléfono, LinkedIn) y “Datos de la entidad” (nombre, rol, correo corporativo, página web, LinkedIn), más el mensaje. Campos vacíos no se muestran.
EstadoFuncionando. Nuevo (Frank 2026-07-23).

PREVIEW DEL CORREO

Preview
70Solicitud de alianza — acuse al usuario (FP)Activo↑ índice
Nombre técnicoFP/USUARIO/Solicitud de Alianza/NO-TYC/USUARIO
Función en códigosendAllianceRequestUserEmail() · email.ts
Asunto“Recibimos tu solicitud de alianza — Ecosistema LPDI”
TriggerMismo POST /api/alianzas (best-effort; su fallo no bloquea la solicitud).
DestinatarioCorreo del usuario solicitante
CTABotón: “Agendar una reunión” → lpdi.co/agenda30min
DescripciónAcuse de recibo al usuario, distinto del interno: confirma la recepción e invita a agendar una reunión.
EstadoFuncionando. Nuevo (Frank 2026-07-23).

PREVIEW DEL CORREO

Preview
86Referido comercial a LPDI (al prospecto)Activo↑ índice
Nombre técnicoFP/PROSPECTO/Referido a LPDI/NO-TYC/PROSPECTO
Función en códigosendLpdiReferralEmails (correo 1/3)
Asunto“Una recomendación para conectar con La Punta del Iceberg”
TriggerUn miembro guarda un referido en el modal “Referir a LPDI” (POST /api/perks/referir-lpdicreateReferral).
DestinatarioCorreo del prospecto referido
CTABotón: “Unirme al ecosistema” (/registro-usuario) o “Ir al ecosistema” (eco.lpdi.co) si el prospecto ya tiene cuenta
DescripciónReferido comercial (no invitación): un miembro lo recomendó con LPDI para construir sinergias; LPDI lo contactará en los próximos días. El texto de cierre invita a crear cuenta mientras conectan. Best-effort. Nuevo (tarea 35, 2026-07-30).
TyC / TratamientoNO
EstadoFuncionando.

PREVIEW DEL CORREO

Preview
87Acuse de recomendación (al referente)Activo↑ índice
Nombre técnicoFP/REFERENTE/Acuse Referido/NO-TYC/USUARIO
Función en códigosendLpdiReferralEmails (correo 2/3)
Asunto“Recibimos tu recomendación — Ecosistema LPDI”
TriggerMismo trigger que #86: al guardar el referido en createReferral.
DestinatarioCorreo del referente (el miembro que refirió)
CTABotón: “Ver mis referidos” → /dashboard/beneficios/referidos
DescripciónConfirma al referente que su recomendación quedó registrada y que el equipo LPDI contactará al prospecto. Lo remite a su lista “Referidos a LPDI”. Best-effort. Nuevo (tarea 35, 2026-07-30).
TyC / TratamientoNO
EstadoFuncionando.

PREVIEW DEL CORREO

Preview
88Nuevo prospecto referido a LPDI (al equipo)Activo↑ índice
Nombre técnicoFP/LPDI/Nuevo Prospecto Referido/NO-TYC/LPDI
Función en códigosendLpdiReferralEmails (correo 3/3)
Asunto“Nuevo prospecto referido a La Punta del Iceberg”
TriggerMismo trigger que #86: al guardar el referido en createReferral.
Destinatariopartners@lpdi.co · responder-a: el referente
CTABotón: “Ir al panel” → /dashboard/beneficios/referidos
DescripciónAvisa al equipo LPDI de un nuevo prospecto comercial, con dos bloques (Prospecto: nombre, correo, teléfono, empresa, estado; si ya existe: cargo, LinkedIn, web de la empresa. Referente: nombre, correo, teléfono, empresa, cargo, LinkedIn). Best-effort. Nuevo (tarea 35, 2026-07-30).
TyC / TratamientoNO
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
80NUEVOInvitación al organizador no registradoActivo↑ índice
Función en códigoorganizerInviteSpec / sendOrganizerInvitation (notification-emails.ts)
Asunto“Te invitaron a registrarte — Ecosistema LPDI”
TriggerAl registrar un evento con un coorganizador que NO corresponde a una entidad registrada. Best-effort e individual (nunca en copia).
DestinatarioCorreo del organizador no registrado.
CTABotón (azul): “Crear mi cuenta” → /registro-usuario?email=
DescripciónLa entidad figura como coorganizadora del evento pero aún no tiene perfil; al registrarla acceden a la info del evento, conectan con el ecosistema y la entidad aparece con el distintivo «Organizador de eventos». Incluye los pasos (crear cuenta → registrar como Startup o ICG). Badge con el código del evento.
TyC / TratamientoNO.

PREVIEW DEL CORREO (generado 2026-07-28 desde organizerInviteSpec)

Preview correo 80 invitación al organizador no registrado
81NUEVORecordatorio de invitación al organizadorActivo↑ índice
Función en códigoorganizerInviteSpec (reminder) / sendOrganizerInvitation (notification-emails.ts)
Asunto“Recordatorio: te invitaron a registrarte — Ecosistema LPDI”
TriggerRecordatorio automático (cron ~3 días) si el organizador sigue sin registrarse.
DestinatarioCorreo del organizador no registrado.
CTABotón (azul): “Crear mi cuenta” → /registro-usuario?email=
DescripciónIgual que el #80 con encabezado de recordatorio («Te recordamos con cariño…»).
TyC / TratamientoNO.

PREVIEW DEL CORREO (generado 2026-07-28 desde organizerInviteSpec)

Preview correo 81 recordatorio de invitación al organizador
82NUEVOInvitación a speaker no registradoActivo↑ índice
Función en códigospeakerHostInviteSpec / sendSpeakerHostInvitation (notification-emails.ts)
Asunto“Te invitaron como speaker — Ecosistema LPDI”
TriggerAl registrar un evento con un speaker cuyo correo no está en el sistema.
DestinatarioCorreo del speaker no registrado.
CTABotón (azul): “Soy speaker” → /registro-usuario?email=
DescripciónLe informa que fue registrado como speaker del evento y lo invita a crear su cuenta para confirmar su participación y aparecer con el distintivo de participación confirmada. Badge con el código del evento.
TyC / TratamientoNO.

PREVIEW DEL CORREO (generado 2026-07-28 desde speakerHostInviteSpec)

Preview correo 82 invitación a speaker no registrado
83NUEVOInvitación a host no registradoActivo↑ índice
Función en códigospeakerHostInviteSpec / sendSpeakerHostInvitation (notification-emails.ts)
Asunto“Te invitaron como host — Ecosistema LPDI”
TriggerAl registrar un evento con un host cuyo correo no está en el sistema.
DestinatarioCorreo del host no registrado.
CTABotón (azul): “Soy host” → /registro-usuario?email=
DescripciónLe informa que fue registrado como host del evento y lo invita a crear su cuenta para confirmar su participación y aparecer con el distintivo de participación confirmada. Badge con el código del evento.
TyC / TratamientoNO.

PREVIEW DEL CORREO (generado 2026-07-28 desde speakerHostInviteSpec)

Preview correo 83 invitación a host no registrado
84NUEVORecordatorio de invitación a speakerActivo↑ índice
Función en códigospeakerHostInviteSpec (reminder) / sendSpeakerHostInvitation (notification-emails.ts)
Asunto“Recordatorio: te invitaron como speaker — Ecosistema LPDI”
TriggerCron /api/cron/speaker-host-invite-reminders a los 3 días si el speaker sigue sin registrarse (reminder_count = 0). Un solo recordatorio.
DestinatarioCorreo del speaker no registrado.
CTABotón (azul): “Soy speaker” → /registro-usuario?email=
DescripciónRecordatorio de la invitación: le recuerda que fue registrado como speaker del evento y aún no tiene cuenta, y lo invita a crearla para confirmar su participación. Badge con el código del evento.
TyC / TratamientoNO.

PREVIEW DEL CORREO (generado 2026-07-28 desde speakerHostInviteSpec)

Preview correo 84 recordatorio speaker
85NUEVORecordatorio de invitación a hostActivo↑ índice
Función en códigospeakerHostInviteSpec (reminder) / sendSpeakerHostInvitation (notification-emails.ts)
Asunto“Recordatorio: te invitaron como host — Ecosistema LPDI”
TriggerCron /api/cron/speaker-host-invite-reminders a los 3 días si el host sigue sin registrarse (reminder_count = 0). Un solo recordatorio.
DestinatarioCorreo del host no registrado.
CTABotón (azul): “Soy host” → /registro-usuario?email=
DescripciónRecordatorio de la invitación: le recuerda que fue registrado como host del evento y aún no tiene cuenta, y lo invita a crearla para confirmar su participación. Badge con el código del evento.
TyC / TratamientoNO.

PREVIEW DEL CORREO (generado 2026-07-28 desde speakerHostInviteSpec)

Preview correo 85 recordatorio host

SCOUTING — Convocatorias y postulaciones (migración 190) (4)

Correos #90 a #93 (Scouting: convocatorias de postulación de startups, migración 190, Frank 2026-08-22; copy de las 4 tarjetas sincronizado con producción el 2026-08-24). Fuente: src/lib/server/notification-emails.ts + endpoint POST/DELETE /api/scouting/[slug]/aplicar + cron POST /api/cron/scouting-notify-digest. Todos best-effort (try/catch, no lanzan). El aviso al organizador (#91) es idempotente vía organizer_notified_at en startup_campaign_applications: cada corrida del cron solo toma y marca las filas aún NULL, así que correrlo dos veces no reenvía.
90NUEVORecibimos tu postulaciónActivo↑ índice
Nombre técnicoSCOUT/APLICANTE/Confirmación Postulación/NO-TYC/LPDI
Función en códigoscoutingApplicantEmailSpec() / sendScoutingApplicantEmail() (notification-emails.ts)
EndpointPOST /api/scouting/[slug]/aplicar
Asunto“Recibimos tu postulación en {nombre de la convocatoria}”
TriggerAl enviar una postulación a una convocatoria de scouting (alta en startup_campaign_applications). Siempre se envía, sin importar la configuración de notificaciones del organizador.
DestinatarioLa Startup/persona que se postula (su correo de usuario)
CTABotón: “Mis aplicaciones” → /dashboard/convocatorias/mis-aplicaciones
DescripciónConfirma que la postulación quedó registrada, con la fecha y hora completas del envío (incluyen el huso horario, ej. «24 de agosto de 2026 a las 9:47 a. m. (GMT-5)»), e incluye el resumen de los campos enviados (nombre de la compañía, país, industria, etc., mismo contenido que ve en «Ver aplicación»).
TyC / TratamientoNO.

PREVIEW DEL CORREO

Preview correo 90 recibimos tu postulación
91NUEVONueva postulación / Resumen de postulacionesActivo↑ índice
Nombre técnicoSCOUT/ORGANIZADOR/Nueva Postulación o Resumen/NO-TYC/LPDI
Función en códigoscoutingOrganizerEmailSpec() / sendScoutingOrganizerEmail() (notification-emails.ts)
Endpoint / CronModo immediate: POST /api/scouting/[slug]/aplicar. Modos daily/weekly/on_close: cron POST /api/cron/scouting-notify-digest.
Asunto“Nueva postulación en {convocatoria}” (una sola) o “Resumen de postulaciones en {convocatoria}” (varias)
TriggerNueva postulación, solo si «Notificarme las nuevas postulaciones» está activo en la convocatoria (notify_applications_enabled). En modo «una a una» (immediate) llega de inmediato al postularse; en resumen diario/semanal/al cierre lo agrupa el cron (semanal solo domingos; al cierre solo campañas no permanentes ya cerradas).
DestinatarioEl correo del organizador configurado en la sección Notificaciones de la convocatoria
CTADepende del acceso del destinatario al panel (actualizado 2026-09-03): si el correo de Notificaciones de la convocatoria tiene acceso al panel de postulaciones, botón “Ver postulaciones” → /dashboard/postulaciones/{slug}; si no tiene acceso, botón “Ver convocatoria” → /scouting/{slug} (formulario público de la convocatoria), y sin el párrafo de ingreso al panel, para no llevarlo a una ruta sin permiso (Frank, 2026-09-03).
Descripción — modo inmediatoUna sola postulación: «Hay una nueva postulación en la convocatoria {convocatoria}: {startup} ({correo}), {fecha completa con hora y GMT, ej. 20 de agosto de 2026 a las 10:30 a. m. (GMT-5)}.»
Descripción — modo resumenVarias postulaciones agrupadas por el cron (diario/semanal/al cierre): arranca con «Has recibido {X} nuevas postulaciones en el período {período} de la convocatoria {convocatoria}.», sigue, solo si el destinatario tiene acceso al panel, con el párrafo «Ingresa al panel para revisar las postulaciones.» y luego lista cada postulación numerada (1, 2, 3…), ordenada de la más reciente a la más antigua, con startup, correo y fecha (con GMT).
Período — actualizado 2026-09-13Ya NO es «de la primera a la última postulación». Ahora informa el/los día(s) calendario completos en la zona horaria de la campaña: un solo día → «8 de septiembre de 2026 desde las 00:00 hasta las 23:59 (GMT-5)»; varios días → «desde el 8 de septiembre de 2026 a las 00:00 hasta el 10 de septiembre de 2026 a las 23:59 (GMT-5)». El listado numerado que sigue conserva la hora exacta de cada postulación (sin cambios).
TyC / TratamientoNO.

PREVIEW — Con acceso al panel (botón «Ver postulaciones»)

Preview correo 91 con acceso al panel

PREVIEW — Sin acceso al panel (botón «Ver convocatoria»)

Preview correo 91 sin acceso al panel, con botón Ver convocatoria
92NUEVOAviso de retiro de postulaciónActivo↑ índice
Nombre técnicoSCOUT/ENTIDAD-ORGANIZADOR/Retiro de Postulación/NO-TYC/LPDI
Función en códigoscoutingWithdrawalEmailSpec() / sendScoutingWithdrawalEmail() (notification-emails.ts)
EndpointDELETE /api/scouting/[slug]/aplicar
Asunto“Se retiró la postulación de {startup} de {convocatoria}” (a la entidad) o “{startup} retiró su postulación en {convocatoria}” (al convocante)
TriggerAl retirar una postulación. Inmediato, sin frecuencia configurable.
DestinatarioAdmin/CEO de la entidad que se retira (siempre) y el convocante (correo de Notificaciones), solo si «Notificarme los retiros» está activo (notify_withdrawals_enabled) — casilla independiente de la de nuevas postulaciones.
CTADiseño A (a la startup): botón “Aplicar de nuevo” → /dashboard. Diseño B (al convocante): botón “Mis campañas” → /dashboard.
Descripción — diseño A (a la startup)«{correo de quien dio la orden} dio la orden de retirar la postulación de {startup} de la convocatoria {convocatoria} el {fecha, hora y GMT}.» Sigue: «Si crees que ha sido un error, ingresa al dashboard y vuelve a aplicar.»
Descripción — diseño B (al convocante)«{startup} retiró su postulación a la convocatoria {convocatoria} el {fecha, hora y GMT}.» Sigue: «Si deseas comunicarte con ellos para conocer las razones del retiro, puedes escribirles a {correo de contacto}.»
TyC / TratamientoNO.

PREVIEW — Diseño A (a la startup)

Preview correo 92 aviso de retiro a la startup

PREVIEW — Diseño B (al convocante)

Preview correo 92 aviso de retiro al convocante
93NUEVOInvitación al organizador designadoActivo↑ índice
Nombre técnicoSCOUT/ORGANIZADOR-NO-REGISTRADO/Invitación/NO-TYC/LPDI
Función en códigosendScoutingNotifyInviteEmail() (notification-emails.ts), invocada desde el editor de convocatorias (dashboard/admin/scouting/[id]/+page.server.ts)
Asunto“Fuiste designado para recibir notificaciones de {convocatoria}”
TriggerAl guardar en el editor una convocatoria con un correo de notificaciones que aún no tiene cuenta en el ecosistema. El sistema le crea la cuenta (usuario + perfil) y genera el enlace de verificación para esta invitación.
DestinatarioEl correo designado en Notificaciones cuando NO tiene cuenta en el ecosistema
CTABotón: “Crear mi cuenta” → enlace de verificación (/auth/verificar)
DescripciónAhora identifica a quien lo designó: «Fuiste designado por {correo de quien creó/editó el formulario de la convocatoria} para recibir las notificaciones de la convocatoria {convocatoria} en el Ecosistema LPDI. Crea tu cuenta dando clic en el botón a continuación para empezar a recibir las notificaciones.»
TyC / TratamientoNO.

PREVIEW DEL CORREO

Preview correo 93 invitación al organizador designado, con quién lo designó

ASOCIACIÓN DE ENTIDADES (Tarea 67) — Solicitud «Quiero asociarme» (9)

71Tu solicitud fue enviadaActivo↑ índice
Nombre técnicoASOC/SOLICITANTE/Solicitud Enviada
Función en códigobuildJoinRequestCreatedRequesterHtml() · email-join-requests.ts
Asunto“Tu solicitud fue enviada”
Triggeral crear una solicitud «Es mi empresa, solicitar asociación».
DestinatarioSolicitante
DescripciónAcuse al solicitante: su solicitud de asociación fue enviada a los administradores de la entidad; vigencia 10 días.
EstadoFuncionando. Nuevo (Frank, tarea 67, 2026-07-23).

PREVIEW DEL CORREO

Preview
72Nueva solicitud de asociaciónActivo↑ índice
Nombre técnicoASOC/APROBADOR/Nueva Solicitud
Función en códigobuildJoinRequestCreatedApproverHtml() · email-join-requests.ts
Asunto“Nueva solicitud de asociación”
Triggeral crear la solicitud.
DestinatarioAdmin/CEO/editor de la entidad
DescripciónA quienes administran la entidad: alguien pidió asociarse; enlace a revisar en el panel (PS/PI) para aceptar con cargo y permisos.
EstadoFuncionando. Nuevo (Frank, tarea 67, 2026-07-23).

PREVIEW DEL CORREO

Preview
73Recordatorio: solicitud pendienteActivo↑ índice
Nombre técnicoASOC/APROBADOR/Recordatorio
Función en códigobuildJoinRequestReminderApproverHtml() · email-join-requests.ts
Asunto“Recordatorio: solicitud pendiente”
Triggercron diario, día 5 sin respuesta.
DestinatarioAprobador
DescripciónRecordatorio al aprobador: la solicitud sigue pendiente y vence pronto.
EstadoFuncionando. Nuevo (Frank, tarea 67, 2026-07-23).

PREVIEW DEL CORREO

Preview
74Ya haces parte de [entidad]Activo↑ índice
Nombre técnicoASOC/SOLICITANTE/Aprobada
Función en códigobuildJoinRequestApprovedRequesterHtml() · email-join-requests.ts
Asunto“Ya haces parte de [entidad]”
Triggeral aprobar la solicitud.
DestinatarioSolicitante
DescripciónAl solicitante: su solicitud fue aprobada (con su cargo) y ya quedó asociado a la entidad.
EstadoFuncionando. Nuevo (Frank, tarea 67, 2026-07-23).

PREVIEW DEL CORREO

Preview
75Solicitud aprobadaActivo↑ índice
Nombre técnicoASOC/APROBADOR/Aprobada
Función en códigobuildJoinRequestApprovedApproverHtml() · email-join-requests.ts
Asunto“Solicitud aprobada”
Triggeral aprobar.
DestinatarioAprobador
DescripciónConstancia al aprobador de que aprobó la solicitud y el miembro quedó registrado.
EstadoFuncionando. Nuevo (Frank, tarea 67, 2026-07-23).

PREVIEW DEL CORREO

Preview
76Sobre tu solicitud de asociaciónActivo↑ índice
Nombre técnicoASOC/SOLICITANTE/Rechazada
Función en códigobuildJoinRequestRejectedRequesterHtml() · email-join-requests.ts
Asunto“Sobre tu solicitud de asociación”
Triggeral rechazar.
DestinatarioSolicitante
DescripciónAl solicitante: su solicitud no fue aprobada (sin exponer quién rechazó).
EstadoFuncionando. Nuevo (Frank, tarea 67, 2026-07-23).

PREVIEW DEL CORREO

Preview
77Solicitud rechazadaActivo↑ índice
Nombre técnicoASOC/APROBADOR/Rechazada
Función en códigobuildJoinRequestRejectedApproverHtml() · email-join-requests.ts
Asunto“Solicitud rechazada”
Triggeral rechazar.
DestinatarioAprobador
DescripciónConstancia al aprobador del rechazo; sin cambios en la entidad.
EstadoFuncionando. Nuevo (Frank, tarea 67, 2026-07-23).

PREVIEW DEL CORREO

Preview
78Tu solicitud venció sin respuestaActivo↑ índice
Nombre técnicoASOC/SOLICITANTE/Expirada
Función en códigobuildJoinRequestExpiredRequesterHtml() · email-join-requests.ts
Asunto“Tu solicitud venció sin respuesta”
Triggercron diario, día 10.
DestinatarioSolicitante
DescripciónAl solicitante: la solicitud venció a los 10 días sin respuesta; puede reintentar o crear su entidad.
EstadoFuncionando. Nuevo (Frank, tarea 67, 2026-07-23).

PREVIEW DEL CORREO

Preview
79Solicitud vencidaActivo↑ índice
Nombre técnicoASOC/APROBADOR/Expirada
Función en códigobuildJoinRequestExpiredApproverHtml() · email-join-requests.ts
Asunto“Solicitud vencida”
Triggercron diario, día 10.
DestinatarioAprobador
DescripciónConstancia informativa al aprobador de que la solicitud venció sin respuesta.
EstadoFuncionando. Nuevo (Frank, tarea 67, 2026-07-23).

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)