Suscripciones
| Plan | Sesiones | Mensajes/mes | Templates | API Keys |
|---|---|---|---|---|
| Free | 1 | 100 | 3 | No |
| Pro | 10 | 10.000 | Sin límite | Sí |
Se siembran automáticamente al arrancar la app (SubscriptionService.seedDefaultPlans()).
Dónde se aplican los límites
Sección titulada «Dónde se aplican los límites»SessionLimitGuard— bloqueaPOST /sessionssi ya alcanzastemaxSessions.SubscriptionGuard— bloquea creación de schedules si no hay suscripción activa o se alcanzómaxMessagesPerMonth.checkTemplateLimit— bloquea la 4ª plantilla en Free.assertProPlan(enauth.controller) — bloquea crear/listar/revocar API Keys si el plan no es Pro.
Todos estos chequeos llaman primero a isAdmin(user) y retornan sin restricción si es admin — es el mismo patrón repetido a propósito en cada guard/check, en vez de un middleware global, para que quede explícito dónde se aplica cada límite.
Consulta desde el frontend
Sección titulada «Consulta desde el frontend»GET /auth/subscription devuelve el plan actual con uso (messagesUsed, messagesRemaining, sessionsActive, sessionsRemaining). El frontend usa esto para mostrar/ocultar features (por ejemplo, el gestor de API Keys), combinado con el role del usuario para el bypass de admin — ver Autenticación.
Contadores
Sección titulada «Contadores»messagesUsedThisMonth se resetea automáticamente al detectar un cambio de mes (comparando currentMonthStart contra el mes actual), no con un cron aparte.