What Is Cohort Analysis? How to Build and Read a Retention Table
Cohort analysis groups customers by their first order and follows them over time. Build a retention table, read the triangle, and track LTV by cohort.
Article summary
TL;DR
Cohort analysis groups customers who started at the same time, usually the month of their first order, and follows each group separately over the following months. Instead of one blended retention rate, you see how every cohort repeats, spends and renews at the same age, so you can tell whether newer customers are better or worse than older ones.
- A cohort is a group of customers who share a starting event, such as a first order or a first paid subscription. Each row of a cohort table is one group; each column is time since that event.
- Read the table three ways: across a row for one cohort's life, down a column to compare cohorts at the same age, and along a diagonal to spot calendar events such as a sale.
- Revenue cohorts divide cumulative revenue by the original cohort size. The result is an LTV curve you can compare with acquisition cost, month by month.
- Tools don't define month 0 the same way: Shopify's period 0 shows repeat orders in the first-order period, Klaviyo leaves the cohorting event out of column 0 by default. Check before you compare.
- Show customer counts next to percentages. A cohort of 50 moves 2 points for each customer, and that is noise, not a trend.
On this page
Cohort analysis groups customers by a shared starting point, usually the month of their first order, and follows each group over time. It answers a question a blended retention rate can't: are the customers you acquire now better or worse than the ones you acquired before? This guide builds a retention cohort table from an order export, shows how to read it, then extends it to revenue, LTV and subscription renewals.
What is cohort analysis?
A cohort is a group of customers who share a starting event within the same period: first order in January, first subscription payment in March. Cohort analysis tracks each group separately, measured by its age (months since the starting event) rather than by calendar date.
That distinction is the whole point. A monthly customer retention rate mixes first-time buyers with customers who have been ordering for two years. If the old customers are loyal and the new ones are not, the average stays flat while the business gets weaker. A cohort table pulls them apart.
| Blended metric | Cohort view | |
|---|---|---|
| Groups customers by | Nobody: one number for everyone | Their starting month, or another shared event |
| Time axis | Calendar months | Months since the starting event |
| Question it answers | How many customers ordered this month? | Of the customers who started in March, how many ordered again in month 1, 2, 3? |
| What it can hide | A weak new cohort behind loyal old customers | Little, if cohorts are large enough |
| Best for | Reporting totals | Judging whether a change (offer, channel, checkout) produced better customers |
For a subscription business, the starting event is the first paid subscription and the outcome is "still subscribed". For a store that sells one-off orders, the starting event is the first order and the outcome is "ordered again". The method is the same.
Acquisition vs behavioral cohorts
Two families of cohorts cover most ecommerce questions. They differ by what puts a customer in the group.
- Acquisition cohortsWhen they started: first order month, first paid subscription, sign-up week. Shows when retention changed.
- Behavioral cohortsWhat they did: subscribed on the first order, bought a second product within 30 days, used a discount. Helps explain why.
- Acquisition cohort plus a cutJanuary customers from paid social vs January customers from email. Compares sources at the same age.
Acquisition cohorts are the default and the right place to start. Group customers by the month of their first order, and each row of your table is one month of new customers. If a newer row is weaker than older rows at the same age, something changed in how you acquired or onboarded them.
Behavioral cohorts group customers by an action, regardless of when they joined. "Customers who bought two products on their first order" against "customers who bought one" is a behavioral cut. These cohorts are correlations, not proof: customers who buy two products may be more engaged to begin with. Use them to form a hypothesis, then test it, for example with a bundle offer at checkout.
In practice you will layer the two: keep the first-order month as the cohort, and split each month by channel, first product or discount. That is covered in what to compare below.
How to build a retention cohort table step by step
You need one export: every order with a customer identifier and a date. Shopify, WooCommerce and most checkouts can produce it. A spreadsheet is enough for a first table.
- Export orders. One row per order: order ID, customer ID or email, order date, net amount. Add the fields you want to compare later: first-order channel, product, discount code.
- Clean the list. Remove test orders, canceled orders and fully refunded orders. Merge guest checkouts and accounts that share an email, or the same person will appear as two customers with one order each.
- Find each customer's cohort. For each row, take the earliest order date of that customer and convert it to the first day of its month.
- Compute the cohort age of each order. Months between the order's month and the cohort month: 0 for orders in the first month, 1 for the next month, and so on.
- Pivot. Rows: cohort month. Columns: cohort age. Values: unique count of customer IDs. Google Sheets pivot tables offer COUNTUNIQUE; in Excel, add the data to the Data Model to get Distinct Count.
- Convert to percentages. Divide each cell by the same row's month 0 count, which is the size of the cohort. Keep the counts in a second table next to it.
Works in Google Sheets and recent versions of Excel. Column letters match the table below.
The helper columns, with data starting in row 2:
| Column | Content | Formula (row 2) |
|---|---|---|
| A | Order ID | from export |
| B | Customer ID or email | from export |
| C | Order date | from export |
| D | Net amount | from export |
| E | Cohort month | =EOMONTH(MINIFS(C:C,B:B,B2),-1)+1 |
| F | Cohort age in months | =(YEAR(C2)-YEAR(E2))*12+MONTH(C2)-MONTH(E2) |
| G | First order? (for later cuts) | =IF(C2=MINIFS(C:C,B:B,B2),1,0) |
Format column E as a month. Column G lets you pull the first order's channel, product or discount into a lookup, so you can split cohorts later.
One customer counts once per period
A customer who orders three times in month 2 is one retained customer in month 2, not three. Count unique customers for retention. Count orders or sum revenue only when you build the revenue table in the next sections.
How to read the cohort triangle
Here is the result for six months of first-order cohorts, pulled at the end of June. Each cell is the share of the cohort that placed at least one order in that month of its life.
Fig. 1Repeat-purchase cohort table
| First order | Customers | Month 1 | Month 2 | Month 3 | Month 4 | Month 5 |
|---|---|---|---|---|---|---|
| January | 1,200 | 22.0% | 15.0% | 13.0% | 11.0% | 10.0% |
| February | 950 | 21.1% | 14.0% | 12.0% | 11.1% | |
| March | 1,400 | 15.0% | 10.0% | 8.0% | ||
| April | 1,100 | 21.0% | 14.0% | |||
| May | 1,050 | 21.0% | ||||
| June | 1,300 |
Each row is one month of new customers
The empty cells are not missing data. The May cohort is one month old, so it only has a month 1. That is why every cohort table is a triangle: the oldest row is the longest, the newest is the shortest. There are three ways to read it.
Across a row: one cohort's life. January loses most of its repeat buyers between month 0 and month 1, then the curve flattens: 22%, 15%, 13%, 11%, 10%. The flat part is your core of returning customers. Where the drop happens tells you where to work: a steep fall after month 0 points at the first order and the weeks after it (delivery, post-purchase emails, the reason to come back).
Down a column: cohorts at the same age. This is where cohort analysis earns its keep. In month 1, every cohort sits between 21% and 22%, except March at 15%. In this example March was the month of a 25% first-order discount. It brought the most new customers of the half-year, and the weakest repeat behavior at every age.
Along a diagonal: the same calendar month. Cells that fall in the same calendar month line up on a diagonal. In the table, June is January's month 5, February's month 4, March's month 3, April's month 2 and May's month 1. A sitewide sale or a stock-out in June would lift or depress that whole diagonal, across all cohorts. Klaviyo's documentation describes the same three readings: horizontal for one cohort over time, vertical for cohorts at the same relative point, diagonal for cohorts at the same absolute point in time.4Klaviyo Help Center, Understanding cohort analysis in Advanced KDP and Marketing Analytics
What the blended number would have said
Across all five cohorts that have a month 1, 1,126 of 5,700 customers ordered again: 19.8%. That single number hides that four cohorts sit at 21% to 22% and one sits at 15%. If you had judged the March promotion on new-customer volume alone, it would have looked like the best month of the half-year.
Two choices change the numbers in the table, so decide them once and keep them:
- Standard or cumulative. The table above is standard: a cell counts customers who ordered in that month. A cumulative table counts customers who have ordered at least once again by that month, so it can only go up. Google Analytics offers both, plus a rolling version that counts only customers active in every period up to that one.2Google Analytics Help, Cohort exploration Never compare a standard table with a cumulative one.
- Months or days. Calendar months have different lengths, and a customer who first ordered on January 31 reaches "month 1" a day later. For fast reorder cycles, 30-day buckets or weeks are fairer. For most stores, months are fine as long as every cohort uses the same rule.
Revenue cohorts and LTV curves
A retention table counts people. A revenue cohort table counts money: the same rows and columns, but each cell is the cohort's revenue, added up from month 0 to that month and divided by the original number of customers in the cohort. The result is cumulative revenue per customer, which is the cohort's customer lifetime value to date.
To build it from the same export, swap the pivot's values from "unique count of customer ID" to "sum of net amount", make each row cumulative, and divide by the cohort size.
Fig. 2Cumulative net revenue per customer
| First order | Month 0 | Month 1 | Month 2 | Month 3 | Month 4 | Month 5 |
|---|---|---|---|---|---|---|
| January | 58 USD | 70 USD | 78 USD | 85 USD | 91 USD | 96 USD |
| February | 57 USD | 68 USD | 76 USD | 83 USD | 89 USD | |
| March | 47 USD | 55 USD | 60 USD | 64 USD | ||
| April | 59 USD | 71 USD | 79 USD |
Divide by the starting cohort, always
Plotted as lines, one per cohort, these are LTV curves. Each curve rises fast in month 0 (the first order), then more slowly as repeat orders come in. A curve that flattens early is a cohort that stopped buying.
The March row starts lower because of the 25% discount, and the gap widens because fewer March customers come back. Now add costs. Suppose acquisition cost is 40 USD per new customer and gross margin is 60%. January's margin per customer is 34.80 USD after month 0 and 42 USD after month 1, so the cohort has paid back its acquisition cost by month 1. March reaches 38.40 USD after three months and still hasn't. The discount may have been worth running, but only if March customers catch up later, and the curve will show it either way. The full payback calculation is in CAC payback formula, and the different ways to estimate lifetime value are in what is CLTV.
Same denominator in every cell
Divide by the number of customers who started the cohort, not by the customers still active that month. Dividing by active customers gives revenue per remaining customer, which goes up as low spenders leave and makes a shrinking cohort look healthier.
Revenue cohorts also feed revenue retention. Stripe's revenue retention by cohort starts from the cohort's starting MRR and shows how much remains at the end of each month; because upgrades count, it can go above 100%.3Stripe Docs, Billing analytics: retention by cohort, active subscribers, subscriber lifetime value How that relates to gross and net revenue retention is in gross vs net retention.
Inside Tagada
Build the funnel once, route every customer to the right offer
Checkout, upsells and subscriptions on one flow, with conditions per country, order or customer.

