Learn Marketing Dynamic calendar
Google Sheets · Outbound opsA dynamic calendar in Google Sheets
Your sequencer knows which day each follow-up is due. Your lead sheet doesn't. Here is a month calendar built from one formula, then wired to your list so the busy days light up.
Most outbound teams we talk to keep the real lead list in a Google Sheet. Apollo or HubSpot holds the sequence, but the sheet is where the SDR checks who is next. What the sheet lacks is any sense of when. A column of dates doesn't tell you that Thursday has eleven calls and Monday has none.
A dynamic calendar in Google Sheets fixes that. Pick a month and the grid redraws itself. No dates typed by hand, no copying last month's tab. The build below uses six functions you probably already know. The trick is in how they stack.
The calendar technique comes from this walkthrough on YouTube. We added the follow-up layer on top.
Watch it build
How the Google Sheets calendar formula works, one cell at a time
Press play, or step through. Change the month, year or week start at any point and the sheet recalculates.
Step 1 of 7
The one confusing bit
Why "minus WEEKDAY, plus one" lands on the right day
WEEKDAY gives every day a number from 1 to 7. Its second argument decides which day gets the 1. Flip it and watch Sunday move to the back of the line. Every day keeps its name, only its number changes.
Make it earn its place
Turn the calendar into an SDR follow-up heatmap
Add a Leads tab with a next-follow-up date per row. Two conditional formatting rules shade each day by how many touches are due. One FILTER lists who they are. Click a day to see the formula run.
L2
L4
=IFERROR(FILTER(Leads!A2:C, Leads!D2:D = L2), "Nothing due") Copy and paste
Every formula, in the order you type it
Two tabs to start: Lists for the month names and Calendar for everything else. The grid relies on SEQUENCE, so it spills into D4:J9 on its own. Keep those cells empty.
The calendar
January | 1 … December | 12 Dropdown (from a range): Lists!A2:A13 2026 Dropdown: Sunday, Monday =IF(AND(B2<>"", B3<>""), DATE(B3, XLOOKUP(B2, Lists!A2:A13, Lists!B2:B13), 1), "")
Custom format: dddd, mmmm d, yyyy =IF(ISDATE(B6), B6 - WEEKDAY(B6, IF(B4="Monday", 2, 1)) + 1, "") =B6
Custom format: mmmm yyyy =D4 (drag right to J3)
Custom format: ddd =IF(ISDATE(B7), SEQUENCE(6, 7, B7), "")
Custom format: d =MONTH(D4)<>MONTH($B$6) The follow-up layer
Lead | Company | Touch | Next follow-up (a real date) =COUNTIF(INDIRECT("Leads!D2:D"), D4)>=3 =COUNTIF(INDIRECT("Leads!D2:D"), D4)>0 =TODAY() or Data validation → Is valid date =IFERROR(FILTER(Leads!A2:C, Leads!D2:D = L2), "Nothing due") Where it breaks on a real lead list
Dates that are really text
A CSV export from your sequencer often lands as text that only looks like a date. ISDATE says FALSE and COUNTIF finds nothing. Select the column and use Format → Number → Date, or wrap it in DATEVALUE.
Conditional formatting cannot see other tabs
Write Leads!D2:D straight into a conditional formatting rule and Sheets rejects it. Wrap the range in INDIRECT("Leads!D2:D") and it works.
Rule order decides the colour
Sheets stops at the first conditional formatting rule that matches. Put the ">=3" rule above the ">0" rule, or every busy day comes out light.
Commas or semicolons
If your spreadsheet locale uses commas for decimals (most of Europe), separate arguments with ; instead of ,. The formulas are otherwise identical.
One more, outside the formulas: the heatmap is only as good as the dates in your list. If half your follow-ups go to addresses that bounce, the busy Thursday is busy for nothing. Cleaning the list first with the Smart Email Verifier add-on keeps the calendar honest.
More from the outbound toolbox
Sending limits, deliverability records, and the rest of what an outbound team runs on.