Learn Marketing Dynamic calendar

Google Sheets · Outbound ops

A 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.

7 formulas 0 add-ons, 0 scripts ~15 min to build

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.

B2
B6 First day
B7 Grid starts

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.

Sun 1
Mon 2
Tue 3
Wed 4
Thu 5
Fri 6
Sat 7

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.

SunMonTueWedThuFriSat
1–2 due 3 or more Sample leads, fictional companies.

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

    Lists!A2:B13 Month names and their numbers
    January | 1 … December | 12
    B2 Month dropdown
    Dropdown (from a range): Lists!A2:A13
    B3 Year
    2026
    B4 Week starts on
    Dropdown: Sunday, Monday
    B6 First day of the month
    =IF(AND(B2<>"", B3<>""), DATE(B3, XLOOKUP(B2, Lists!A2:A13, Lists!B2:B13), 1), "") Custom format: dddd, mmmm d, yyyy
    B7 First date in the grid
    =IF(ISDATE(B6), B6 - WEEKDAY(B6, IF(B4="Monday", 2, 1)) + 1, "")
    D2 Calendar heading
    =B6 Custom format: mmmm yyyy
    D3:J3 Weekday labels
    =D4 (drag right to J3) Custom format: ddd
    D4 The 6 × 7 grid
    =IF(ISDATE(B7), SEQUENCE(6, 7, B7), "") Custom format: d
    D4:J9 Conditional format, grey text
    =MONTH(D4)<>MONTH($B$6)

    The follow-up layer

    Leads!A:D Your list
    Lead | Company | Touch | Next follow-up (a real date)
    D4:J9 Busy days, dark teal (put this rule first)
    =COUNTIF(INDIRECT("Leads!D2:D"), D4)>=3
    D4:J9 Any follow-up, light teal
    =COUNTIF(INDIRECT("Leads!D2:D"), D4)>0
    L2 Day to inspect
    =TODAY() or Data validation → Is valid date
    L4 Who is due that day
    =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.