GUIDE

Compliance tracking spreadsheet or tracker app: make the spreadsheet work, and know when to switch

A spreadsheet is a good compliance tracker for a small business if it does three things without you remembering to look: counts the days left on every license, permit and policy, turns a row red or amber when a date is close, and sends you a reminder. Neither Google Sheets nor Excel does the third by default; a dated cell never notifies anyone. Below are the formulas and color rules to copy (they work in both), a free template file, a short script that makes Google Sheets email you, and a rule for when the spreadsheet has done its job and something else should take over.

What a spreadsheet does well, and the one thing it does not do

A spreadsheet is free, you already know it, everyone can open it, and you control every column. For five or ten dated obligations it is often all you need. What it cannot do by itself is tell you a date is coming. Google's help page lists what Sheets can notify you about: comments, changes made by other people ("Any changes are made"), and form submissions. You "won't get notifications when you make changes" yourself, and nothing on the page covers a date in a cell (Google Docs Editors Help, Manage your notifications). So a spreadsheet tracker works only as long as someone opens it. The formulas below make that look quick; the script removes the need.

The columns and formulas (copy them)

For what each column means and why it is there, see the business license renewal tracker guide. This sheet adds three calculated columns on the right. Put your headings in row 1 and your first obligation in row 2, then fill the formulas down.

Columns A to J. A to G are typed in; H, I and J are formulas (shown for row 2).
ColumnHeadingWhat goes in it
AObligationBusiness license, reseller permit, liability policy, annual report
BAgency / portalWho issues it and where you renew
CExpires onThe date printed on the document, entered as a date
DCycle (months)12, 24, 48, 60
EWindow opens (days before expiry)How early the agency lets you renew. Blank if it does not say
FOwnerThe one person who renews it
GProof storedWhere the current certificate lives
HDays left=IF(C2="","",DAYS(C2,TODAY()))
IStatus=IF(C2="","",IF(H2<0,"Overdue",IF(H2<=30,"Due within 30 days",IF(H2<=IF(E2="",90,E2),"Window open","Current"))))
JNext reminder=IF(C2="","",IF(TODAY()<=C2-IF(E2="",90,MAX(E2,30)),C2-IF(E2="",90,MAX(E2,30)),IF(TODAY()<=C2-30,C2-30,IF(TODAY()<=C2-7,C2-7,"Now"))))

How they work:

Prefer not to type them? Download the template (CSV) with these headings, the formulas filled in, and three example rows to replace. Open it in Excel, or in Google Sheets with File, Import. If a formula shows as text, paste it from the table above.

Color rules: red for overdue, amber for 30 days

Select A2:J200, then add two rules that use a formula. In Google Sheets: Format, Conditional formatting, "Custom formula is" (Google, Use conditional formatting rules). In Excel: Home, Conditional Formatting, New Rule, "Use a formula to determine which cells to format"; the formula "must return True or False" (Microsoft, Use conditional formatting).

The dollar sign before H keeps every cell in the row looking at its own Days left, so the whole row changes color. The $H2<>"" part stops blank rows turning red. Then sort by column H, smallest first, so the most urgent row is always at the top.

Make Google Sheets email you

Google Apps Script can run a function on a timer: "Time-driven triggers allow scripts to execute at specific times or intervals" (Google, Installable triggers). This one checks the sheet once a day and emails you any row due within 30 days or already overdue. It works out the days itself, so it does not rely on the sheet having recalculated.

  1. Name the tab Tracker (bottom of the sheet). Keep the columns in the order above.
  2. Extensions, Apps Script. Delete what is there, paste the code below, and put your email address in SEND_TO.
  3. Save, then click Run once. Google asks you to authorize the script to read the sheet and send email as you; that prompt is expected.
  4. Open Triggers (the clock icon), Add Trigger, choose emailDueSoon, event source Time-driven, and a daily timer.
// Emails you every row that expires within 30 days or has expired.
var SHEET_NAME = 'Tracker';
var SEND_TO = 'you@example.com'; // your address

