Análise de retenção por coorte para subscrições, passo a passo
Crie uma tabela de retenção por coorte com os dados de faturação: defina coortes e clientes ativos, escreva o SQL, leia a curva e evite as armadilhas.
Uma taxa de churn mensal mistura clientes que entraram na semana passada com clientes que estão connosco há três anos. Quando ela mexe, não consegue saber se foi o produto que mudou ou a mistura de clientes. Uma tabela de coortes resolve isso: agrupa os clientes pela data de início e acompanha cada grupo ao longo do tempo.
Este guia constrói uma de raiz, das definições ao SQL e à leitura do resultado. Todos os números são hipotéticos.
Passo 1: definir a coorte
Uma coorte é um grupo de clientes que partilham uma data de início. Para subscrições, use o primeiro período pago, não a data de inscrição:
- Os testes gratuitos e os planos gratuitos não são receita. Se começar a contar na inscrição, o abandono dos testes mistura-se com a retenção paga.
- Acompanhe a conversão de teste para pago em separado (como medi-la).
Agrupe por mês civil na maioria das empresas. As coortes semanais ajudam se tiver centenas de novos clientes por semana e quiser ver depressa o efeito de uma mudança; as coortes trimestrais ajudam se tiver poucos.
Clientes que saem e voltam
Decida se um cliente que regressa entra numa nova coorte ou fica na original. As análises do Stripe Billing mantêm-no na coorte original (documentação de análises do Stripe, consultada em novembro de 2026). É uma escolha por defeito razoável: mostra honestamente a receita da coorte ao longo do tempo. Em qualquer caso, registe a escolha por escrito.
Passo 2: definir “ativo”
Para cada coorte e cada mês após o início, precisa de um sim ou não por cliente. Regra típica: o cliente está ativo no mês N se tiver uma subscrição paga (ou num estado pago) no fim desse mês.
Casos-limite a resolver antes de escrever qualquer consulta:
| Caso | Escolha comum |
|---|---|
| Em atraso, ainda em novas tentativas | Ativo até a subscrição terminar, ou até um número fixo de dias após a última tentativa |
| Em pausa | Não ativo, mas assinalado à parte para ver os regressos de pausa |
| Cancelado, ainda dentro do período pago | Ativo até o período terminar |
| Downgrade para um plano gratuito | Não ativo para a retenção paga |
| Plano anual, a meio do período | Ativo; os clientes anuais só podem realmente sair na renovação |
A última linha é importante: misturar planos mensais e anuais numa só tabela faz com que os meses 1 a 11 pareçam artificialmente planos. Construa tabelas separadas por intervalo de faturação.
Passo 3: construir a tabela
Assuma uma tabela subscription_months com uma linha por cliente e por mês em que esteve ativo (customer_id, month). Pode obtê-la a partir dos seus dados de faturação ou dos eventos de 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;
Divida cada linha pelo tamanho da coorte no mês 0 para obter a percentagem de retenção. Passe month_number para colunas para obter o triângulo habitual.
Exemplo (números hipotéticos)
| Coorte | Tamanho | M1 | M2 | M3 | M4 | M5 |
|---|---|---|---|---|---|---|
| Janeiro | 120 | 86% | 79% | 75% | 73% | 72% |
| Fevereiro | 140 | 84% | 77% | 74% | 72% | |
| Março | 110 | 88% | 82% | 79% | ||
| Abril | 150 | 91% | 85% | |||
| Maio | 130 | 90% |
As células vazias não são zero. São meses que ainda não aconteceram. Chama-se a isto censura à direita, e fazer a média de uma coluna contando as células vazias como zeros é um erro clássico.
Passo 4: ler a tabela
Ler uma linha
Uma linha é a vida de uma coorte. Procure onde a curva estabiliza. No exemplo, janeiro perde 14 pontos no mês 1, depois 7, 4, 2 e 1. A maior parte da perda acontece cedo e depois a curva nivela. Uma curva que continua a cair ao mesmo ritmo mês após mês significa que o produto não tem um núcleo estável de utilizadores a esse preço.
Ler uma coluna
Uma coluna compara coortes com a mesma idade. No exemplo, a retenção do mês 1 sobe de 84 para 91% entre fevereiro e abril. Se mudou o onboarding em março, é aqui que o veria. Verifique se a mudança se mantém nas colunas seguintes antes de celebrar; por vezes, uma melhor retenção inicial apenas adia o churn.
Ler a diagonal
Uma diagonal é um mês civil em todas as coortes. Se todas as coortes caem no mesmo mês civil, procure uma causa externa: uma alteração de preço, uma falha do serviço, um problema com o processador de pagamentos, um padrão sazonal.
Passo 5: acrescentar a retenção de receita
A retenção de logos conta clientes. A retenção de receita acompanha o MRR da coorte, que pode passar acima de 100% quando os clientes expandem.
revenue retention (cohort, month N) =
MRR in month N from customers in the cohort
÷ MRR in month 0 from the cohort
Mostre as duas. Uma coorte com 70% de retenção de logos e 105% de retenção de receita perdeu muitos clientes pequenos e fez crescer os restantes. É um negócio diferente de um em que os dois números estão nos 85%. Veja NRR vs GRR para as definições do lado da receita.
Passo 6: resumir todas as coortes
Para um único número de “retenção no mês N”, pondere pelo tamanho da coorte e inclua apenas as coortes que já chegaram ao mês N:
weighted month-3 retention =
sum of active customers at M3 across cohorts that reached M3
÷ sum of their starting sizes
No exemplo, as coortes de janeiro a março chegaram ao mês 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%
Na prática, use as contagens reais em vez de percentagens arredondadas; as casas decimais aqui vêm do arredondamento.
Passo 7: dividir por segmento
As tabelas de coortes mais úteis dividem por algo sobre o qual pode agir:
- Intervalo de faturação (mensal vs anual)
- Plano ou nível de preço
- Canal de aquisição ou origem da inscrição
- Tipo de método de pagamento
- Se o cliente atingiu um marco de ativação (veja ativação e churn precoce)
Cada divisão torna as coortes mais pequenas. Tenha em mente a regra seguinte.
Armadilhas
- Coortes pequenas. Com 20 clientes, um cancelamento move a retenção em 5 pontos. Mostre o tamanho da coorte ao lado de cada linha, ou agrupe por trimestres.
- As coortes recentes parecem melhores. Os números do mês 1 da coorte do mês passado podem não incluir pagamentos falhados ainda em novas tentativas. Espere que a janela de novas tentativas feche antes de ler a coluna mais recente.
- Intervalos misturados. Os planos anuais fazem as coortes mensais parecer planas. Separe-os.
- Viés de sobrevivência nos segmentos. Se segmentar por um comportamento que leva tempo (por exemplo, “usou a funcionalidade X”), os clientes que saíram cedo nunca tiveram oportunidade de o fazer. Meça o comportamento numa janela inicial fixa, como os primeiros 14 dias, para todos.
- Correlação não é causa. Um segmento que retém melhor pode diferir em muitos aspetos ao mesmo tempo. Teste as mudanças com um grupo de controlo quando puder.
Fazer isto com o NoChurn
O NoChurn lê os eventos de subscrição da sua ferramenta de faturação (Stripe num clique, muitas outras por conector ou API REST) e permite-lhe enviar os seus próprios atributos de clientes por API, como a origem da inscrição, o plano ou a ativação, para ver quais acompanham o churn (correlação, não causalidade). Cada cliente recebe uma pontuação de churn de 0 a 100 na inscrição e a cada alteração. Para agir sobre o que uma tabela de coortes mostra, executa a recuperação de pagamentos falhados, fluxos de cancelamento com uma oferta por motivo e cancelamento num clique sempre visível, e emails de reconquista aos dias 30, 60 e 90. Todas as funcionalidades estão em todos os planos (o seu próprio domínio de email a partir de $9), com preço apenas pelo MRR (preços).