Client numbers are growing, and revenue looks healthy at first glance, but then you look more closely and spot a real issue: half the clients from eight months ago are no longer active. Not churned in any dramatic way; they just stopped renewing, stopped replying, and slowly disappeared.
The top-line numbers hid that problem. Revenue kept going up, but your new clients were only covering up a retention issue that had been building for months.
This is where cohort analysis helps. It does not replace your regular reports. It shows you something those reports often miss: not just how many clients you have today, but how many clients from a specific signup month are still with you over time.
This guide walks through building one in Google Sheets using live QuickBooks Online data. By the end, you'll have a clear picture of where your client relationships are actually holding up.
What is Cohort Analysis?
Cohort analysis is a way to group clients based on when they first signed up, then track what happens to them over time.
It answers one clear question: of the clients who joined in period X, how many were still active in period X+1, X+2, and X+3?
That is the basic idea. You are not grouping clients by what they bought, how much they spent, or where they came from. You are grouping them by when they started, then looking at how long they stayed. That is where the value comes in, and once you compare one cohort to another, patterns start to show up.
And those patterns matter. Bain & Company found that even a 5% increase in customer retention can raise profits by 25% to 95%.
For example, your January clients may still show a strong retention rate after three months, while your April clients may drop off much faster. That tells you something changed.
Maybe your pricing shifted. Maybe a key staff member left. Maybe a campaign brought in clients who were never the right fit to begin with. Cohort analysis will not tell you the exact cause. But it will show you where the problem started. That is what makes it useful. It helps you catch patterns early, so you know where to look and what questions to ask next.
Once you understand what cohort analysis shows and why it matters, the next step is getting your data ready. You cannot track retention without clean, structured data, and once that part is in place, the rest becomes much easier to build and maintain.
Getting your data into Google Sheets
Before anything else, you need transaction-level client data in your sheet. The minimum columns required are: Customer ID (column A), Signup Date, and Purchase Date. Channel, region, and product line are optional but useful if you want to slice the data later by acquisition source or service type.
If you’re pulling this from QuickBooks Online manually, exporting reports, downloading CSVs, and reformatting date columns, you already know how that goes. It takes longer than it should, the headers never match what you expect, and within two months, nobody’s bothering to keep it current.
G-Accon connects Google Sheets directly to your QuickBooks Online account and syncs the data automatically. You connect your QBO account, select the report type, and the data lands in your sheet in the right structure. No exports, no reformatting. When you want fresh data, you click refresh.
Once your raw data is in, it should look something like this:
QBO_Cohort_Analysis
Share
G-Accon syncs this data automatically from QuickBooks Online — no manual CSV export needed
|
A |
B |
C |
D |
E |
F |
G |
H |
I |
| 1 |
Customer ID |
Customer Name |
Signup Date |
Purchase Date |
Product / Service |
Region |
Channel |
Invoice Amount ($) |
Payment Status |
| 2 |
C001 |
Apex Consulting |
10/01/2025 |
10/01/2025 |
Accounting — Monthly |
North |
Referral |
$600 |
Paid |
| 3 |
C001 |
Apex Consulting |
10/01/2025 |
15/02/2025 |
Accounting — Monthly |
North |
Referral |
$600 |
Paid |
| 4 |
C001 |
Apex Consulting |
10/01/2025 |
14/03/2025 |
Accounting — Monthly |
North |
Referral |
$600 |
Paid |
| 5 |
C002 |
Bright & Co. |
15/01/2025 |
15/01/2025 |
Payroll Processing |
South |
Paid Ads |
$400 |
Paid |
| 6 |
C002 |
Bright & Co. |
15/01/2025 |
18/02/2025 |
Payroll Processing |
South |
Paid Ads |
$400 |
Paid |
| 7 |
C003 |
CoreBridge LLC |
20/01/2025 |
20/01/2025 |
Tax Preparation |
East |
Direct |
$750 |
Paid |
| 8 |
C003 |
CoreBridge LLC |
20/01/2025 |
22/02/2025 |
Advisory Add-on |
East |
Direct |
$300 |
Paid |
| 9 |
C004 |
Delta Group |
05/02/2025 |
05/02/2025 |
Accounting — Monthly |
North |
Referral |
$550 |
Paid |
| 10 |
C004 |
Delta Group |
05/02/2025 |
07/03/2025 |
Accounting — Monthly |
North |
Referral |
$550 |
Paid |
| 11 |
C005 |
Ember Works |
18/02/2025 |
18/02/2025 |
Bookkeeping — Weekly |
West |
QBO Partner |
$400 |
Paid |
| 12 |
C006 |
Fintech Labs |
28/02/2025 |
28/02/2025 |
Tax Preparation |
South |
Paid Ads |
$700 |
Paid |
| 13 |
C006 |
Fintech Labs |
28/02/2025 |
30/03/2025 |
Advisory Add-on |
South |
Paid Ads |
$300 |
Paid |
| 14 |
C007 |
Greenfield Inc. |
04/03/2025 |
04/03/2025 |
Accounting — Monthly |
North |
Referral |
$600 |
Paid |
| 15 |
C007 |
Greenfield Inc. |
04/03/2025 |
08/04/2025 |
Accounting — Monthly |
North |
Referral |
$500 |
Paid |
| 16 |
C008 |
Harbor Analytics |
20/03/2025 |
20/03/2025 |
Payroll Processing |
South |
Paid Ads |
$400 |
Paid |
| 17 |
C009 |
Irongate LLC |
01/04/2025 |
01/04/2025 |
Bookkeeping — Weekly |
East |
Direct |
$350 |
Paid |
| 18 |
C010 |
Jetstream Co. |
12/04/2025 |
12/04/2025 |
Tax Preparation |
West |
QBO Partner |
$800 |
Paid |
| 19 |
C010 |
Jetstream Co. |
12/04/2025 |
15/05/2025 |
Advisory Add-on |
West |
QBO Partner |
$300 |
Pending |
| 20 |
C011 |
Kestrel Media |
22/04/2025 |
22/04/2025 |
Accounting — Monthly |
North |
Referral |
$500 |
Paid |
| … |
More rows below |
COLUMN GUIDE
| Column |
Description |
| Customer ID |
Unique identifier per client, pulled directly from QBO. Used as the key field in COUNTIFS formulas later. |
| Customer Name |
Client name as it appears in QuickBooks Online. Useful for manual QA and readability. |
| Signup Date |
The date this client was first created in QBO. This is the basis for the Cohort Month column added in Step 1. |
| Purchase Date |
Date of each individual invoice or transaction. Used to calculate Transaction Month and Period Number. |
| Product / Service |
QBO product or service line item. Optional for basic cohort analysis — essential if you want to filter by service type. |
| Region |
Geographic segment. Useful for segment-based cohort slicing in later analysis. |
| Channel |
Acquisition source (Referral, Paid Ads, Direct, QBO Partner). Key variable for comparing cohort quality by channel. |
| Invoice Amount |
Revenue per transaction. Used if you want to extend this analysis from customer retention to revenue retention. |
| Payment Status |
Paid or Pending. Filter to Paid-only rows before building your cohort table to avoid counting unpaid invoices as active. |
Filter to Payment Status = Paid before building your cohort table.
Before moving forward, check two things. First, make sure your Signup Date and Purchase Date columns are formatted as actual dates, not text that looks like dates. Real dates align right in their cells. Text dates align left and will cause your formulas to fail.
Second, and this one matters more than it sounds- check for customers with multiple different signup dates across their rows. If C001 shows January 10th in one row and February 5th in another, those rows land in different cohorts, which quietly corrupts your retention numbers. Add a helper column, “Clean Signup Date,” and use:
This enforces one signup date per Customer ID. Every downstream formula should reference this clean column, not the raw one.
Step 1: Group each client by their signup month
Cohort analysis works at the month level. A client who signed up on January 4th and a client who signed up on January 29th belong to the same cohort; you’re asking the same question about both of them.
In column J, add a header: Cohort Month. In J2, use this formula:
=DATE(YEAR(I2),MONTH(I2),1) |
This takes the cleaned signup date and resets it to the first day of that month. Using the Clean Signup Date column, here is what makes the MINIFS cleanup carry through.
|
Important: Do not wrap this in a TEXT() function to format it as “Jan 2025”. That converts your date into a plain text string, and later, when you try to calculate months between dates, the formula will break. Keep column J as a real date and format it visually:
Format → Number → Custom date and time → MMM YYYY.
|
Drag the formula down through all your rows.
QBO_Cohort_Analysis
Share
J2
fx=DATE(YEAR(I2),MONTH(I2),1)
Group each client by signup month, keep as a real date, format column as MMM YYYY. Do NOT use TEXT()
|
A |
B |
C |
D |
E |
F |
G |
H |
I |
J |
| 1 |
Customer ID |
Customer Name |
Signup Date |
Purchase Date |
Product / Service |
Region |
Channel |
Invoice Amt |
Clean Signup Date |
Cohort Month |
| 2 |
C001 |
Apex Consulting |
10/01/2025 |
10/01/2025 |
Accounting — Monthly |
North |
Referral |
$600 |
10/01/2025 |
Jan 2025 |
| 3 |
C001 |
Apex Consulting |
10/01/2025 |
15/02/2025 |
Accounting — Monthly |
North |
Referral |
$600 |
10/01/2025 |
Jan 2025 |
| 4 |
C001 |
Apex Consulting |
10/01/2025 |
14/03/2025 |
Accounting — Monthly |
North |
Referral |
$600 |
10/01/2025 |
Jan 2025 |
| 5 |
C002 |
Bright & Co. |
15/01/2025 |
15/01/2025 |
Payroll Processing |
South |
Paid Ads |
$400 |
15/01/2025 |
Jan 2025 |
| 6 |
C002 |
Bright & Co. |
15/01/2025 |
18/02/2025 |
Payroll Processing |
South |
Paid Ads |
$400 |
15/01/2025 |
Jan 2025 |
| 7 |
C003 |
CoreBridge LLC |
20/01/2025 |
20/01/2025 |
Tax Preparation |
East |
Direct |
$750 |
20/01/2025 |
Jan 2025 |
| 8 |
C004 |
Delta Group |
05/02/2025 |
05/02/2025 |
Accounting — Monthly |
North |
Referral |
$550 |
05/02/2025 |
Feb 2025 |
| 9 |
C005 |
Ember Works |
18/02/2025 |
18/02/2025 |
Bookkeeping — Weekly |
West |
QBO Partner |
$400 |
18/02/2025 |
Feb 2025 |
| 10 |
C006 |
Fintech Labs |
28/02/2025 |
28/02/2025 |
Tax Preparation |
South |
Paid Ads |
$700 |
28/02/2025 |
Feb 2025 |
| 11 |
C007 |
Greenfield Inc. |
04/03/2025 |
04/03/2025 |
Accounting — Monthly |
North |
Referral |
$600 |
04/03/2025 |
Mar 2025 |
| … |
More rows below |
Format column J as MMM YYYY via Format → Number → Custom date and time
Every client now has a cohort label. Clients with multiple purchases appear in multiple rows but carry the same Cohort Month, because it’s tied to their signup date, not their purchase date.
Step 2: Calculate how far along each client is
The second column tracks each client’s position in their lifecycle at the time of each transaction. You’re not just asking “did they come back?” but “how many months after joining did they come back?”
In column K, add: Transaction Month. In K2:
=DATE(YEAR(C2),MONTH(C2),1) |
Apply the same MMM YYYY custom date format, keep it as a real date, just display it as text. Then, in column L, add: Period Number. In L2:
=IF(C2<I2,"",DATEDIF(J2,K2,"m")) |
The IF check prevents negative period numbers from data entry errors. Period 0 = signup month. Period 1 = one month later. Period 2 = two months later.
QBO_Cohort_Analysis
Share
L2
fx=IF(C2<I2,"",DATEDIF(J2,K2,"m"))
Period 0 = signup month • Period 1 = one month later • Period 2 = two months later
|
A |
B |
C |
··· |
I |
J |
K |
L |
| 1 |
Customer ID |
Customer Name |
Purchase Date |
··· |
Clean Signup Date |
Cohort Month |
Transaction Month |
Period Number |
| 2 |
C001 |
Apex Consulting |
10/01/2025 |
··· |
10/01/2025 |
Jan 2025 |
Jan 2025 |
0 |
| 3 |
C001 |
Apex Consulting |
15/02/2025 |
··· |
10/01/2025 |
Jan 2025 |
Feb 2025 |
1 |
| 4 |
C001 |
Apex Consulting |
14/03/2025 |
··· |
10/01/2025 |
Jan 2025 |
Mar 2025 |
2 |
| 5 |
C002 |
Bright & Co. |
15/01/2025 |
··· |
15/01/2025 |
Jan 2025 |
Jan 2025 |
0 |
| 6 |
C002 |
Bright & Co. |
18/02/2025 |
··· |
15/01/2025 |
Jan 2025 |
Feb 2025 |
1 |
| 7 |
C003 |
CoreBridge LLC |
20/01/2025 |
··· |
20/01/2025 |
Jan 2025 |
Jan 2025 |
0 |
| 8 |
C004 |
Delta Group |
05/02/2025 |
··· |
05/02/2025 |
Feb 2025 |
Feb 2025 |
0 |
| 9 |
C004 |
Delta Group |
07/03/2025 |
··· |
05/02/2025 |
Feb 2025 |
Mar 2025 |
1 |
| 10 |
C005 |
Ember Works |
18/02/2025 |
··· |
18/02/2025 |
Feb 2025 |
Feb 2025 |
0 |
| 11 |
C007 |
Greenfield Inc. |
04/03/2025 |
··· |
04/03/2025 |
Mar 2025 |
Mar 2025 |
0 |
| 12 |
C007 |
Greenfield Inc. |
08/04/2025 |
··· |
04/03/2025 |
Mar 2025 |
Apr 2025 |
1 |
| … |
More rows below |
DATEDIF does not appear in autocomplete; you'll need to type it manually. It works correctly.
DATEDIF doesn’t appear in Sheets’ autocomplete suggestions; it’s a legacy function that Google never surfaced in the UI. Type it manually, and it works perfectly.
Step 3: Build the cohort count table
Create a new sheet; call it “Cohort Pivot.” Cohort months run down the rows. Period numbers run across the columns (0, 1, 2, 3…).
Each cell answers: how many unique clients from this cohort were active in this period? A client with three transactions in the same month should count once, not three times. In B2 (January cohort, Period 0):
=COUNTA(UNIQUE(FILTER(Sheet1!$A:$A,(Sheet1!$J:$J=$A2)*(Sheet1!$L:$L=B$1)))) |
FILTER pulls the matching Customer IDs, UNIQUE deduplicates them, COUNTA counts what’s left. Write it once in B2, drag across all period columns, and down all cohort rows.
|
On scale: COUNTA(UNIQUE(FILTER())) works well up to a few thousand rows. On very large datasets, it can slow Sheets down.
|
QBO_Cohort_Analysis
Share
B2
fx=COUNTA(UNIQUE(FILTER(Sheet1!$A:$A,(Sheet1!$J:$J=$A2)*(Sheet1!$L:$L=B$1))))
UNIQUE() deduplicates — each client counts once per period regardless of how many transactions they made
|
A |
B |
C |
D |
E |
F |
| 1 |
Cohort Month |
Period 0 |
Period 1 |
Period 2 |
Period 3 |
Period 4 |
| 2 |
Jan 2025 |
7 |
4 |
3 |
2 |
1 |
| 3 |
Feb 2025 |
6 |
3 |
2 |
1 |
— |
| 4 |
Mar 2025 |
5 |
3 |
2 |
— |
— |
| 5 |
Apr 2025 |
4 |
2 |
— |
— |
— |
| … |
More rows below |
— = data not yet available. Leave blank — do not fill with zero.
Leave future periods blank, not zero. Blank means “not yet.” Zero means “no one came back.” They colour differently in the heatmap.
Step 4: Convert counts to retention rates
A drop from 5 clients to 3 means something very different if Period 0 started with 6 versus 60. You need percentages to compare cohorts fairly.
Create a third sheet, “Retention Rates.” For C2 (January cohort, Period 1):
=IF('Cohort Pivot'!$B2=0,"",'Cohort Pivot'!C2/'Cohort Pivot'!$B2) |
The $B2 reference always pulls Period 0 for that cohort. The IF check keeps cells blank where Period 0 is missing rather than throwing a division error. Drag across all periods and down all rows, then format as a percentage.
QBO_Cohort_Analysis
Share
C2
fx=IF('Cohort Pivot'!$B2=0,"",'Cohort Pivot'!C2/'Cohort Pivot'!$B2)
Divide each period count by Period 0 — IF check prevents division errors where Period 0 is missing
|
A |
B |
C |
D |
E |
F |
| 1 |
Cohort Month |
Period 0 |
Period 1 |
Period 2 |
Period 3 |
Period 4 |
| 2 |
Jan 2025 |
100% |
57% |
43% |
29% |
14% |
| 3 |
Feb 2025 |
100% |
50% |
33% |
17% |
— |
| 4 |
Mar 2025 |
100% |
60% |
40% |
— |
— |
| 5 |
Apr 2025 |
100% |
50% |
— |
— |
— |
| … |
More rows below |
Period 0 always = 100%. Format all cells as percentage.
Sheet1
Cohort Pivot
Retention Rates
+
Period 0 = 100% by definition. After that, the numbers drop. A cohort that goes 100% → 70% → 60% → 58% has decent early retention that plateaus. One that goes 100% → 45% → 30% → 28% lost most clients fast but held a loyal core, two completely different problems.
Step 5: Apply the heatmap
Numbers in a table work. A colour-coded heatmap is harder to ignore.
Select your retention rates table, period headers included, cohort month labels excluded. Go to Format → Conditional Formatting → Colour Scale. Set the minimum to white. Set the maximum to #2f4c47. Do not include blank cells in the range; zeros and blanks distort the scale.
QBO_Cohort_Analysis
Share
B2
fxFormat → Conditional Formatting → Colour Scale | Max: #2f4c47 | Min: white
Dark cells = strong retention • Fading rows = early churn • Sudden shift between rows = investigate that period
|
A |
B |
C |
D |
E |
F |
| 1 |
Cohort Month |
Period 0 |
Period 1 |
Period 2 |
Period 3 |
Period 4 |
| 2 |
Jan 2025 |
100% |
57% |
43% |
29% |
14% |
| 3 |
Feb 2025 |
100% |
50% |
33% |
17% |
— |
| 4 |
Mar 2025 |
100% |
60% |
40% |
— |
— |
| 5 |
Apr 2025 |
100% |
50% |
— |
— |
— |
Colour scale:Low — weak retentionMidHigh — strong retention
Sheet1
Cohort Pivot
Retention Rates
+
Dark rows = strong cohorts. Rows that bleach out by Period 2 = early churn. A sudden shift between two adjacent rows = something changed between those acquisition periods worth investigating.
Keeping it fresh (which is where most people fall down)
A cohort table built in March and not updated since is a historical artefact, not a monitoring tool.
G-Accon’s direct connection to QuickBooks Online means refreshing is a single click. The raw data updates and every formula downstream, Cohort Month, Period Number, the COUNTA(UNIQUE(FILTER())) table, and the retention rates, are recalculated automatically.
For firms managing multiple QBO clients, G-Accon lets you pull from several accounts into one consolidated sheet. One view across your entire book of business, segmented by client or aggregated, with no separate cohort table per client.
What to actually do with the results
Once your heatmap is live, here’s what’s worth looking for:
|
Early-period retention is dropping across recent cohorts
Period 1 and Period 2 fading, compared to older cohorts, almost always point to an onboarding problem. Clients aren’t finding enough value in the first 60 days. The question is what your best-retained cohorts experienced early on that newer ones haven’t.
|
|
Strong late-period retention, weak early-period
A sorting problem, not a service problem. The clients who do stay are loyal, but a large share is leaving before they get there. Often points to a mismatch between who you’re acquiring and who your service is built for.
|
|
One cohort is notably stronger than its neighbours
Don’t skip past this. Find out what made it different. A specific referral source? Tighter onboarding for that period? Pricing that attracted a different client profile? Strong cohorts tell you what to replicate.
|
|
Retention flat across all cohorts
Not necessarily bad news. Flat retention means a stable, predictable base. The question is whether the flat line is where you want it, or a ceiling you haven’t broken through yet.
|
Cohort analysis gives you the pattern. What you do next is a business decision. But at least you’re making it with clear information.
Building this takes an afternoon. Maintaining it takes almost nothing.
The setup, getting data from QBO, adding the helper columns, building the count table and the retention rates sheet, takes a few hours the first time. After that, with G-Accon keeping the data current, maintaining it takes a few minutes whenever you want fresh numbers. No rebuilding, no re-exporting, no reformatting.
For accounting firms serious about understanding client retention, not just reporting on it after the fact, that’s a meaningful shift. You stop chasing the data and start reading it.
|
Ready to connect Google Sheets to QuickBooks Online?
G-Accon syncs your QBO data automatically, no exports, no reformatting, no stale reports.
Start your free 30-day trial |