How to Get Contract Renewal & Expiration Alerts from Google Sheets (2026)

Auto-renewing contracts usually hide the date that matters: the notice deadline, often 30 to 90 days before the renewal date. Here is how to track it in Google Sheets and get emailed in time.

Step 1: columns that capture the notice window

ColumnExampleFormula
A ContractCRM subscription
B Owner emailops@example.com
C Renewal date2027-03-01
D Notice days60
H Notice deadline2026-12-31=C2-D2
I Days left56=H2-TODAY()
J StatusAct now=IFS(I2<0,"Notice missed",I2<=30,"Act now",I2<=60,"Review",TRUE,"OK")

For a renewal a year after a start date, use =EDATE(StartDate, 12). For terms that renew every year, the next renewal from a start date in B2 is =EDATE(B2, 12*(DATEDIF(B2, TODAY(), "Y")+1)).

Step 2: highlight what's coming up

Select the data, open Format › Conditional formatting, choose Custom formula, and add =$I2<=30 in red and =$I2<=60 in amber. Sort or filter by Days left for a weekly review.

Step 3: email alerts at 60, 30 and 7 days

Name the tab Contracts, leave columns E–G empty as "Sent" markers, paste this into Extensions › Apps Script, and add a daily time-driven trigger:

/**
 * Multi-step renewal alerts (e.g. 60, 30 and 7 days before).
 * Columns: A Contract | B Owner email | C Renewal date | D Notice days | E Sent 60 | F Sent 30 | G Sent 7
 */
const STEPS = [60, 30, 7];

function renewalAlerts() {
  const sh = SpreadsheetApp.getActive().getSheetByName('Contracts');
  const rows = sh.getDataRange().getValues();
  const today = new Date(); today.setHours(0, 0, 0, 0);
  const tz = Session.getScriptTimeZone();

  rows.slice(1).forEach((row, i) => {
    const [name, email, renewal, notice] = row;
    if (!email || !(renewal instanceof Date)) return;
    const deadline = new Date(renewal); deadline.setHours(0, 0, 0, 0);
    deadline.setDate(deadline.getDate() - (Number(notice) || 0));   // last day to give notice
    const daysLeft = Math.round((deadline - today) / 86400000);
    STEPS.forEach((step, s) => {
      const col = 5 + s;                                             // E, F, G
      if (daysLeft <= step && daysLeft >= 0 && !row[col - 1]) {
        MailApp.sendEmail(email, `${name}: notice deadline in ${daysLeft} days`,
          `${name} renews on ${Utilities.formatDate(renewal, tz, 'MMM d, yyyy')}. ` +
          `To cancel or renegotiate, give notice by ${Utilities.formatDate(deadline, tz, 'MMM d, yyyy')}.`);
        sh.getRange(i + 2, col).setValue(new Date());
      }
    });
  });
}

Each step is stamped with the date it was sent, so no alert repeats. When a contract renews, update the renewal date and clear E–G.

Caveats

Simpler one-date reminders: email reminders from a date column.

Want reminders without maintaining a script? SheetReminders (disclosure: we make it) is a Google Sheets add-on that watches date columns and sends scheduled email reminders before, on or after each date, for example 30, 14 and 7 days before a renewal or due date. Sheet data stays inside your Google account and it uses narrow scopes. 14-day free trial, no credit card required. It is live on the Google Workspace Marketplace.
See SheetReminders
Short on time? Watch the 50-second version

Related Google Sheets guides

Third-party details come from each vendor's own site and Google Workspace Marketplace listing, checked November 5, 2026. Not affiliated with Google, New Visions, Digital Inspiration, Tofu Labs or any other vendor named here. Google Sheets, Google Docs and Google Drive are trademarks of Google LLC. Features and prices change, so verify before you buy. Questions or corrections: hello@loomwise.app.