Guide

Measuring DAU and Retention for Telegram Bots

Subscriber count is the number everyone reports and the one that explains the least. Here is how to define an active user for a bot, build cohort retention tables that survive scrutiny, and catch churn while you can still do something about it.

The three numbers that describe a bot audience

Most Telegram bot reporting stops at one figure: total subscribers. It only ever goes up, which is exactly why it is useless as a diagnostic. A list of 40,000 people where 1,200 still respond is a worse asset than a list of 6,000 where 2,000 do, and the headline number says the opposite.

Three numbers together describe the audience honestly:

  • Size and direction. Not the total, but net growth per week: joins minus blocks. A bot can add 800 subscribers a week and shrink in reachable terms.
  • Engagement. How many distinct people did something in the last day, week or month. This is where DAU lives.
  • Durability. How long a joining cohort keeps doing something. This is retention, and it is the only one of the three that tells you whether acquisition is worth repeating.

Everything else — activation rate, click share, delivery failures — is a lens on one of those three.

Defining an active user for a bot, not an app

App analytics inherited the idea of a session: the user opens the app, the SDK starts a timer. Bots have no session and no open event. Telegram gives you inbound updates and nothing else. There is no read receipt for a bot message, no impression, no time-on-screen. So the definition has to be built from what actually arrives.

Three tiers, and keeping them apart is most of the work:

  • Reachable. The bot can still deliver to this person — they have not blocked it and the chat has not been deleted. Reachability is a property of the list, not a sign of interest.
  • Delivered. A message went out successfully. Delivery is your activity, not theirs. Counting delivered messages as engagement is the single most common way bot dashboards flatter themselves.
  • Active. The subscriber initiated something: a command, a reply, an inline button tap, a campaign deep link opened, a language or category choice made. Only this tier belongs in DAU.

Write the definition down and freeze it before you start trending anything. If you later add button callbacks to the definition, every historical figure moves and the trend line becomes fiction. The safest default is: an active user is a subscriber who produced at least one inbound event in the window. See the daily active users entry for the longer definition and the edge cases.

Calculating DAU and rolling active windows

DAU is the count of distinct subscriber IDs with at least one inbound event in a calendar day. Two decisions change the answer and both need to be made once and never revisited casually.

Pick a timezone and keep it. UTC is the least arguable choice for a multi-language bot, because a bot serving Brazil and Hungary has no natural local midnight. If your reporting week runs Monday to Sunday in a business timezone, define the day boundary once and apply it to every metric, including cohorts.

Report DAU alongside your send calendar. A promo bot's DAU is broadcast-shaped: it spikes on send days and sags between them. A raw DAU chart with no send markers looks like volatility and is actually your own schedule. Two views fix it — DAU with send days annotated, and rolling 7-day and 28-day active counts (WAU and MAU), which smooth the spikes and show the underlying trend.

The DAU-to-MAU ratio, often called stickiness, is worth watching but not worth comparing to consumer app benchmarks. A lead-generation bot is not a social feed; nobody opens it out of habit. What matters is the direction of your own ratio at a constant send frequency. If you keep sending twice a week and the ratio drops for a month, the audience is decaying even while the subscriber count climbs.

Segment DAU by language, source and category before drawing conclusions. An aggregate that mixes paid traffic from one creative with organic joins from a channel button averages two different products into one flat line.

Building cohort retention tables by join week

A cohort table is a grid: each row is a join week, each column is weeks since joining, each cell is the share of that cohort active in that week. Week 0 sits near 100 percent by construction, since joining is itself an active event, so the interesting reading starts at week 1.

The table answers two different questions depending on how you read it:

  • Across a row you see the shape of decay for one intake. Most bot cohorts fall steeply between week 0 and week 1, then flatten. Where the curve flattens is your real audience; how high it flattens is the number to improve.
  • Down a column you compare intakes at the same age. If week-1 retention for the cohorts you acquired in March is half of February's, the traffic changed, not the product.

Two practical cautions. First, size the cohorts: a 40-person cohort produces percentages that swing 5 points on two people, so mark anything under roughly 100 subscribers as directional and do not build a decision on it. Second, cut cohorts by acquisition source and by category as well as by week — the useful finding is almost never "retention fell" but "retention fell for one source while the rest held steady". The retention cohort entry walks through the table construction step by step.

Activation rate by campaign and source

