How to Get Notified When Rent Is Late in Google Sheets
You built a solid rent tracking spreadsheet. Formulas are working. Conditional formatting shows you which tenants are late. But you still have to open the sheet every single day to see any of it.
What if Google Sheets could just email you when rent is overdue? It can. Sort of.
Here's how to set up late rent notifications using Google Apps Script. I'll give you the actual code. And I'll be honest about where it breaks down.
What You Need Before Starting
You need a Google Sheet with your rent roll in it. At minimum, you need columns for: Unit, Tenant Name, Rent Amount, Due Date, and Date Paid. If you don't have one yet, grab the free rent payment tracker template.
Your Due Date column should have actual dates, not text. If your dates are formatted as text, the script won't be able to compare them. You can check by clicking a cell and looking at the format menu. It should say "Date."
For this walkthrough, I'm assuming: Due Date is column D, Date Paid is column F, Tenant Name is column B, and Unit is column A. Your data starts in row 2 (row 1 is headers).
Step 1: Open Apps Script
In your Google Sheet, click Extensions > Apps Script. This opens a code editor in a new tab.
Delete whatever is in there (usually an empty function). You're going to paste in the code below.
Step 2: Paste This Script
Here's the full script. Copy and paste it into the Apps Script editor:
function checkLateRent() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("January");
var data = sheet.getDataRange().getValues();
var today = new Date();
today.setHours(0, 0, 0, 0);
var lateUnits = [];
for (var i = 1; i < data.length; i++) {
var unit = data[i][0];
var tenant = data[i][1];
var dueDate = new Date(data[i][3]);
dueDate.setHours(0, 0, 0, 0);
var datePaid = data[i][5];
if (!datePaid && today > dueDate) {
var daysLate = Math.floor((today - dueDate) / (1000 * 60 * 60 * 24));
lateUnits.push(unit + " - " + tenant + " (" + daysLate + " days late)");
}
}
if (lateUnits.length > 0) {
var subject = "Late Rent Alert: " + lateUnits.length + " unit(s) overdue";
var body = "The following units have overdue rent:
" + lateUnits.join("
");
MailApp.sendEmail("[email protected]", subject, body);
}
}
Replace "[email protected]" with your actual email address. Replace "January" with whatever your tab is named.
Step 3: Test It
Click the play button (triangle icon) at the top. Google will ask you to authorize the script. Click through the permissions. It needs access to your spreadsheet and your email.
If you have any overdue rent in the sheet, you'll get an email within a few seconds. If nobody is late, nothing happens. That's expected.
Step 4: Set Up a Daily Trigger
You don't want to run this manually every day. That defeats the purpose.
In the Apps Script editor, click the clock icon on the left sidebar (Triggers). Click "Add Trigger" in the bottom right.
Set it up like this: Function is checkLateRent. Event source is "Time-driven." Type is "Day timer." Time is "6am to 7am" (or whenever you want the alert).
Save it. Now every morning, Google runs your script and emails you if anyone is late.
Adding a Grace Period
Most landlords give 3 to 5 days before rent is officially "late." You can adjust the script to account for that.
Change this line:
if (!datePaid && today > dueDate) {
To this:
var graceDays = 5;
if (!datePaid && today > new Date(dueDate.getTime() + graceDays * 86400000)) {
Now it only flags tenants who are past the 5-day grace period. Adjust the number to match your lease terms.
Where This Breaks Down
I used this exact setup for about 6 months. It worked, until it didn't. Here's what went wrong.
First, column positions are hardcoded. The script uses data[i][3] for due date and data[i][5] for date paid. If you add a column or rearrange things, the script breaks silently. No error. It just checks the wrong data.
Second, the tab name is hardcoded. When February rolled around, I had to go into the script and change "January" to "February." I forgot in March. Went 11 days without alerts.
Third, Google has daily email quotas. Free accounts can send 100 emails per day. If you have other scripts running, you might hit the limit. When you do, the script fails with no notification.
Fourth, no text alerts. Email is fine but I don't check email constantly. By the time I see the alert at 2pm, the tenant has been late since morning. Text messages are way more immediate.
Fifth, it only runs if Google's servers feel like it. Time-driven triggers aren't exact. "6am to 7am" means it runs sometime in that window. Occasionally it skips entirely. Google's docs even say triggers can fail and there's no built-in retry.
I had my script silently stop working twice. Once for 8 days, once for 12. Both times I only noticed because I happened to open the sheet manually.
Making It More Robust
You can improve the script. Use getSheetByName dynamically based on the current month. Use column headers to find the right columns instead of hardcoded indexes. Add error logging to a separate tab. Our full Apps Script email tutorial covers these advanced patterns.
But every improvement adds complexity. And complexity means more things that can break. My "simple" rent alert script eventually grew to 85 lines with error handling, and it still missed alerts when Google's trigger service had hiccups.
If you want to go deeper on tracking overdue rent with formulas instead of scripts, I covered that in how to track overdue rent in Google Sheets.
The Simpler Alternative
I ended up building RentGuard because I got tired of maintaining the script. It connects to your existing Google Sheet, checks it every day, and sends you a text and email when rent is overdue.
No Apps Script. No triggers. No code. Your spreadsheet doesn't change at all.
You keep doing things the way you're doing them. RentGuard just watches the sheet for you and pings you when something needs attention. It also handles grace periods, so you only get alerted when rent is actually late, not when it's still in the grace window.
If the Apps Script method works for you, great. Use it. But if you've tried it and gotten burned by silent failures, RentGuard is $15/mo and it just works.
Either way, stop opening your spreadsheet every day and hoping you notice the red cells. Automate the alert. Your future self will thank you.
Stop missing late rent payments
RentGuard monitors your Google Sheet and alerts you when rent is overdue or maintenance is aging. No migration. 5 minute setup. 30 days free.
Start Free Monitoring →