Documentation

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 :

  1. Ajoute une fonction dans lib/analytics.ts wrappée dans unstable_cache avec le tag analytics.
  2. Crée le composant graph dans app/[locale]/(dashboard)/admin/analytics/_components/.
  3. 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.

On this page