Analytics admin
Page /admin/analytics — KPI growth, signups, revenu, providers, géographie, devices, top referrers, coupons.
Page admin /admin/analytics. Aggrégats Prisma + cache 5 min via
unstable_cache. Toute la logique est dans lib/analytics.ts —
fonctions exportées par bloc, chacune avec son tag de cache.
Sections
Growth overview
getGrowthOverview() — total users, signups 30j (avec delta vs 30j
précédents), sessions actives 24h, taux de vérification email.
Signups daily
getSignupsDaily(days) — courbe quotidienne sur N jours, fillée à 0
pour les jours sans signups. Raw SQL avec date_trunc('day', createdAt).
Rendue avec recharts (signups-chart.tsx).
Provider breakdown
getProviderBreakdown() — répartition credentials / google / github
basée sur UserSession.provider. Pie chart.
Geography
getCountries() — top pays par sessions. Affiché en cartes + globe 3D
(cobe) qui anime les arcs entre les pays actifs.
Devices
getDeviceBreakdown() — desktop / mobile / tablet via parseUserAgent
sur UserSession.userAgent.
Top referrers
getTopReferrers() — top 10 users qui ont parrainé le plus de comptes.
Voir Parrainage.
Revenue
getRevenueOverview() — MRR (somme des priceMonthly des subs actives,
yearly /12), ARR (×12), abonnés payants, churn 30j (status="canceled"
canceledAt ≥ J-30), conversion rate (paid / total users).
MRR by plan
getMrrByPlan() — split du MRR par plan, trié par revenu décroissant.
Filtre les plans à 0 sub.
Coupon usage
getCouponUsage() — somme par kind (PERCENT / FREE_MONTHS / LIFETIME)
- top 10 codes par
redemptionsCount. Voir Coupons.
Cache & invalidation
Tag analytics partagé par toutes les fonctions. Quand tu fais une
opération qui change les chiffres (signup, paiement, coupon redeem),
appelle revalidateTag("analytics") pour forcer un re-fetch.
Le webhook Stripe et la cron seed-geo-demo le font déjà.
Seed dev — geo demo
Page locale uniquement. POST /api/admin/analytics/seed-geo — assigne
des pays/villes plausibles aléatoires aux UserSession qui n'en ont pas
(IP locales en dev). Refusé en production.
Étendre
Pour ajouter une métrique :
- Ajoute une fonction dans
lib/analytics.tswrappée dansunstable_cacheavec le taganalytics. - Crée le composant graph dans
app/[locale]/(dashboard)/admin/analytics/_components/. - Importe-le dans
page.tsx.
Pas de table dédiée — tout vient des modèles existants. Si tu veux des
métriques pre-aggregated (cohortes par mois, retention curves, etc.),
crée un modèle AnalyticsSnapshot et un cron qui le remplit.