If your business does work that repeats on a schedule — septic pump-outs every two or three years, HVAC filter swaps every few months, gutter cleaning every fall, landscaping contracts that renew each season — the money isn't in the first job. It's in the client you never had to re-sell, because you called them before they even remembered they were due. Most small operators lose that repeat revenue not because they don't want it, but because nobody is tracking who's due for what and when. This weekend, build a simple system that tracks it for you and sends the reminder automatically.
What you're building
A Google Sheet with one row per client, holding their last service date and how often that service repeats, plus a small Google Apps Script that runs once a day, works out who's coming due, and sends an email — to you, to the client, or both. No paid software and no subscription: it runs entirely inside the Google account you probably already use for email.
The sheet
Set up six columns: Client Name, Email, Service, Last Service Date, Interval (Months), and Last Reminder Sent. That last column matters — it's how the script avoids nagging the same client every single day once they're overdue.
The script
In the sheet, open Extensions > Apps Script and write a function that loops through every row, calculates the next-due date from the last service date plus the interval, and compares it to today. Something like this:
function checkReminders() {
const sheet = SpreadsheetApp.getActiveSheet();
const rows = sheet.getDataRange().getValues();
const today = new Date();
for (let i = 1; i < rows.length; i++) {
const [name, email, service, lastDate, months, lastReminder] = rows[i];
if (!lastDate || !months) continue;
const dueDate = new Date(lastDate);
dueDate.setMonth(dueDate.getMonth() + Number(months));
const daysOut = (dueDate - today) / (1000 * 60 * 60 * 24);
const alreadySent = lastReminder &&
new Date(lastReminder).toDateString() === today.toDateString();
if (daysOut <= 14 && daysOut > -30 && !alreadySent) {
MailApp.sendEmail(email, `Time for your ${service}`,
`Hi ${name}, our records show your ${service} is coming due. Reply to this email or call us to book.`);
sheet.getRange(i + 1, 6).setValue(today);
}
}
}Adjust the 14-day lookahead and the 30-day cutoff to fit your business — a septic company might want a 60-day window, a filter-change service might only need two weeks.
Make it run itself
In the Apps Script editor, click the clock icon for Triggers, add a new trigger for checkReminders, set the trigger type to time-driven, and choose a daily timer for whatever hour you want it to run. Google's own documentation on installable triggers covers the setup if you want finer control, such as running the check hourly instead of daily.
Let Gemini do the typing
You don't have to write the script above by hand. Google has been pushing Gemini deeper into Sheets — an April 2026 update lets Gemini build and edit entire spreadsheets from a plain-language description, including formulas and structure. If JavaScript isn't your thing, open Gemini in Sheets and describe what you want the reminder logic to do; it will draft something close for you to read and adjust, which is exactly the kind of first draft worth handing off rather than starting from a blank script editor.
If you'd rather skip spreadsheet scripting altogether, Google separately rolled out Scheduled Actions in the Gemini app, which lets you set up a recurring prompt that runs on its own without touching Apps Script. It's a lighter option if your reminder logic is simple and doesn't need to live inside your own spreadsheet.
Before you turn it loose
- Don't email clients directly until you trust it. Point the first few weeks of reminders at your own inbox, confirm the due dates are calculating correctly, then switch the recipient over to the client.
- Get separate consent for texting. If you later extend this to SMS through a service like Twilio, make sure clients have actually agreed to receive texts — unsolicited text marketing carries real legal exposure that an email reminder about work you already did for them generally doesn't.
- Keep the sheet as the single source of truth. Update the last-service date the same day you finish the job, or the whole system quietly drifts out of sync with reality.
None of this needs new software or a subscription — just an hour or two this weekend turning a spreadsheet you probably already keep into one that works for you. The payoff shows up the first time a client says "oh, I was wondering when I was due for that" instead of you finding out they went with someone else.