function emailDueSoon() {
  var rows = SpreadsheetApp.getActiveSpreadsheet()
    .getSheetByName(SHEET_NAME).getDataRange().getValues();
  var today = new Date();
  today.setHours(0, 0, 0, 0);
  var lines = [];
  for (var i = 1; i < rows.length; i++) {
    var name = rows[i][0], expires = rows[i][2], owner = rows[i][5];
    if (!name || !(expires instanceof Date)) continue;
    var daysLeft = Math.round((expires - today) / 86400000);
    if (daysLeft <= 30) {
      lines.push(name + ': ' + (daysLeft < 0 ? 'OVERDUE by ' + (-daysLeft) + ' days'
        : daysLeft + ' days left') + ' (owner: ' + owner + ')');
    }
  }
  if (lines.length) {
    MailApp.sendEmail(SEND_TO, lines.length + ' compliance item(s) due within 30 days',
      lines.join('\n'));
  }
}

Three limits to know. A free Google account can send email to 100 recipients a day from scripts, far more than this needs (Google, Apps Script quotas). Triggers always run "under the creator's account", so if that person leaves, the emails stop (Google, Installable triggers). And set the sheet's time zone (File, Settings) and the script's (Project Settings) to the same place, or a date can be a day out. Excel has no equivalent built in; there, put the dates from column J in your calendar.

Spreadsheet, phone app or audit platform: which fits

Spreadsheet (this page)Compliance tracker appAudit / framework platform
Built forA list of dated obligations you controlLicenses, permits, policies and filings for one businessControls, risks and evidence for frameworks such as SOC 2 and ISO 27001
RemindersOnly with the script, or by copying dates to a calendarThe main reason to use one; check that it reaches your phoneThrough the platform's automations, once you set them up
DocumentsA file path or link in a cellDepends on the app; check before you chooseEvidence linked to each control
Recurring datesYou type the new date after each renewalDepends on the app; check before you chooseDepends on how the base is built
CostFreeCheck the store listing; some have a free tierCheck the vendor
FitsOne person, up to about ten items, a desk routineOwner-operators who live on their phone, or several staff renewalsCompanies preparing for a formal audit

Example of the third column, checked November 7, 2026: Airtable's compliance tracking template describes SOC 2 and ISO 27001 tabs, a risk register and a corrective action log (Airtable). It suits a team running audits; a café renewing a food permit and a liability policy needs far less.

When to stop using the spreadsheet: a rule

Keep the spreadsheet while all of these are true:

Switch when any one stops being true, and especially when renewals are shared between people, when the script's owner may leave, or when you have missed a date the sheet knew about. The sheet was right; nobody was looking. That is the failure a reminder tool exists for.

One option is Obligio, our app for iPhone and Android. It holds the same rows and sends reminders 30, 14, 7 and 1 days before each date, with notifications on. The Free plan tracks three obligations; Plus adds unlimited obligations, attached documents and recurring obligations that roll forward when completed (Free and Plus). It does not import a spreadsheet, so moving means typing each row once. It does not tell you which licenses your business needs or file anything for you. If your sheet is working, keep it.

When this page does not apply

Questions

Can Google Sheets send me a reminder when a date is near?

Not on its own. Google's notification settings for Sheets cover comments, edits by other people and form submissions, not dates in cells. To get an email when a date is near you need a short Apps Script with a time-driven trigger, like the one above.

Does the template work in Excel?

Yes. The formulas use IF, DAYS, MAX and TODAY, which exist in both Excel and Google Sheets. The email script is Google Sheets only; in Excel, put the reminder dates in your calendar instead.

Should I calculate the next expiry date with a formula?

Only as a placeholder. =EDATE(C2,D2) gives a date D2 months after C2 (Microsoft, EDATE; Google, EDATE), but the date that counts is the one printed on the renewed license or policy. Replace the placeholder with that date when the new document arrives.

Sources

All sources were read on November 7, 2026. Menus in Google Sheets and Excel move between versions; the help pages linked above have the current steps.

If you would rather have the reminders on your phone than in a script, Obligio is free for your first three obligations: download on the App Store or get it on Google Play. Questions about the app go to support.