Paste raw user_id,date activity rows. We bucket each user into the cohort of their first appearance, then count what fraction returns in week 1, week 2, week N. Classic retention triangle — the chart every PM ends up needing eventually.
Each user is assigned to the cohort containing their first activity row. For each subsequent bucket (week 0, week 1, week 2, …), we count how many users from that cohort appear at least once in that bucket. The cell value is active / cohort_size.
The bottom average row weighs each cohort by size, so it's the answer to "of all users we've ever acquired, what % were active N buckets later?" — not a simple mean of percentages.
Tips. Drop duplicate (user, date) rows before pasting if your data is event-level; otherwise they don't matter (we de-dupe per bucket). Dates in YYYY-MM-DD or any format Date.parse understands.