Glossary

Retention Cohort: Definition and How to Read One

A retention cohort is a group of subscribers who joined in the same period, measured again and again at fixed ages, so you can tell whether the people you acquired last month behave differently from the people you acquired in March.

Definition in plain language

A cohort is a set of users who share a starting event inside a time bucket: everyone who started your bot during the week of 3 March. A retention cohort is that same group followed forward in time and measured at fixed offsets from its own start — one week later, two weeks later, four weeks later — so the number you read is always “how much of this group is still here at age N”.

The point is to escape blended numbers. A total subscriber count can rise while every individual group you acquire decays faster than the last, because new joins paper over the losses. A snapshot metric like daily active users tells you how many people showed up today but not whether they were acquired yesterday or a year ago. Cohorts separate the two questions: how many people are arriving, and how long each arrival lasts.

How a cohort table is constructed

Building one is four decisions, and almost every disagreement about cohort numbers is really a disagreement about one of them.

  • The start event. For a Telegram funnel this is the moment the subscriber record is created — the first /start, usually carrying a deep-link payload that names the source. You can also anchor on a later step, such as finishing onboarding, but pick one and stay with it.
  • The bucket size. Daily, weekly or monthly. Choose the smallest bucket that still puts a meaningful number of people in each row. Weekly suits most bot funnels, because daily rows on a modest list turn into noise and monthly rows hide the effect of anything you shipped mid-month.
  • The return event that counts as retained. This is the hard one. A Telegram bot has no sessions in the web sense, so “active” has to be defined by an action you can actually observe: tapping an inline button, following a campaign deep link, activating a promo code, or simply still being reachable when the next message goes out.
  • The window. Period 0 is the join period itself — by definition 100% — and each later column is one period of age.

Every cell is then the same division: subscribers from that cohort who produced the return event during period N, divided by the size of the cohort at period 0. Rows are cohorts, columns are age, and the whole thing forms a triangle, because the cohort that joined last week cannot yet have a week-four column.

One property is specific to Telegram and worth building into your definition: a subscriber who blocks the bot is unreachable permanently unless they unblock it themselves. Blocks are therefore a hard floor under your curve rather than a soft dip, which makes them the cleanest available proxy for subscriber churn even though they undercount quiet disengagement.

Reading rows, columns and the retention curve

Read across a row and you watch one cohort decay: 100% at join, a steep drop in the first period, then progressively smaller losses.

Read down a column and you compare different cohorts at the same age. This is the only genuinely fair comparison in the table, and it is what makes cohorts useful for judging changes: if the week-two column has climbed steadily since you rewrote the welcome offer, that is evidence; if the blended average moved, that could be mix.

Read along a diagonal and you are looking at calendar time, because every cell on a given diagonal was measured in the same week. When a whole diagonal dips or spikes, the cause was an event that hit everyone at once — a big broadcast, a holiday, a bot outage — not something about how those people were acquired.

A retention curve is simply one row plotted as a line, or several rows overlaid to compare shapes. The curve makes the shape obvious in a way the grid does not: a steep initial fall, then a bend, then something close to a horizontal line.

Day-1, day-7 and day-30 retention

The three conventional checkpoints answer three different questions. Day 1 is mostly an onboarding and promise-matching metric: did the language pick, the optional category pick, the channel gate and the welcome offer deliver what the ad or deep link implied? Day 7 asks whether your drip found a reason for the subscriber to come back at all. Day 30 is the first honest read on durability — by then you are usually near the flat part of the curve.

Be explicit about which definition you are using. Classic day-7 retention counts only subscribers active on exactly day 7. Window or range retention counts anyone active between, say, day 4 and day 7. For a low-frequency channel like a promo bot, where nobody is expected to interact every day, classic retention produces jagged, pessimistic numbers and window retention describes reality better. Neither is wrong; mixing them inside one table is.

What a flattening curve tells you

The interesting part of a retention curve is not the drop, it is where the drop stops. The flat section is the fraction of each cohort that has become durable, and it is the only part that compounds: those subscribers are still on the list when your next campaign goes out, at no additional acquisition cost.

If the curve flattens at a level you are happy with, growth accumulates and every new cohort adds to a base rather than replacing one. If the curve keeps sliding toward zero with no bend, each cohort is eventually worth nothing and your list size is just a function of how much traffic you bought this month.

The distinction matters because the two failures have different fixes. A steep early drop points at the first few minutes: the offer, the gate, the mismatch between the ad and the welcome message. A plateau that sits too low points at the absence of a recurring reason to stay, which is drip and campaign work. The guide on Telegram bot retention metrics goes into how to instrument each of those.

Cohorts by acquisition source and language

Cohorts pay for themselves the moment you split them. Deep-link payloads tag every subscriber with the source they arrived from, so the same table can be cut per source — and two channels that look identical on cost per subscriber routinely produce completely different curves. A cheap source whose cohorts collapse by week two is expensive; an apparently pricey source whose cohorts plateau high is not.

Language is the second natural cut. The bot detects the Telegram client language, the subscriber confirms it, and everything afterwards is served in that language, so a per-language cohort table quickly reveals whether a market is actually being served or is merely being counted. A cohort that drops off a cliff after the welcome message is often a market where the drip was never translated.

Category is a third, when subscribers self-select an interest at onboarding: intent differs, the welcome offer differs, and the curves usually differ too. The mySkua analytics view keeps retention cohorts alongside subscriber growth, DAU, campaign activations and delivery stats for exactly this reason — a curve without the source, language and campaign context beside it is hard to act on.

The constraint on all of this is arithmetic. Every split divides the same people into smaller cells, and a cohort of thirty subscribers is an anecdote with a percentage sign. When cells get thin, widen the bucket from weekly to monthly rather than reading noise as signal.

Common analysis mistakes

  • Reading the partial last column. The newest cohort has not finished its current period, so its final cell is always artificially low. Grey it out or drop it.
  • Comparing cohorts at different ages. A three-month-old cohort has had more chances to decay than a three-week-old one. Compare columns, never row totals.
  • Redefining “retained” mid-analysis. Switching from “still reachable” to “tapped a button” changes every number in the table. Improvements that appear the same week you changed the definition are not improvements.
  • Blending sources. A retention change is very often a mix change: you bought more traffic from a worse source and the average moved without any subscriber behaving differently.
  • Counting non-starters in the denominator. Someone who sent /start and never picked a language never entered the funnel. Including them depresses every cohort equally and hides the onboarding problem you should be fixing.
  • Expecting a change to show up in old cohorts. A new welcome message can only affect people who joined after it shipped. Look at cohorts formed after the change, at the same age as the ones before it.
  • Optimising day 1 at the expense of the plateau. Aggressive first-day tactics can lift the first column and steepen everything after it. The plateau is the number that compounds.

Request access

mySkua is in a closed, invite-only beta, so accounts are created by request rather than self-serve. If you run Telegram acquisition and you want retention cohorts sitting next to your sources, languages, campaigns and delivery stats on the same list, join the waitlist and tell us how many bots you run, which languages you serve and where your deep links are placed. Those details decide who we invite next.

See also: Daily active users · Subscriber churn · Telegram bot retention metrics.

Want this on your own bots?

mySkua is in a closed beta and accounts are opened in small batches. Tell us what you run and we will come back to you.

Request access