Analyse de la rétention par cohorte pour les abonnements, étape par étape
Un tableau de rétention par cohorte tiré de la facturation : cohortes, définition d’« actif », SQL, lecture de la courbe et pièges des petites cohortes.
Un taux de churn mensuel mélange des clients arrivés la semaine dernière et des clients présents depuis trois ans. Quand il bouge, impossible de savoir si c’est le produit qui a changé ou la composition de la clientèle. Un tableau de cohortes règle ce problème : il regroupe les clients selon leur date de départ et suit chaque groupe dans le temps.
Ce guide en construit un de zéro, des définitions au SQL jusqu’à la lecture du résultat. Tous les chiffres sont hypothétiques.
Étape 1 : définir la cohorte
Une cohorte est un groupe de clients qui partagent une date de départ. Pour les abonnements, utilisez la première période payée, pas la date d’inscription :
- Les essais gratuits et les offres gratuites ne sont pas du revenu. Si vous lancez le chronomètre à l’inscription, les abandons d’essai se mélangent à la rétention payante.
- Suivez la conversion de l’essai au payant à part (comment la mesurer).
Regroupez par mois calendaire dans la plupart des cas. Les cohortes hebdomadaires aident si vous avez des centaines de nouveaux clients par semaine et voulez voir vite l’effet d’un changement ; les cohortes trimestrielles aident si vous en avez peu.
Les clients qui partent et reviennent
Décidez si un client qui revient rejoint une nouvelle cohorte ou reste dans la sienne. Les analytics de Stripe Billing le gardent dans sa cohorte d’origine (documentation analytics de Stripe, consultée en novembre 2026). C’est un choix par défaut raisonnable : il montre honnêtement le revenu de la cohorte dans le temps. Dans tous les cas, notez votre choix.
Étape 2 : définir « actif »
Pour chaque cohorte et chaque mois après le départ, il vous faut un oui ou un non par client. Règle courante : le client est actif au mois N s’il a un abonnement payé (ou dans un statut payé) à la fin de ce mois.
Cas limites à trancher avant d’écrire la moindre requête :
| Cas | Choix courant |
|---|---|
| En retard de paiement, relances en cours | Actif jusqu’à la fin de l’abonnement, ou jusqu’à un nombre fixe de jours après la dernière relance |
| En pause | Non actif, mais signalé à part pour voir les retours de pause |
| Résilié, encore dans la période payée | Actif jusqu’à la fin de la période |
| Passé à une offre gratuite | Non actif pour la rétention payante |
| Offre annuelle, en cours de période | Actif ; un client annuel ne peut vraiment churner qu’au renouvellement |
La dernière ligne compte : mélanger offres mensuelles et annuelles dans un même tableau rend les mois 1 à 11 artificiellement plats. Construisez un tableau par intervalle de facturation.
Étape 3 : construire le tableau
Supposons une table subscription_months avec une ligne par client et par mois où il était actif (customer_id, month). Vous pouvez la dériver de vos données de facturation ou des événements webhook.
with first_paid as (
select customer_id, min(month) as cohort_month
from subscription_months
group by customer_id
),
activity as (
select
f.cohort_month,
(extract(year from age(s.month, f.cohort_month)) * 12
+ extract(month from age(s.month, f.cohort_month)))::int as month_number,
s.customer_id
from subscription_months s
join first_paid f using (customer_id)
)
select
cohort_month,
month_number,
count(distinct customer_id) as active_customers
from activity
group by cohort_month, month_number
order by cohort_month, month_number;
Divisez chaque ligne par la taille de la cohorte au mois 0 pour obtenir le pourcentage de rétention. Pivotez month_number en colonnes pour obtenir le triangle habituel.
Exemple (chiffres hypothétiques)
| Cohorte | Taille | M1 | M2 | M3 | M4 | M5 |
|---|---|---|---|---|---|---|
| Janvier | 120 | 86 % | 79 % | 75 % | 73 % | 72 % |
| Février | 140 | 84 % | 77 % | 74 % | 72 % | |
| Mars | 110 | 88 % | 82 % | 79 % | ||
| Avril | 150 | 91 % | 85 % | |||
| Mai | 130 | 90 % |
Les cellules vides ne valent pas zéro. Ce sont des mois qui ne sont pas encore passés. On parle de censure à droite, et faire la moyenne d’une colonne en comptant les cellules vides comme des zéros est une erreur classique.
Étape 4 : lire le tableau
Lire une ligne
Une ligne, c’est la vie d’une cohorte. Cherchez où la courbe s’aplatit. Dans l’exemple, janvier perd 14 points au mois 1, puis 7, 4, 2 et 1. L’essentiel de la perte arrive tôt, puis la courbe se stabilise. Une courbe qui continue de baisser au même rythme mois après mois signifie que le produit n’a pas de noyau stable d’utilisateurs à ce prix.
Lire une colonne
Une colonne compare des cohortes au même âge. Dans l’exemple, la rétention au mois 1 passe de 84 à 91 % entre février et avril. Si vous avez changé l’onboarding en mars, c’est là que vous le verriez. Vérifiez que le changement tient dans les colonnes suivantes avant de vous réjouir ; parfois, une meilleure rétention précoce ne fait que retarder le churn.
Lire la diagonale
Une diagonale, c’est un mois calendaire sur toutes les cohortes. Si toutes les cohortes chutent le même mois calendaire, cherchez une cause externe : un changement de prix, une panne, un problème chez le processeur de paiement, un effet saisonnier.
Étape 5 : ajouter la rétention du revenu
La rétention des logos compte les clients. La rétention du revenu suit le MRR de la cohorte, qui peut dépasser 100 % quand les clients montent en gamme.
revenue retention (cohort, month N) =
MRR in month N from customers in the cohort
÷ MRR in month 0 from the cohort
Montrez les deux. Une cohorte avec 70 % de rétention des logos et 105 % de rétention du revenu a perdu beaucoup de petits clients et fait grandir les autres. C’est une autre entreprise qu’une cohorte où les deux chiffres sont à 85 %. Voir NRR et GRR pour les définitions côté revenu.
Étape 6 : résumer sur l’ensemble des cohortes
Pour un chiffre unique de « rétention au mois N », pondérez par la taille des cohortes et n’incluez que les cohortes qui ont atteint le mois N :
weighted month-3 retention =
sum of active customers at M3 across cohorts that reached M3
÷ sum of their starting sizes
Dans l’exemple, les cohortes de janvier à mars ont atteint le mois 3 :
active at M3: 120 × 0.75 + 140 × 0.74 + 110 × 0.79 = 90 + 103.6 + 86.9 ≈ 280.5
starting size: 120 + 140 + 110 = 370
weighted month-3 retention ≈ 280.5 ÷ 370 ≈ 75.8%
En pratique, utilisez les effectifs réels plutôt que des pourcentages arrondis ; les décimales ici viennent de l’arrondi.
Étape 7 : découper par segment
Les tableaux de cohortes les plus utiles découpent selon quelque chose sur quoi vous pouvez agir :
- Intervalle de facturation (mensuel ou annuel)
- Offre ou niveau de prix
- Canal d’acquisition ou source d’inscription
- Type de moyen de paiement
- Si le client a atteint une étape d’activation (voir activation et churn précoce)
Chaque découpage réduit la taille des cohortes. Gardez en tête la règle suivante.
Pièges
- Les petites cohortes. Avec 20 clients, une seule résiliation fait bouger la rétention de 5 points. Affichez la taille de la cohorte à côté de chaque ligne, ou regroupez par trimestre.
- Les cohortes récentes paraissent meilleures. Les chiffres du mois 1 de la cohorte du mois dernier peuvent ne pas inclure des paiements échoués encore en relance. Attendez que la fenêtre de relance soit close avant de lire la dernière colonne.
- Les intervalles mélangés. Les offres annuelles rendent les cohortes mensuelles plates. Séparez-les.
- Le biais du survivant dans les segments. Si vous segmentez par un comportement qui prend du temps (par exemple « a utilisé la fonctionnalité X »), les clients partis tôt n’ont jamais eu l’occasion de le faire. Mesurez le comportement dans une fenêtre précoce fixe, comme les 14 premiers jours, pour tout le monde.
- Corrélation n’est pas causalité. Un segment qui retient mieux peut différer de bien des façons à la fois. Testez vos changements avec un groupe témoin quand c’est possible.
Le faire avec NoChurn
NoChurn lit les événements d’abonnement de votre outil de facturation (Stripe en un clic, beaucoup d’autres par connecteur ou API REST) et vous permet d’envoyer vos propres attributs clients par API, comme la source d’inscription, l’offre ou l’activation, pour voir lesquels vont avec le churn (corrélation, pas causalité). Chaque client reçoit un score de churn de 0 à 100 à l’inscription et à chaque changement. Pour agir sur ce que montre un tableau de cohortes, NoChurn gère la récupération des paiements échoués, des parcours d’annulation avec une offre par raison et une résiliation en un clic toujours visible, et des emails de reconquête à J30, J60 et J90. Toutes les fonctionnalités sont dans toutes les offres (votre propre domaine d’email dès 9 $), avec un prix qui ne dépend que du MRR (tarifs).