Retention measures whether people stay. Activation measures whether they ever really arrived. Define it as the intended first action for a given entry point: the campaign offer claimed, the promo code revealed, the offer button tapped. In mySkua a campaign activation is recorded once per subscriber, so the rate is people, not clicks: activations divided by subscribers who arrived through that deep link.

Because deep-link payloads tag each subscriber with a source, activation splits by creative, influencer or landing page without extra instrumentation. That turns a vague "the campaign underperformed" into a specific diagnosis, and the diagnosis usually falls into one of three buckets:

  • Many joins, low activation. The ad promised something the welcome message does not deliver, or the offer language does not match the ad language.
  • Drop before the offer is even seen. Walk the onboarding as a funnel: /start, language pick, category pick, channel-subscription gate, offer. Each step is a place to lose people, and the gate is typically the largest single drop. Measure it with the gate on and off for a week before deciding it is worth the loss.
  • Good activation, bad retention. The incentive worked and the follow-up did not. That is a drip problem, not an acquisition problem.

Spotting churn before subscribers disappear

Bot churn is silent. There is no cancellation event and no unsubscribe click — a person blocks the bot, and you only find out on the next send, when Telegram refuses delivery. That refusal is the one hard, unambiguous churn signal you get, and it should be counted per broadcast rather than as a monthly total. A block spike attached to one specific send tells you about that message. A steady baseline of blocks tells you about frequency.

Softer signals arrive earlier:

  • Recency buckets. Split the reachable list by days since last inbound event: 0–7, 8–30, 31–90, 90 plus. Watch the share in the last two buckets month over month. People move into silence long before they block.
  • Falling click share per send. Same audience size, same offer type, fewer button taps. The list is intact and the attention is gone.
  • A worsening week-1 cohort dip. The earliest possible warning, because it shows up in new intakes before it shows up in aggregate engagement.
  • Rising delivery failures that are not blocks — deleted accounts and abandoned chats. This is list decay rather than a message problem, and no copy change fixes it.

The response differs by signal. Frequency-driven blocks call for fewer, better-targeted sends — targeting a drip by language, source, tag or category usually beats sending the same thing to everyone. Silence in the 31–90 day bucket calls for a genuinely different message, not a third copy of the same offer.

Benchmarks: how to set your own baseline

Published retention benchmarks for Telegram bots should be treated as decoration. The numbers depend on vertical, incentive strength, traffic quality and how the source defined "active" — and that last definition is almost never stated. A bot handing out a discount code and a bot running a community have no common scale.

Build the baseline from your own history instead. Take six to eight consecutive join weeks under stable conditions, record week-1 and week-4 retention for each, and take the median plus the spread. That median is your expected value, and the spread is your noise band: a new cohort inside the band is normal variation, and one outside it is a signal worth investigating. Do this per source, because paid traffic and channel-organic traffic will not share a baseline and averaging them hides both.

Re-baseline whenever you change the onboarding flow, the gate, or the offer. Comparing post-change cohorts to a pre-change median is how teams talk themselves into believing a change worked.

A monthly reporting routine that takes an hour

Reporting that takes a day gets skipped. This fits in an hour and is enough to run a funnel:

  • 10 minutes — the list. Joins, blocks, net growth, reachable total. Note whether reachable growth and headline growth diverged.
  • 15 minutes — cohorts. Refresh the table for the last eight join weeks. Read down the week-1 column first, then the week-4 column. Flag any cohort outside the baseline band.
  • 10 minutes — activation. Activation rate by campaign and by source for the month. Kill or rewrite the worst source; write down which of the three diagnoses applies.
  • 10 minutes — sends. Delivery stats and block counts per broadcast. Identify the single worst send and say why in one sentence.
  • 15 minutes — the write-up. Three sentences: what moved, the most plausible reason, and the one change you will make. One decision per report. A report that recommends five things changes nothing, because next month you will not know which one moved the number.

mySkua reports subscriber growth, DAU, retention cohorts, campaign activations and delivery stats per bot, with subscribers and content isolated between bots so an agency's numbers never blend across clients — see Telegram bot analytics for what each view covers. The measurement discipline above works with any tooling; the panel mostly saves you from rebuilding the cohort query every month.

Getting access

mySkua is in an invite-only private beta, so accounts are opened by request rather than self-serve. If you run Telegram funnels and want the analytics described here on your own bots, join the waitlist and tell us how many bots you operate, which languages your subscribers use and where your traffic comes from. That context is what we use to decide who to bring in next.

Related: Bot analytics · Daily active users · Retention cohort.

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