Weekly Thesis Review Digest: One Monday Email of Review Dates Coming Due
For Investment Fund Managers ·
What This Builds
A thesis you last reviewed in the summer is a thesis you may be holding on memory. This build keeps one line per holding in a small sheet, with the date of your last review and the number of days you chose between reviews. Every Monday it sends you one email listing the reviews coming due inside your alert window, the reviews already overdue and the lines with a missing date. The outcome it serves is no holding going past its review date without you seeing it. Reviews you finish drop off the list the moment you type the new date.
Prerequisites
- A Google spreadsheet named "Thesis Reviews", separate from any other tracker (the Level 2 guide builds it, and Part 1 and Part 2 below give the same layout so you can check it)
- A Zapier account on a paid plan, because the Zap has three steps and the free plan allows two-step Zaps only. The plan is Professional ($29.99/month). That is the total ongoing cost, since the Google account is one you already have.
- A Google account connected to Zapier for Sheets and Gmail
- A check of your firm's policy on holding codes in an outside automation tool, with your CCO
The Concept
A pilot works through a checklist even when the flight feels routine, because memory fails quietly. Your thesis review dates deserve the same treatment. The sheet remembers each date, does the date arithmetic, and reads the result out to you once a week. You do the reviewing.
One technical point shapes the design. A Zapier search step that finds no row halts the Zap. Zap History shows the run as safely halted, and no email is sent. A quiet week would then look exactly like a broken Zap. So the Zap searches a Summary tab with one row that always exists. Its Key cell says summary, and formulas fill the rest of the row from the Tracker tab. A quiet week produces an email that says none and zero. There is no AI step, no Formatter step, no loop, no second lookup and no row trigger, and nothing in this build reads from or writes to your portfolio, order, risk, performance or CRM system.
Review intervals and alert days are your own choices, typed into the sheet. This guide states no review frequency and no rule about thesis reviews, and the digest is a backstop that never replaces your investment committee calendar or your firm's compliance calendar.
Data caution. The sheet holds holding codes (such as H-01), dates and day counts only. Company names, tickers, weights, position sizes, prices and thesis text stay out of it, and the key that maps a code to a holding lives in your firm's systems. Material non-public information never goes into any AI tool, and this build has no AI step, but the same discipline applies to Zapier and the sheet. Undisclosed holdings, trade ideas and orders, your models, investor and client names, account numbers, fee terms, side letters and consultant scores stay in your firm's systems. Zapier is an outside tool, so ask your CCO whether your firm's policy allows these codes to pass through it and how business use of outside tools is recorded. Check Zapier's own pages for how long Zap History is kept and for its data settings. If the answer is no, use the sheet as a manual Monday checklist and skip the Zap.
Build It Step by Step
Part 1: Build the Tracker tab
Name the first tab Tracker. Lay out the columns first.
| Column | Header | Content |
|---|---|---|
| A | Holding code | Your short code, such as H-01 |
| B | Last review date | A real date you type when you finish a review |
| C | Review every (days) | A number you choose for this holding |
| D | Next review date | Formula, filled down to row 301 |
| E | Flag | Formula, filled down to row 301 |
Format columns B and D as dates (Format, then Number, then Date, or the closest match). Type dates as yyyy-mm-dd.
D2, filled down to row 301:
=IF(OR(B2="",C2=""),"",B2+C2)
It returns blank when either the last review date or the interval is missing, and the sum of the two otherwise.
E2, filled down to row 301:
=IF(A2="","",IF(OR(B2="",C2=""),"MISSING DATE",IF(D2<TODAY(),"OVERDUE",IF(D2-TODAY()<=Summary!$B$4,"DUE SOON",""))))
Read the formula from the outside in, then run each case through it:
- A blank row (no holding code) returns blank, so rows filled down past your last holding stay empty.
- A holding with a code but no last review date, or no interval, returns MISSING DATE.
- A next review date before today returns OVERDUE.
- A next review date today or later, no more than Alert days away, returns DUE SOON. A date exactly Alert days away counts, because the test is less than or equal.
- Everything else returns blank. A review date further out than the window waits quietly.
The four closing parentheses at the end match the four IF functions still open. The OR inside the second IF has its own closing parenthesis before the comma that introduces MISSING DATE.
Part 2: Build the Summary tab
Add a second tab named Summary. Type these cells first.
| Cell | Content |
|---|---|
| A1 to F1 | Key, Due Soon Count, Due Soon Items, Overdue Count, Overdue Items, Missing Date Count |
| A2 | The word summary, in lowercase |
| A4 | Alert days |
| B4 | 7 |
B2:
=COUNTIF(Tracker!E2:E301,"DUE SOON")
C2:
=IFERROR(TEXTJOIN(", ",TRUE,FILTER(Tracker!A2:A301&" (next review "&TEXT(Tracker!D2:D301,"yyyy-mm-dd")&")",Tracker!E2:E301="DUE SOON")),"none")
D2:
=COUNTIF(Tracker!E2:E301,"OVERDUE")
E2:
=IFERROR(TEXTJOIN(", ",TRUE,FILTER(Tracker!A2:A301&" (next review "&TEXT(Tracker!D2:D301,"yyyy-mm-dd")&")",Tracker!E2:E301="OVERDUE")),"none")
F2:
=COUNTIF(Tracker!E2:E301,"MISSING DATE")
Check the parentheses in each formula before you move on. Every range inside the FILTER runs from row 2 to row 301, so the heights match. The dates sit inside TEXT() so they join as 2026-11-05 and not as a serial number. A row only reaches the list when it carries the flag, and that flag needs a date, so TEXT() never sees a blank date for a listed row. IFERROR turns the empty-result error into the word none. The counts look for the exact flag words, so rows the formula fills down past your last entry are never counted.
The value in B4 is a starting choice, and it is yours to change. It is your own working window and not a rule.
Keep Calculation Mode on Automatic (File, Settings, Calculation). Google's calculation settings page offers Automatic and Manual only, with no scheduled recalculation, and TODAY() depends on recalculation. If a count looks stale, open the sheet before relying on the email. The spreadsheet's time zone (File, Settings, General) also decides what TODAY() means.
Part 3: Load the test rows
The rows below are invented. They assume a pretend TODAY() of Monday 2026-10-26 and B4 = 7. On another day, keep the same offsets from your real today and retype the dates.
| Holding code | Last review date | Review every (days) | Next review date | Days from the invented today | Expected flag |
|---|---|---|---|---|---|
| H-01 | 2026-08-01 | 90 | 2026-10-30 | 4 ahead | DUE SOON |
| H-02 | 2026-07-20 | 90 | 2026-10-18 | 8 behind | OVERDUE |
| H-03 | 2026-09-01 | 60 | 2026-10-31 | 5 ahead | DUE SOON |
| H-04 | 2026-08-04 | 90 | 2026-11-02 | 7 ahead | DUE SOON (boundary) |
| H-05 | 2026-08-05 | 90 | 2026-11-03 | 8 ahead | blank |
| H-06 | none | 90 | blank | none | MISSING DATE |
| H-07 | 2026-10-26 | 30 | 2026-11-25 | 30 ahead | blank |
The Summary row should then read:
| Cell | Expected value |
|---|---|
| B2 | 3 |
| C2 | H-01 (next review 2026-10-30), H-03 (next review 2026-10-31), H-04 (next review 2026-11-02) |
| D2 | 1 |
| E2 | H-02 (next review 2026-10-18) |
| F2 | 1 |
H-04 shows the boundary: seven days is within a seven-day window, so it is flagged. H-05 sits at eight days and waits. H-02 is overdue and appears in the overdue items, not the due soon items. H-06 has no last review date, so it is counted as missing and nothing else is guessed. H-07 was reviewed on the invented today, so it returns blank. A completely empty row returns blank and is not counted.
If C2 shows one item only, or the same date for every item, the first argument of the FILTER is not being read as an array in your sheet. Wrap the text-joining part of the FILTER (the part that joins codes and dates, before the final condition) in ARRAYFORMULA and compare again. The values above are the check.
Part 4: Create the Zap
- In Zapier, create a new Zap.
- Choose Schedule by Zapier as the trigger and the Every Week event.
- Choose Monday for Day of the Week and set the Time of Day for the email. Leave Timezone Override alone unless your spreadsheet uses a different time zone.
- Add an action. Choose Google Sheets and the Lookup Spreadsheet Row event.
- Connect your Google account if asked. Pick the spreadsheet Thesis Reviews and the worksheet Summary.
- For Lookup column choose Key (column A). Labels may be worded a little differently.
- For Lookup value type summary, in lowercase.
- Leave Supporting lookup column, Supporting lookup value, Search from last row and Row count at their defaults.
- Add a second action. Choose Gmail and the Send Email event.
- In To, type your own address only. The digest goes to you and no one else.
- Type the subject Thesis reviews this week.
- Type the body below. Replace each bracketed name with the field of that name from the Google Sheets step, using Zapier's field picker.
Due soon [Due Soon Count]: [Due Soon Items]
Overdue [Overdue Count]: [Overdue Items]
Missing review dates [Missing Date Count]
Backstop only. The investment committee calendar is the record.
- Test the Google Sheets step. It should return the whole Summary row, with a value for each header in row 1.
- Test the Gmail step and read the email.
- Turn the Zap on.
The lookup returns the entire matching row, and that row is all Zapier sees. The Tracker tab never leaves Google. Row 4 holds your window, so it is not part of the row the lookup returns.
What leaves your sheet
Zapier receives the Summary row and the email text. That means the word summary, the Due Soon Count, the Due Soon Items text (holding codes and next review dates), the Overdue Count, the Overdue Items text (holding codes and next review dates) and the Missing Date Count. Zap History stores the data each step received and returned, so those values stay in your Zapier account. The rest of the Tracker tab stays in Google.
Zapier bills only successful action steps as tasks. The trigger, a search that halts and a failed action are not counted. A normal run has two action steps, the lookup and the email, so check Zapier's own pages for how your plan counts them.
Use codes only. A company name, a ticker, a position size, a weight, a price or any thesis text does not belong in this sheet.
Real Example: Monday 2026-10-26
Setup: The seven invented rows from Part 3 and B4 set to 7. Input: On Monday at the scheduled time, the Zap fires and finds the summary row. Output:
Due soon 3: H-01 (next review 2026-10-30), H-03 (next review 2026-10-31), H-04 (next review 2026-11-02)
Overdue 1: H-02 (next review 2026-10-18)
Missing review dates 1
Backstop only. The investment committee calendar is the record.
Check it by hand. H-01: 2026-08-01 plus 90 days is 2026-10-30, four days after 2026-10-26. H-02: 2026-07-20 plus 90 days is 2026-10-18, which is before today. H-03: 2026-09-01 plus 60 days is 2026-10-31, five days out. H-04: 2026-08-04 plus 90 days is 2026-11-02, seven days out. H-05: 2026-08-05 plus 90 days is 2026-11-03, eight days out. H-07: 2026-10-26 plus 30 days is 2026-11-25. H-06 has no last review date. What you do next: You open the research file for H-02 first and book time for the other three. When a review is done, you type the new date in column B and the line drops off the list. The rows are invented. Real dates and intervals come from your own research process.
What to Do When It Breaks
- A Monday passed with no email → This failure is silent, so build the habit of noticing it. Check that the Zap is switched on. Open Zap History and look for a run that Monday. A "safely halted" run means the lookup found no row, so check that A2 on the Summary tab still says summary, because a renamed Key cell stops the lookup. Check that the spreadsheet and the Summary tab still have their original names. If Zapier reports an expired Google connection, reconnect it. A Monday with no email never means that nothing needs attention.
- A holding never appears → Confirm column B holds a real date and not text, and that column C holds a number. A date typed as text is not added correctly.
- A finished review still shows → Type the new last review date in column B. The next review date follows from it.
- The email says none but you expect items → Check the alert days in B4 and confirm B4 is a number. A text "7" breaks the comparison.
- A holding was sold → Clear its row so it stops appearing. The sheet does not learn of a sale.
- Dates show as numbers in the email → The TEXT wrapper was removed from the formula in C2. Restore it from Part 2.
- Counts look stale → Open the sheet and keep Calculation Mode on Automatic.
Variations
- Simpler version: Drop the interval column, type each next review date yourself in column D and delete the D2 formula.
- Extended version: Raise the aim from a date to a review that is ready. Add a column for whether your "what would make me wrong" list is written for the holding (yes or no), and add a count and an items cell to the Summary in the same pattern. Every new formula follows the same rules as above.
What to Do Next
- This week: Run the test rows. Then replace them with your live entries and compare the first email with your investment committee calendar.
- This month: Adjust the interval for each holding to match your own research rhythm, and review the alert days after a month of emails.
- Advanced: Pair it with the DDQ and RFP due-date digest and the earnings and event prep digest, each in its own spreadsheet.
Advanced guide for investment fund manager professionals. This build needs a paid Zapier plan. Zapier and Google update their screens often, so if a label differs from this guide, look for the closest match and check the vendor's help pages.