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.
| Column | Heading | What goes in it |
|---|---|---|
| A | Obligation | Business license, reseller permit, liability policy, annual report |
| B | Agency / portal | Who issues it and where you renew |
| C | Expires on | The date printed on the document, entered as a date |
| D | Cycle (months) | 12, 24, 48, 60 |
| E | Window opens (days before expiry) | How early the agency lets you renew. Blank if it does not say |
| F | Owner | The one person who renews it |
| G | Proof stored | Where the current certificate lives |
| H | Days left | =IF(C2="","",DAYS(C2,TODAY())) |
| I | Status | =IF(C2="","",IF(H2<0,"Overdue",IF(H2<=30,"Due within 30 days",IF(H2<=IF(E2="",90,E2),"Window open","Current")))) |
| J | Next 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:
- Days left uses DAYS(end, start), which returns a plain number in both programs, so a negative number means overdue.
- Status gives one of four words. "Window open" uses your column E; if E is blank it uses 90 days, the default first reminder in the renewal tracker guide.
- Next reminder gives the next of three dates: the day the window opens (never later than 30 days out), 30 days before expiry, and 7 days before. Format column J as a date. "Now" means all three have passed and the renewal should already be under way.
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).
- Red fill:
=AND($H2<>"",$H2<0) - Amber fill:
=AND($H2<>"",$H2>=0,$H2<=30)
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.
- Name the tab Tracker (bottom of the sheet). Keep the columns in the order above.
- Extensions, Apps Script. Delete what is there, paste the code below, and put your email address in SEND_TO.
- 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.
- 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 app | Audit / framework platform | |
|---|---|---|---|
| Built for | A list of dated obligations you control | Licenses, permits, policies and filings for one business | Controls, risks and evidence for frameworks such as SOC 2 and ISO 27001 |
| Reminders | Only with the script, or by copying dates to a calendar | The main reason to use one; check that it reaches your phone | Through the platform's automations, once you set them up |
| Documents | A file path or link in a cell | Depends on the app; check before you choose | Evidence linked to each control |
| Recurring dates | You type the new date after each renewal | Depends on the app; check before you choose | Depends on how the base is built |
| Cost | Free | Check the store listing; some have a free tier | Check the vendor |
| Fits | One person, up to about ten items, a desk routine | Owner-operators who live on their phone, or several staff renewals | Companies 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:
- One person owns it and opens it at least weekly, or the script is running.
- There are fewer than about ten rows, so a glance shows everything.
- Nobody needs the certificate from their phone at the counter or on a job site.
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
- If you do not yet know which licenses and filings your business needs, start with the SBA's licenses and permits guide and your state's Secretary of State. A tracker only holds what you put in it.
- For federal tax filing dates by entity type, use the small business compliance calendar.
- If a date in your sheet has already passed, read what happens if a business license expires and contact the agency today.
- For questions about what a rule requires of your business, ask a licensed attorney or accountant. This page is organizational guidance, not legal or tax advice.
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
- Google Docs Editors Help, Manage your notifications
- Google Docs Editors Help, Use conditional formatting rules in Google Sheets
- Google Docs Editors Help, EDATE
- Google Apps Script, Installable triggers
- Google Apps Script, Quotas for Google Services
- Microsoft Support, Use conditional formatting to highlight information in Excel
- Microsoft Support, EDATE function
- Airtable, Compliance tracking template
- U.S. Small Business Administration, Apply for licenses and permits
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.