TapCub is live — analytics, insights and live chat, free on one platform

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
Cohort analysis

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.

CohortUsersWeek 0Week 1Week 2Week 3Week 4Week 5
Sep 11,840100%44.0%36.0%32.0%30.0%29.0%
Sep 82,012100%45.0%37.0%33.0%31.0%
Sep 151,966100%47.0%39.0%35.0%
Sep 222,130100%50.0%41.0%
Sep 292,205100%52.0%
Oct 62,310100%
Weighted average100%47.8%38.3%33.4%30.5%29.0%

Retention curves

Retention by periodWeighted average: Week 0 100%, Week 1 47.8%, Week 2 38.3%, Week 3 33.4%, Week 4 30.5%, Week 5 29%; Sep 8: Week 0 100%, Week 1 45%, Week 2 37%, Week 3 33%, Week 4 31%, Week 5 —; Sep 15: Week 0 100%, Week 1 47%, Week 2 39%, Week 3 35%, Week 4 —, Week 5 —; Sep 22: Week 0 100%, Week 1 50%, Week 2 41%, Week 3 —, Week 4 —, Week 5 —Retention by periodWeighted averageSep 8Sep 15Sep 22Week 0 · Weighted average: 100%Week 1 · Weighted average: 47.8%Week 2 · Weighted average: 38.3%Week 3 · Weighted average: 33.4%Week 4 · Weighted average: 30.5%Week 5 · Weighted average: 29%Week 0 · Sep 8: 100%Week 1 · Sep 8: 45%Week 2 · Sep 8: 37%Week 3 · Sep 8: 33%Week 4 · Sep 8: 31%Week 0 · Sep 15: 100%Week 1 · Sep 15: 47%Week 2 · Sep 15: 39%Week 3 · Sep 15: 35%Week 0 · Sep 22: 100%Week 1 · Sep 22: 50%Week 2 · Sep 22: 41%Weighted average0%20%40%60%80%100%Week 0Week 1Week 2Week 3Week 4Week 5
CSV
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.02

Counts and percentages for every cell, plus the weighted average row.

Runs entirely in your browser. Nothing you type here is uploaded or stored by TapCub.

Version v1.0Updated Update history

Read the result

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.

How to use it

From an export to a cohort table

Most analytics tools, databases and CRMs can export the three columns this needs.

  1. 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. 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. 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. 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.

Formula

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%

Worked example

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.

Weighted average by week
WeekCohorts completeReturned ÷ usersWeighted average
15 (Sep 1 – Sep 29)4,851 ÷ 10,15347.8%
24 (Sep 1 – Sep 22)3,046 ÷ 7,94838.3%
33 (Sep 1 – Sep 15)1,941 ÷ 5,81833.4%
42 (Sep 1, Sep 8)1,176 ÷ 3,85230.5%
51 (Sep 1)534 ÷ 1,84029.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.

Common mistakes

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.

FAQ

Cohort 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.

Changelog

Update history

New features, fixes and data refreshes for this tool, newest first.

  1. · 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

See your data clearly. Find your growth.

Every click, backed by data. Install one line of code and see your first numbers in a minute.

No credit card · Free plans for analytics and chat · Cookieless analytics