b2KIT

Cohort Analysis Builder

Build customer cohort retention tables with signup date grouping, retention rates by period, and heat map visualization.

Tested tool guide Tested browser tools Checked August 16, 2026

What Cohort Analysis Builder does, with a checked example

A cohort is everyone who signed up in the same calendar period, and this tool shows what fraction of each cohort is still active one, two, or more periods later. You paste signup and activity records, choose a period (week, month, quarter), and get the classic retention table: rows are cohorts, columns are periods since signup, each cell the share of that cohort that returned in that period, drawn as a color-coded heat map. It all runs in the browser, so customer records never leave your machine. The common surprise: the newest cohorts' lower-right cells are empty because those periods have not happened yet, not because retention hit zero.

Worked example

A concrete input and expected output from the current implementation.

Input

customer_id, signup_date, activity_date
c01, 2026-01-08, 2026-01-15
c01, 2026-01-08, 2026-02-02
c01, 2026-01-08, 2026-03-06
c02, 2026-01-11, 2026-01-18
c02, 2026-01-11, 2026-02-04
c03, 2026-01-14, 2026-01-21
c04, 2026-02-02, 2026-02-09
c04, 2026-02-02, 2026-03-01
c04, 2026-02-02, 2026-04-05
c05, 2026-02-05, 2026-02-12
c05, 2026-02-05, 2026-03-03
c06, 2026-02-08, 2026-02-15
c06, 2026-02-08, 2026-03-10
c07, 2026-02-11, 2026-02-18
c08, 2026-03-03, 2026-03-10
c08, 2026-03-03, 2026-04-02
c09, 2026-03-06, 2026-03-13
c10, 2026-03-09, 2026-03-16
c11, 2026-04-01, 2026-04-08
c12, 2026-04-03, 2026-04-10

Expected output

Cohort     Size  P0     P1     P2     P3
Jan 2026   3     100%   67%    33%    -
Feb 2026   4     100%   75%    25%    -
Mar 2026   3     100%   33%    -      -
Apr 2026   2     100%    -     -      -

Each cell is customers active in that period divided by the cohort's original signup count: 2 of the 3 January signups returned in February (2/3 = 67%) and 1 of 3 in March (33%); 3 of the 4 February signups returned in March (75%) but only 1 of 4 in April (25%). The April row has no P1 cell because April is the latest month in the data. Every cohort shows 100% in period 0 only because every customer in this input has at least one activity event during their signup month.

How the result is produced

1

Cohorts and periods

Signup dates are bucketed into the period you pick (week, month, or quarter), and everyone who signed up in the same bucket forms one cohort row. Activity dates are bucketed the same way, and a customer counts toward a cell if they have at least one activity record in that calendar period; several activities in one period still count once. The column index is the number of periods between the activity date and the signup date, so period 0 is always the signup period.

2

Rates and the empty triangle

Each cell divides the distinct customers in that cohort who were active during the period by the full cohort size, so a row reads as the share of the original signups still active N periods later. A cohort only gets cells for periods that have elapsed since it signed up, which is why newer rows are shorter; the lower-right triangle fills in as time passes. Cells are shaded by rate so a drop from one period to the next is visible at a glance.

Good uses

  • Check whether recent signups retain like older ones, which surfaces whether a new onboarding flow, pricing change, or product update moved retention up or down.
  • Run the same activity records split by acquisition channel, plan tier, or region to see which segments produce customers who keep coming back.
  • Read where older cohorts' curves flatten out to estimate how much activity a freshly signed-up cohort is likely to contribute, then use that tail to sanity-check a revenue forecast.

Limits and checks

  • An empty cell in the lower-right triangle is unmeasured, not zero. A March cohort has no month-5 rate until five months have passed, and treating those blanks as 0% makes every recent cohort look catastrophic.
  • The table is only as good as your 'active' definition. Logins, sessions, and purchases produce different retention curves for the same customers, so results built on different event types are not comparable with each other.
  • Small cohorts are noisy. With a few dozen signups, one customer shifting an activity by a week can swing a cell by ten points, and a rate can rise in a later period when someone returns after skipping one. Read trends across rows and columns, not single cells.

Common questions

Why are the newest cohorts' rows mostly empty?

Those are periods that have not happened yet. A cohort that signed up this month cannot have a three-months-later retention rate, so the tool leaves the cell blank instead of writing 0%. Compare only cohorts with the same number of elapsed periods, or re-run the table after more time has passed.

Why does my retention go back up in a later period?

Because each cell counts any activity in that calendar month divided by the original cohort size, a customer who skipped one month and returned the next makes the later period look higher. The effect is strongest in small cohorts. If you need a curve that can only fall, count only customers active in every period since signup (a survival definition) instead of any-activity-in-the-month.

References and verification

The example and behavioral notes were checked against the browser implementation. Standards and primary references below define the relevant format, formula, or platform behavior.

Related Tools