El panel vive en /oculto-admin (ruta no obvia, SPA, noindex, fuera del sitemap). Solo entran usuarios con role: 'admin'. Fase 1 usa tu email como admin inicial (seed); después se agregan más desde el propio panel (módulo Admins).
KPIs: ingresos cobrados (suma de planes publicados), eventos por estado (borrador/publicado), conversión creado → pagado → publicado, links activos por vigencia, RSVPs últimos 7/30 días.
Tabla con filtro por estado, plan y pago. Detalle: dueño, links público + preview, conteo invitados/RSVPs, dominio. Acciones: publicar/despublicar, regenerar preview, desconectar dominio, eliminar.
Cruza sesiones de Stripe contra stripeSessionId en DB. Detecta "pagado pero en borrador" (webhook fallido). Acciones: marcar pagado manual, reenviar a Stripe para reintento, reembolsar (desde dashboard de Stripe + reflejo local).
Lista dominios conectados, pendientes manuales y fallos de alta en Dokploy. Acciones: re-verificar CNAME, reintentar alta, desconectar.
Mensajes del formulario /contacto con estado pendiente/resuelto y respuesta por email.
Altas y bajas de admins por email. El primer admin es tu correo (seed por env ADMIN_EMAIL). Nadie puede quitarse a sí mismo.
requireAdmin en API + middleware admin en rutas. 403 si no es admin.role: 'user' | 'admin' en User. Si luego necesitas permisos finos (soporte vs finanzas), se agrega tabla AdminRole; no se necesita ahora./oculto-admin/** con ssr: false, robots: noindex, fuera de sitemap.xml y sin links desde el sitio público.