Subscription cohorts: renewal survival
For subscriptions, the starting event is the first paid subscription and the question is how many subscribers are still active after each renewal. The columns become renewal numbers rather than calendar months, which matters when plans renew at different intervals: a subscriber billed every two months reaches renewal 2 in month 4.
Stripe assigns subscribers to cohorts by the month they first started generating positive MRR, and shows two views: subscriber retention (active subscribers left at the end of each month) and revenue retention (MRR left from the cohort).3Stripe Docs, Billing analytics: retention by cohort, active subscribers, subscriber lifetime value Two settings change who enters a cohort and when. Trials are not active subscribers in Stripe, so trial users join a cohort when they start paying. And you can choose whether a subscriber counts as active at the start of the subscription or only when the first payment is received.3Stripe Docs, Billing analytics: retention by cohort, active subscribers, subscriber lifetime value Pick one and don't switch mid-year, or your cohorts will change size retroactively.
Here is the January cohort from our churn rate calculation guide, 400 subscribers on a monthly plan, with each renewal's losses split by reason:
| Renewal | Active after renewal | Canceled | Payment failed, not recovered | Survival |
|---|---|---|---|---|
| Start | 400 | 100% | ||
| 1 | 352 | 31 | 17 | 88.0% |
| 2 | 324 | 19 | 9 | 81.0% |
| 3 | 305 | 13 | 6 | 76.3% |
| 4 | 293 | 9 | 3 | 73.3% |
Illustrative example. Survival = active after renewal ÷ 400.
Survival compounds: it is the product of each renewal's retention. After renewal 2, 0.88 × (324 ÷ 352) = 0.81. That is why Stripe's own example of a steady 10% monthly churn gives 90%, 81%, 73%, 66% and 59% over five months, not 90%, 80%, 70%.3Stripe Docs, Billing analytics: retention by cohort, active subscribers, subscriber lifetime value
The two loss columns need different fixes. Cancellations are a product or offer question. Failed payments that are never recovered are involuntary churn: renewals that the customer did not choose to stop. Splitting them by renewal shows where they happen: in the example, both kinds of loss are largest at renewal 1, the first charge the customer did not start themselves. Why renewals fail is in subscription payment failures, and how to recover them is in dunning and failed payment recovery.
Fig. 3Where a subscription cohort loses people
- First paid orderSubscriber enters the cohort
- Renewal 1First charge the customer did not start; largest loss in the example
- Retries and dunningStill active until the window closes
- Renewals 2 to 4Losses shrink; the curve flattens
Each renewal is a new test
A subscriber still in dunning at the end of the month counts as active in Stripe (past due subscriptions stay in MRR),3Stripe Docs, Billing analytics: retention by cohort, active subscribers, subscriber lifetime value so the newest cell of each subscription cohort will drop a little once retries end. Compare cohorts on complete renewals only.
What to compare across cohorts
Once the first-order month table works, split each cohort by one attribute of the first order. These cuts answer the questions that move budget, offers and checkout settings.
Acquisition channel
Paid social, search, email, affiliates. Does one channel bring customers who never come back? Compare month 1 to month 3 repeat rates, and LTV against what each channel costs.
First product
Customers who started with a consumable versus a one-time purchase, a bundle versus a single item. The first product often predicts the reorder cycle better than anything else.
Discount on the first order
Full price versus a first-order code, or 10% versus 25%. Discount cohorts often start bigger and retain differently. The cumulative revenue curve tells you whether the discount paid for itself.
First-order month
Holiday cohorts, launch months and sale months behave differently. Compare a November cohort with last November's before you compare it with October.
Subscription or one-time
Customers who subscribed on their first order versus those who bought once. Measure both on repeat orders and revenue, not on subscription status alone.
Split by one attribute at a time. Each split divides the cohort, and a January cohort of 1,200 customers split by five channels and three products leaves cells of a few dozen people. For how to define the segments themselves, see how to segment customers.
Tools that produce cohort reports
You don't have to build every table by hand. Four tools that ecommerce and subscription brands already use produce cohort reports, each with its own definition of a cohort and of month 0.
| Tool | Cohort defined by | Time buckets | What the cells can show | Watch out for |
|---|---|---|---|---|
| Shopify Analytics, Customer cohort analysis | Date of the customer's first order1Shopify Help Center, Customers reports: Customer cohort analysis | Weeks, months or quarters1Shopify Help Center, Customers reports: Customer cohort analysis | Number of customers, retention rate, gross sales, net sales, average order value; heatmap or retention curve; optional spend projections1Shopify Help Center, Customers reports: Customer cohort analysis | Period 0 shows repeat orders placed in the same period as the first order1Shopify Help Center, Customers reports: Customer cohort analysis, so it is not 100% |
| Google Analytics 4, Cohort exploration | An inclusion criterion (first visit, an event) and a return criterion2Google Analytics Help, Cohort exploration | Daily, weekly (Sunday to Saturday) or monthly2Google Analytics Help, Cohort exploration | Any metric you pick; standard, rolling or cumulative calculation; breakdown by one dimension2Google Analytics Help, Cohort exploration | Up to 60 cohorts and the top 15 values of a breakdown; small groups can be hidden by thresholding2Google Analytics Help, Cohort exploration. Counts users seen by Analytics, not customers in your order system |
| Stripe Billing analytics, Retention by cohort | Month the subscriber first generated positive MRR3Stripe Docs, Billing analytics: retention by cohort, active subscribers, subscriber lifetime value | Months | Subscriber retention and revenue retention3Stripe Docs, Billing analytics: retention by cohort, active subscribers, subscriber lifetime value | Subscriptions only; revenue retention can exceed 100%3Stripe Docs, Billing analytics: retention by cohort, active subscribers, subscriber lifetime value |
| Klaviyo, Cohort analysis | A cohorting event (entry) and a reporting event (what is measured)4Klaviyo Help Center, Understanding cohort analysis in Advanced KDP and Marketing Analytics | Months or weeks4Klaviyo Help Center, Understanding cohort analysis in Advanced KDP and Marketing Analytics | Conversions, profiles or conversion value, as totals, averages or percent4Klaviyo Help Center, Understanding cohort analysis in Advanced KDP and Marketing Analytics | Full builder requires Advanced KDP or Marketing Analytics, a separate subscription4Klaviyo Help Center, Understanding cohort analysis in Advanced KDP and Marketing Analytics; the standard Metrics tab offers cohorts for conversion metrics only, over the last 12 calendar months5Klaviyo Help Center, Understanding cohort analysis in the metrics tab |
Klaviyo also excludes the cohorting event from column 0 by default,4Klaviyo Help Center, Understanding cohort analysis in Advanced KDP and Marketing Analytics so a first-order cohort in Klaviyo shows repeat orders in column 0, close to Shopify's logic and unlike the spreadsheet table above, where month 0 is 100%. Put two reports side by side only after checking how each defines month 0. For tying GA4 events to orders in the first place, see GA4 ecommerce events.
Spreadsheets remain the most flexible option for a first table, and a SQL query over your order database does the same job at scale: the logic is the same five columns, grouped by cohort month and cohort age.
Cohort analysis mistakes to avoid
- A whole column dips or spikes, across all cohortsYou are reading calendar time as cohort time: a sale or stock-out fell on a diagonalCheck the diagonal for that calendar month before blaming the cohorts
- The newest cohort looks much worse, or better, in its latest cellThe period isn't over: the data was pulled mid-month, or renewals are still in dunningCompare complete periods only, or grey out the last cell
- A cohort jumps 5 points one month and drops 6 the nextThe cohort is too small: in a group of 50, one customer is 2 pointsShow counts next to percentages; merge into quarters
- Revenue per customer rises while customers leaveYou divided by active customers instead of the starting cohortDivide every cell by the cohort size at month 0
- Shopify, Klaviyo and your spreadsheet disagreeMonth 0 and the cohort event are defined differentlyWrite the definition above each table; compare like with like
- One cohort is clearly stronger after a changeA real difference, or a different customer mixCheck the channel and offer mix of that cohort, then test the change
A few more that don't show up as a pattern in the table:
- Mixing calendar and cohort time in one chart. "Repeat rate in June" is a calendar metric. "Repeat rate in month 3" is a cohort metric. Plotting cohort curves against calendar months on the x-axis stretches each line differently and makes old cohorts look like they never had a first month.
- Duplicate customers. Guest checkouts with different emails, or a new account per order, turn one loyal customer into several one-time buyers and depress every cell. Clean identities before you build the table.
- Refunds and cancellations left in. A fully refunded first order still creates a cohort member. Remove it, or the cohort is bigger than the customers you actually kept.
- Changing the definition mid-year. Switching from "first order" to "first paid order", or from start of subscription to first payment received, resizes past cohorts. Keep the old table if you change, and say so.
- Reading correlation as cause. A behavioral cohort that retains better was different before it took the action. Use the table to choose what to test, then test it.
Where Tagada fits
How Tagada helps
Checkout and subscriptions in one place
Cohort tables are only as good as the order and renewal data behind them. Tagada runs the checkout (one-click upsells, order bumps, A/B tests, Apple Pay and Google Pay) and subscriptions (trials, billing cycles, dunning and automatic retries) in the same system, with server-side tracking to Meta, Google and TikTok. Payments can be routed across TagadaPay and processors such as Stripe, NMI and Airwallex, with a cascade to another processor when one is down or times out, so a processor outage doesn't turn into involuntary losses in your subscription cohorts. A renewal the bank declines is retried under the card network rules, not sent to another processor. Pricing is on the pricing page.
Whatever tool produces your table, the method stays the same: pick one starting event, count each customer once per period, divide by the original cohort size, read down the columns before you read the totals, and keep the counts visible next to the percentages.
Frequently asked questions
What is cohort analysis in simple terms?
What is an example of cohort analysis?
What is the difference between cohort analysis and segmentation?
How do you calculate cohort retention?
What is the difference between acquisition and behavioral cohorts?
How big should a cohort be?
Sources
Checked October 14, 2026- Shopify Help Center, Customers reports: Customer cohort analysis
- Google Analytics Help, Cohort exploration
- Stripe Docs, Billing analytics: retention by cohort, active subscribers, subscriber lifetime value
- Klaviyo Help Center, Understanding cohort analysis in Advanced KDP and Marketing Analytics
- Klaviyo Help Center, Understanding cohort analysis in the metrics tab
Tagada
Run checkout and subscriptions from one place
Funnels, one-click upsells, subscription billing and payment routing, on one customer record.
- 01Create your free account
- 02Connect your store or build a checkout
- 03Launch funnels, upsells and subscriptions
