The IEE Edu admin dashboard is the operational nerve center of the platform. It gives administrators an at-a-glance view of platform health — from total revenue and active subscriptions to pending payment approvals and course completion rates — all backed by aDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/RigbySawGame/ieeEdu_Wen/llms.txt
Use this file to discover all available pages before exploring further.
DashboardStatsService that aggregates data from users, payments, enrollments, books, certificates, and subscriptions in a single cached response.
Accessing the Dashboard
The dashboard is protected by theauth middleware and the EnsureAdmin gate. Any request from a non-admin account is redirected automatically.
admin/Dashboard Inertia view and passes the full stats payload returned by DashboardStatsService::getStats().
KPI Metrics
DashboardStatsService computes the following stats and exposes them under the stats key of the Inertia props:
Users
totalUsers— all registered accountsactiveUsers— accounts withstatus = activoinactiveUsers— accounts withstatus = inactivopremiumUsers— users with an active, non-expired subscriptionnewUsersThisMonth— registrations in the current calendar month
Revenue
totalIncome— sum of allaprobadopaymentssubIncome— subscription-only income (nocourse_idorbook_id)courseIncome— income from course purchasesbookIncome— income from book purchasesbookSalesCount— count of approved book payments
Courses
totalCourses/publishedCourses/draftCoursesrecordedCourses— typegrabadoliveCourses— typeen_vivo
Engagement
totalEnrollments/completedCourses— enrollments with acompleted_atdateapprovalRate— percentage of enrollments wherepassed = truecertificatesIssued— total issued certificateswhatsappLeads/whatsappLeadsMonth— WhatsApp lead count all-time and this month
Books
totalBooks/availableBookstotalBookDownloads/bookDownloadsThisMonthbookWhatsappLeads— downloads attributed to a WhatsApp source
Subscriptions & Payments
activeSubs— subscriptions withstatus = activaandend_date >= nowexpiredSubs— subscriptions withstatus = expiradapendingPayments— payments withstatus = pendienteapprovedPayments— payments withstatus = aprobado
Payment Charts
The dashboard exposes four chart datasets under thecharts key. Each entry contains label, total, subs, courses, and books float values — ready for a stacked bar or line chart.
| Key | Coverage | Labels |
|---|---|---|
charts.weekly | Last 7 days | Abbreviated day + date (e.g. Lun 14) |
charts.monthly | Last 4 weeks | Semana 1 – Semana 4 |
charts.quarterly | Last 3 months | Spanish month abbreviation (e.g. Abr) |
charts.annually | Last 6 months | Month + 2-digit year (e.g. Abr 25) |
payments with status = aprobado and are expressed in the platform’s base currency (PEN). Timestamps are normalized to the America/Lima timezone before grouping.
Top Sales Leaderboards
In addition to thestats and charts keys, DashboardStatsService returns two standalone top-level props passed directly to the Inertia view:
| Prop | Description |
|---|---|
courseSales | Top 5 courses by approved payment count, each including id, title, type, price, category_id, image, approved_payments_count, and total_earned |
topBooks | Top 5 books by total revenue and download count, each including id, title, category, price, author, cover_image, downloads_count, approved_sales_count, and total_earned |
stats object — they are separate top-level keys in the Inertia props payload.
Download Report
Admins can download a PDF executive report for the current month:GenerateExecutiveReportAction compiles the report and streams it as a download with the filename Reporte_Mensual_iieEdu_MM_YYYY.pdf.
Cache Behavior
All stats are computed once and stored in the Laravel cache under the keyadmin_dashboard_stats for 5 minutes (300 seconds). Subsequent page loads within that window return the cached payload without hitting the database.
pendingPayments count displayed as a badge in the sidebar navigation (admin_nav.pending_payments) is derived from the same cached stats object.
After running database seeders or making bulk data changes, the cached stats will not reflect the new data until the cache expires. Run the following command to force a fresh calculation immediately: