How to Send Automatic Payment Reminders From a Google Sheets Invoice Tracker (DIY Script vs. Connecting a Tool)
Two ways to send automatic payment reminders from a Google Sheets invoice tracker: a working Apps Script you can copy, and when to connect a real tool instead.
If you track invoices in a Google Sheet, you've probably had this exact thought: the sheet already knows who owes me money and when it was due. Why am I still writing "just following up on this" emails by hand?
You're right to be annoyed. There are two real ways to send automatic payment reminders from a Google Sheets invoice tracker: write a Google Apps Script yourself, or connect the sheet to a dedicated reminder tool. Both work. They just stop working at very different points, and most articles only tell you about the first one.
Let's do both honestly, including the part where the DIY version quietly falls apart.
First, get your sheet into a usable shape
Whichever route you pick, your Google Sheets unpaid invoice tracking needs a few columns the automation can actually read:
- Client name and client email
- Invoice number and amount
- Due date (as a real date, not "end of March")
- Status — something machine-readable like
unpaid/paid
That last one is the linchpin. Every automation, script or tool, works the same way: find rows where status is unpaid and the due date has passed, then email that row's client. If your statuses are a mix of "paid!!", "waiting", and cell colors, fix that first. Automation can't read highlighting.
Route 1: The DIY Apps Script
Google Sheets has a built-in scripting environment (Extensions → Apps Script) that can send email from your Gmail account. Here's a working version of the classic reminder script:
function sendReminders() {
const sheet = SpreadsheetApp.getActiveSheet();
const rows = sheet.getDataRange().getValues();
const today = new Date();
for (let i = 1; i < rows.length; i++) {
const [client, email, invoice, amount, dueDate, status] = rows[i];
if (status !== "unpaid") continue;
const daysLate = Math.floor((today - new Date(dueDate)) / 86400000);
if (daysLate < 1) continue;
MailApp.sendEmail({
to: email,
subject: `Reminder: Invoice ${invoice} is ${daysLate} days overdue`,
body: `Hi ${client},\n\nJust a reminder that invoice ${invoice} ` +
`for $${amount} was due on ${new Date(dueDate).toDateString()}. ` +
`Could you let me know when payment is on the way?\n\nThanks!`
});
}
}Then set a trigger (the clock icon in the Apps Script editor) to run sendReminders daily at 9am. That's it — you now have google sheets invoice reminder automation for exactly $0.
I want to be fair here: for some people, this is genuinely enough. If you send a handful of invoices a month to clients who mostly pay on time, and you're comfortable poking at a script when something breaks, stop reading and go paste that code in.
But notice what this script actually does. It sends the same email, every single day, to every overdue client, until you manually flip the status to paid. Which brings us to the breaking points.
Where the DIY script collapses
Everyone who builds this hits the same wall, usually in the same order.
Breaking point 1: You need a sequence, not a repeat
A good follow-up isn't one email on loop — it's a friendly nudge at day 3, a firmer one at day 14, and a "let's resolve this" at day 30. (Here's exactly what to say at each stage if you're writing your own.) Encoding that in a script means tracking which reminder each invoice last received, in another column, updated by the script itself. Your 20-line script is now 80 lines with state management, and a single manually-edited cell can desync the whole thing.
Breaking point 2: The script doesn't know the client already replied
This is the one that actually burns people. A client emails you "so sorry, paying Friday!" — and your script, which reads a spreadsheet and not your inbox, cheerfully sends them a firmer reminder Thursday morning. Now you're the one apologizing. DIY automation has no idea a conversation is happening; it just sees unpaid and fires.
Breaking point 3: The script only knows what you remember to type
If you forget to mark an invoice paid, a paying client gets dunned. If you forget to add a new invoice, it never gets chased. The automation is only as reliable as your data entry, and the whole reason you wanted automation was that you're busy.
Breaking point 4: Silent failures
Apps Script triggers fail quietly — an authorization expires, Gmail's daily send quota gets hit, a date cell becomes text after an edit. The script doesn't page you. You find out three weeks later when you notice nobody's been reminded about anything, which is roughly the worst possible way to discover it.
The pattern is clear: DIY works while your invoice volume is low and your clients are cooperative. It collapses the moment you need escalation, reply-awareness, or reliability you don't personally have to babysit. If you've hit two or more of those breaking points, you're past the threshold.
Route 2: Connect the sheet to a dedicated reminder tool
The alternative isn't abandoning your spreadsheet — it's keeping the sheet as your tracker and letting a purpose-built tool handle the chasing. Dedicated payment reminder tools (Saldetto is ours; there are others) exist precisely to handle the four things the script can't:
- Escalation sequences built in: friendly at day 3, firm at day 14, final at day 30, without you writing state-machine logic. You can preview what those emails should sound like before you ever automate them.
- Reply detection: when a client responds, the sequence pauses instead of steamrolling the conversation.
- Payment awareness: mark an invoice paid in one place and every scheduled reminder for it stops.
- Someone else's problem when it breaks: deliverability, quotas, and "did it actually send today" are the tool's job, not yours.
Getting your sheet's data in is usually a CSV import or a Zapier/Make connection ("new row with status unpaid → create invoice in reminder tool"), so you can automate follow up emails from a spreadsheet without retyping anything. Setup is a one-time 20–30 minutes, versus the ongoing maintenance tax of a script.
The honest cost comparison: the script is free but bills you in attention — debugging triggers, updating logic, and the occasional awkward email to a client who already paid. A tool runs $10–30/month. If one reminder sequence gets one $500 invoice paid two weeks sooner, the tool covered its year. (If you're charging late fees on those overdue invoices, the late fee calculator will show you what the delay is actually costing you.)
The decision in one paragraph
Send automatic payment reminders from your Google Sheets invoice tracker with the Apps Script above if you have fewer than ~10 open invoices, clients who mostly pay after one nudge, and tolerance for occasional script surgery. Connect the sheet to a dedicated tool the moment you need escalating sequences, the moment a client gets a robo-reminder mid-conversation, or the moment you catch yourself checking whether the script ran. The spreadsheet stays either way — the only question is whether the chasing is held together by your code or by something built for it.
And whichever route you take today, paste the script in this afternoon. A clumsy automated reminder beats the polished follow-up you keep not sending.