Analisi della retention per coorte negli abbonamenti, passo dopo passo
Costruisci una tabella di retention per coorte dai dati di fatturazione: coorti e clienti attivi, SQL, lettura della curva e trappole delle coorti piccole.
Un tasso di churn mensile mescola clienti arrivati la settimana scorsa con clienti presenti da tre anni. Quando si muove, non puoi capire se è cambiato il prodotto o il mix di clienti. Una tabella per coorte risolve il problema: raggruppa i clienti in base a quando hanno iniziato e segue ogni gruppo nel tempo.
Questa guida ne costruisce una da zero, dalle definizioni all’SQL alla lettura del risultato. Tutti i numeri sono ipotetici.
Passo 1: definire la coorte
Una coorte è un gruppo di clienti che condividono una data di inizio. Per gli abbonamenti, usa il primo periodo pagato, non la data di iscrizione:
- Le prove gratuite e i piani gratuiti non sono ricavi. Se fai partire il conteggio all’iscrizione, gli abbandoni durante la prova si mescolano alla retention pagata.
- Monitora a parte la conversione da prova a pagamento (come misurarla).
Per la maggior parte delle aziende raggruppa per mese di calendario. Le coorti settimanali aiutano se hai centinaia di nuovi clienti a settimana e vuoi vedere in fretta l’effetto di un cambiamento; quelle trimestrali aiutano se ne hai pochi.
Clienti che se ne vanno e tornano
Decidi se un cliente che ritorna entra in una nuova coorte o resta in quella originale. Le Billing analytics di Stripe lo tengono nella coorte originale (documentazione analytics di Stripe, consultata a novembre 2026). È un default ragionevole: mostra onestamente i ricavi della coorte nel tempo. In ogni caso, metti per iscritto la scelta.
Passo 2: definire “attivo”
Per ogni coorte e ogni mese dopo l’inizio, ti serve un sì o un no per ciascun cliente. Regola tipica: il cliente è attivo nel mese N se alla fine di quel mese ha un abbonamento pagato (o in uno stato pagato).
Casi limite da chiarire prima di scrivere qualsiasi query:
| Caso | Scelta comune |
|---|---|
| Scaduto, ancora in fase di nuovi tentativi | Attivo finché l’abbonamento non termina, o fino a un numero fisso di giorni dopo l’ultimo tentativo |
| In pausa | Non attivo, ma segnalato a parte per vedere i rientri dalla pausa |
| Disdetto, ancora nel periodo pagato | Attivo fino alla fine del periodo |
| Downgrade a un piano gratuito | Non attivo per la retention pagata |
| Piano annuale, a metà periodo | Attivo; i clienti annuali possono davvero fare churn solo al rinnovo |
L’ultima riga conta: mescolare piani mensili e annuali in un’unica tabella rende i mesi da 1 a 11 artificialmente piatti. Costruisci tabelle separate per ogni intervallo di fatturazione.
Passo 3: costruire la tabella
Supponi una tabella subscription_months con una riga per cliente per ogni mese in cui è stato attivo (customer_id, month). Puoi ricavarla dai tuoi dati di fatturazione o dagli eventi 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;
Dividi ogni riga per la dimensione della coorte al mese 0 per ottenere la percentuale di retention. Trasforma month_number in colonne per ottenere il classico triangolo.
Esempio (numeri ipotetici)
| Coorte | Dimensione | M1 | M2 | M3 | M4 | M5 |
|---|---|---|---|---|---|---|
| Gennaio | 120 | 86% | 79% | 75% | 73% | 72% |
| Febbraio | 140 | 84% | 77% | 74% | 72% | |
| Marzo | 110 | 88% | 82% | 79% | ||
| Aprile | 150 | 91% | 85% | |||
| Maggio | 130 | 90% |
Le celle vuote non sono zero. Sono mesi che non sono ancora arrivati. Si chiama censura a destra, e fare la media di una colonna contando le celle vuote come zeri è un errore classico.
Passo 4: leggere la tabella
Leggere una riga
Una riga è la vita di una coorte. Cerca il punto in cui la curva si appiattisce. Nell’esempio, gennaio perde 14 punti nel mese 1, poi 7, 4, 2 e 1. La maggior parte della perdita è all’inizio, poi la curva si stabilizza. Una curva che continua a scendere allo stesso ritmo mese dopo mese significa che il prodotto non ha un nucleo stabile di utenti a quel prezzo.
Leggere una colonna
Una colonna confronta coorti alla stessa età. Nell’esempio, la retention al mese 1 sale dall’84 al 91% tra febbraio e aprile. Se hai cambiato l’onboarding a marzo, è qui che lo vedresti. Prima di festeggiare, verifica che il miglioramento regga nelle colonne successive; a volte una retention iniziale migliore ritarda soltanto il churn.
Leggere la diagonale
Una diagonale è un mese di calendario attraverso tutte le coorti. Se ogni coorte cala nello stesso mese di calendario, cerca una causa esterna: un cambio di prezzo, un’interruzione del servizio, un problema del processore di pagamento, un effetto stagionale.
Passo 5: aggiungere la retention dei ricavi
La retention dei clienti conta i clienti. La retention dei ricavi segue l’MRR della coorte, che può superare il 100% quando i clienti espandono.
revenue retention (cohort, month N) =
MRR in month N from customers in the cohort
÷ MRR in month 0 from the cohort
Mostrale entrambe. Una coorte con il 70% di retention dei clienti e il 105% di retention dei ricavi ha perso molti clienti piccoli e ha fatto crescere gli altri. È un business diverso da uno in cui entrambi i numeri sono all’85%. Vedi NRR e GRR per le definizioni lato ricavi.
Passo 6: riassumere tra le coorti
Per un unico dato di “retention al mese N”, pondera per dimensione della coorte e includi solo le coorti che hanno raggiunto il mese N:
weighted month-3 retention =
sum of active customers at M3 across cohorts that reached M3
÷ sum of their starting sizes
Nell’esempio, le coorti da gennaio a marzo hanno raggiunto il mese 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%
Nella pratica usa i conteggi reali invece delle percentuali arrotondate; i decimali qui derivano dall’arrotondamento.
Passo 7: dividere per segmento
Le tabelle per coorte più utili sono divise per qualcosa su cui puoi agire:
- Intervallo di fatturazione (mensile o annuale)
- Piano o fascia di prezzo
- Canale di acquisizione o fonte di iscrizione
- Tipo di metodo di pagamento
- Se il cliente ha raggiunto un traguardo di attivazione (vedi attivazione e churn iniziale)
Ogni divisione rimpicciolisce le coorti. Tieni a mente la prossima regola.
Trappole
- Coorti piccole. Con 20 clienti, una sola disdetta sposta la retention di 5 punti. Mostra la dimensione della coorte accanto a ogni riga, o raggruppa per trimestre.
- Le coorti recenti sembrano migliori. I numeri del mese 1 per la coorte del mese scorso potrebbero non includere i pagamenti falliti ancora in fase di nuovi tentativi. Aspetta che la finestra dei tentativi si sia chiusa prima di leggere l’ultima colonna.
- Intervalli misti. I piani annuali fanno sembrare piatte le coorti mensili. Separali.
- Effetto sopravvivenza nei segmenti. Se segmenti per un comportamento che richiede tempo (per esempio “ha usato la funzione X”), i clienti andati via presto non hanno mai avuto la possibilità di farlo. Misura il comportamento in una finestra iniziale fissa, come i primi 14 giorni, per tutti.
- Correlazione non è causalità. Un segmento che trattiene meglio può differire in molti modi contemporaneamente. Quando puoi, testa i cambiamenti con un gruppo di controllo.
Farlo con NoChurn
NoChurn legge gli eventi di abbonamento dal tuo strumento di fatturazione (Stripe in un clic, molti altri tramite connettore o API REST) e ti permette di inviare via API i tuoi attributi dei clienti, come fonte di iscrizione, piano o attivazione, per vedere quali vanno di pari passo con il churn (correlazione, non causalità). Ogni cliente riceve un churn score da 0 a 100 all’iscrizione e a ogni cambiamento. Per agire su ciò che mostra una tabella per coorte, gestisce il recupero dei pagamenti falliti, flussi di disdetta con un’offerta per ogni motivo e disdetta in un clic sempre visibile, ed email di win-back a 30, 60 e 90 giorni. Ogni funzionalità è in ogni piano (il tuo dominio email da $9), con prezzo basato solo sull’MRR (prezzi).