Free tool Cohort analysis: build a retention table from your data
Paste one row per activity (user, sign-up date, activity date) or a ready cohort table, and get the retention triangle with darker cells for higher retention, a weighted average for every period, a retention curve and a CSV. Periods that have not finished yet are marked, not counted as zero.
- Retention triangle heatmap
- N-day, range or unbounded
- Runs locally
Paste rows, get the triangle
Two inputs work. Raw rows: user_id, signup_date, activity_date, one row per active day (or just user_id, date — the first date becomes the sign-up). Cohort table: cohort, users, period 0, period 1… as counts or percentages. The format is detected automatically.
Dates as 2026-09-07 or 2026/9/7. Include a row for each sign-up itself (activity date = sign-up date), or people who never came back are missing from the cohort.
Raw rows only. Weeks start on Monday; a user’s week 1 is days 7–13 after their own sign-up. Months are calendar months.
Raw rows only. See “Formula” below for the three definitions.
What was read
- NoteRead a cohort table with 6 cohorts. The first number column equals the cohort size, so it is period 0.
Cohorts
6
Users in cohorts
12,463
Period 1 retention
47.8%
Weighted average
Latest complete period
29.0%
Weighted average
Retention triangle
Rows are cohorts, columns are periods since sign-up. Darker = higher retention. Cells marked * are still in progress and are left out of the average.
| Cohort | Users | Week 0 | Week 1 | Week 2 | Week 3 | Week 4 | Week 5 |
|---|---|---|---|---|---|---|---|
| Sep 1 | 1,840 | 100% | 44.0% | 36.0% | 32.0% | 30.0% | 29.0% |
| Sep 8 | 2,012 | 100% | 45.0% | 37.0% | 33.0% | 31.0% | |
| Sep 15 | 1,966 | 100% | 47.0% | 39.0% | 35.0% | ||
| Sep 22 | 2,130 | 100% | 50.0% | 41.0% | |||
| Sep 29 | 2,205 | 100% | 52.0% | ||||
| Oct 6 | 2,310 | 100% | |||||
| Weighted average | 100% | 47.8% | 38.3% | 33.4% | 30.5% | 29.0% |
Retention curves
cohort,users,period_0,period_1,period_2,period_3,period_4,period_5,period_0_pct,period_1_pct,period_2_pct,period_3_pct,period_4_pct,period_5_pct
Sep 1,1840,1840,810,662,589,552,534,100,44.02,35.98,32.01,30,29.02
Sep 8,2012,2012,905,744,664,624,,100,44.98,36.98,33,31.01,
Sep 15,1966,1966,924,767,688,,,100,47,39.01,34.99,,
Sep 22,2130,2130,1065,873,,,,100,50,40.99,,,
Sep 29,2205,2205,1147,,,,,100,52.02,,,,
Oct 6,2310,2310,,,,,,100,,,,,
weighted_average,,,,,,,,100,47.78,38.32,33.36,30.53,29.02Counts and percentages for every cell, plus the weighted average row.
Version v1.0Updated Update history
How to read a retention triangle
Each row is a cohort — people who signed up in the same period — and each column is how many periods have passed since. The empty corner is the future.
Across a row: one cohort ageing
Sep 1 goes 44% → 36% → 32% → 30% → 29%. The drop slows: the cohort is settling on the users who found lasting value. A row that keeps falling towards zero means nobody has yet.
Down a column: cohorts compared at the same age
Week 1 rises from 44% to 52% across the five cohorts that have it. Later sign-ups come back more — what onboarding or acquisition change shipped in September is working.
The weighted average row
All returners ÷ all users, for the cohorts that have finished that period. Large cohorts count more, as they should; it is the same rule as the retention calculator.
The * cells and the empty corner
A cohort that started last week cannot have week-4 retention. Empty means “not yet”, and * means “in progress”; neither is read as zero or included in the average.
A triangle is only comparable to another one built the same way: same start event, same return event, same period, same retention type.
From an export to a cohort table
Most analytics tools, databases and CRMs can export the three columns this needs.
-
1
Export activity
One row per user per active day: user ID, sign-up date, activity date. A SQL
SELECT DISTINCT user_id, signup_date, DATE(event_time)is enough. Or paste a cohort table you already have. -
2
Pick the period
Daily cohorts for apps used every day, weekly for most products, monthly for B2B and subscriptions. Each cohort should have at least a few hundred users.
-
3
Pick the retention type
N-day for products with a rhythm; range when “came back at some point” is the honest question; unbounded to see who ever came back.
-
4
Read, then export
Read down the columns for trends, across the rows for the plateau. Download the CSV or switch cells to counts to check the maths.
Cohorts, periods and three retention types
The definitions match the TapCub glossary entries for cohort and retention rate. Period 0 is the sign-up period itself, so it is always 100%.
- Cohort: everyone whose sign-up date falls in the same day, week (Monday to Sunday) or calendar month. A user stays in their cohort for good.
- Period of an activity: days since that user’s sign-up (day cohorts), whole weeks since sign-up (week cohorts), or calendar months between sign-up and activity (month cohorts).
- Retention in period N = users counted for period N ÷ users in the cohort.
- A cell is complete once every user in the cohort has lived through period N by the last date in the data; otherwise it is marked * and left out of the average.
N-day (classic)
active in period N ÷ cohort size
Strict; the curve can go up and down. The usual “day-7” or “week-1 retention”.
Range
active in any of periods 1…N ÷ cohort size
Cumulative, so it never falls. Suits products people use occasionally.
Unbounded (rolling)
active in period N or any later period ÷ cohort size
Answers “did they ever come back after N?”. Recent cells are understated because the future hasn’t happened yet.
Weighted average
Σ returned in period N ÷ Σ size of cohorts complete for N
Sample week 2: 3,046 ÷ 7,948 = 38.3%
The default table, period by period
Six weekly cohorts. Oct 6 has only week 0, so it adds nothing to any average after week 0; Sep 1 is the only cohort with week 5.
| Week | Cohorts complete | Returned ÷ users | Weighted average |
|---|---|---|---|
| 1 | 5 (Sep 1 – Sep 29) | 4,851 ÷ 10,153 | 47.8% |
| 2 | 4 (Sep 1 – Sep 22) | 3,046 ÷ 7,948 | 38.3% |
| 3 | 3 (Sep 1 – Sep 15) | 1,941 ÷ 5,818 | 33.4% |
| 4 | 2 (Sep 1, Sep 8) | 1,176 ÷ 3,852 | 30.5% |
| 5 | 1 (Sep 1) | 534 ÷ 1,840 | 29.0% |
The simple mean of the four week-2 rates (36.0%, 37.0%, 39.0%, 41.0%) is 38.2%, close here because the cohorts are similar in size. With one big campaign cohort the two diverge a lot.
Where cohort tables go wrong
The arithmetic is simple; the inputs are where it breaks.
Leaving out people who never returned
If the export only has return visits, users with no return are missing and retention looks far too high. Include the sign-up row for everyone.
Reading the edge as a drop
The newest cells are partial. A “fall” in the last column is often just a week that hasn’t ended — that is what the * marks.
Changing the definition mid-table
N-day and range retention for the same users can differ by half. So can “any visit” versus “made a purchase” as the return event.
Averaging the percentages
A 90% cohort of 10 and a 40% cohort of 2,000 do not average to 65%. Weight by cohort size, as the average row does.
Cohort tables built from your events
No export, no spreadsheet: TapCub builds the same triangle from the events your site, app or mini-program already sends.
Retention report
Pick a start event and a return event; switch between classic N-day and range retention. Incomplete cohorts stay blank, never zero.
Learn moreSegments as cohorts
Compare retention for organic and paid sign-ups, or any segment you define.
Learn moreGrowth board
Week-1 retention next to acquisition, activation, revenue and referral, with alerts when it moves.
Learn moreCohort analysis questions
Still have a question?
Chat with the team behind TapCub — we usually reply within a few hours on business days.
What is cohort analysis?
Grouping users by when they started — sign-up week, first purchase month — and comparing how each group behaves over the same time since starting. A retention triangle is the most common form. See cohort.
How do I do a cohort analysis in Excel or Google Sheets?
Export user ID, sign-up date and activity date, paste them here, and copy the CSV back into your sheet. Doing it with formulas means a COUNTIFS per cell plus a helper column for the period number.
What is the difference between this and the retention calculator?
The retention calculator takes one pair of numbers per cohort — new users and returners — for one period. This tool builds every period for every cohort, from raw rows or a full table.
Why is period 0 always 100%?
Period 0 is the sign-up period, and every member of a cohort was active in it by definition. Retention starts at period 1.
Which retention type should I use?
N-day for products used on a rhythm, range for products used occasionally, unbounded to see whether people ever came back. Whichever you choose, keep it when comparing cohorts.
How many rows can I paste?
Tens of thousands of activity rows are fine in a modern browser. The table shows up to 60 cohorts and 24 periods; choose a longer period if you have more.
Is my user data uploaded?
No. Everything is computed in this page. User IDs never leave your browser — you can also replace them with row numbers before pasting.
Update history
New features, fixes and data refreshes for this tool, newest first.
-
· v1.0
LaunchedFirst release.
Missing something or found an error? Tell us — requests that come up often go into the next update. All tool updates
Let the cohort table update itself
Connect your site, app or mini-program once and retention is computed from live events, per segment and per channel.