Daily
Send overdue invoice reminders from a sheet
Clients with unpaid invoices get a polite reminder, then firmer ones after 14 and 30 days, and the sheet records when each was sent.
- Runs
- Daily
- Apps
- Gmail, Google Sheets
- AI
- Optional
- Access
- Sheets read+write; Gmail gmail.send
Send this to your assistant
Create a ClickRuntime automation: every weekday, check my Invoices sheet for unpaid invoices past due, email the client a reminder (firmer after 14 and 30 days) and log the reminder date.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
A freelance designer tracks invoices in a spreadsheet. Most clients pay on time. A few do not, and chasing them is awkward enough that she puts it off, so a 30-day invoice turns into a 90-day one. Cash flow suffers, and the eventual email is more uncomfortable than an early nudge would have been.
This automation sends the reminders for her on a sensible schedule, starting friendly and getting firmer, so late payments are chased every time without her having to write each email.
What you get out of it
Paid sooner
A reminder on the day after the due date catches the invoices that were simply forgotten, which is most of them.
No awkward emails to write
The tone steps up at 14 and 30 days on its own, so you are never deciding how firm to be with a client.
A record of every chase
The sheet shows which reminder went out and when, which helps if you later need to escalate or charge late fees.
Consistent with every client
Every overdue invoice is followed up the same way, so no client is chased harder than another by accident.
How it works
What happens, step by step
Every weekday morning ClickRuntime reads your Invoices sheet.
It picks out unpaid invoices whose due date has passed and works out how many days overdue each one is.
It skips any invoice that has already had the reminder for its stage.
It emails the client a reminder from your Gmail, firmer after 14 and 30 days, with optional AI help on the wording.
It writes the reminder stage and date back into the sheet.
Before it runs live
- Connect Google through your own Google app (a one-time, 10-minute setup), so it works with your own Gmail
- Connect your Google Sheets account and pick the spreadsheets it may use
What you get
Build your own
Need it to work differently?
Your own rules
Conditions, thresholds, filters and exceptions, written the way you'd explain them to a colleague.
Any number of apps
One automation can read from one app and update several others. Over 248 apps are ready, and anything with an API works too.
AI where it helps
Summaries, classification, extraction and drafts use ClickRuntime's built-in AI, with no extra key.
On a schedule or on each event
Runs as often as every 5 minutes, or the moment an app sends an event, and keeps track of what it already handled.
Changes you can ask for
- Run it at a different time, more or less often, or only on weekdays
- Change what the AI looks for, or how it writes the result
- Add another app, for example also send it to Slack
- Combine it with other Gmail and Google Sheets steps into one automation
Under the hood
The code that runs this automation
from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
import base64
from datetime import date
from email.mime.text import MIMEText
from clickruntime import on_trigger, credentials
SHEET_ID = "your-spreadsheet-id"
TONE = {1: "Just a friendly reminder that", 2: "Following up again:", 3: "Final reminder:"}
@on_trigger
def run(event):
creds = Credentials(credentials.connection("google", "work"))
sheets = build("sheets", "v4", credentials=creds, cache_discovery=False).spreadsheets()
gmail = build("gmail", "v1", credentials=creds, cache_discovery=False)
rows = sheets.values().get(spreadsheetId=SHEET_ID, range="Invoices!A2:G").execute().get("values", [])
sent = 0
for i, r in enumerate(rows, start=2):
num, client, email, amount, due, status = r[:6]
stage_done = int(r[6]) if len(r) > 6 and r[6] else 0
late = (date.today() - date.fromisoformat(due)).days
stage = 3 if late >= 30 else 2 if late >= 14 else 1 if late > 0 else 0
if status == "Paid" or stage <= stage_done:
continue
msg = MIMEText(f"Hi {client},\n\n{TONE[stage]} invoice {num} for {amount} was due on {due}. Could you let me know when it will be paid?\n\nThanks")
msg["to"], msg["subject"] = email, f"Invoice {num} is {late} days overdue"
gmail.users().messages().send(userId="me", body={"raw": base64.urlsafe_b64encode(msg.as_bytes()).decode()}).execute()
sheets.values().update(spreadsheetId=SHEET_ID, range=f"Invoices!G{i}:H{i}", valueInputOption="RAW",
body={"values": [[stage, date.today().isoformat()]]}).execute()
sent += 1
return {"reminders": sent}FAQ
Common questions
Which invoices get a reminder?
Will a client get the same reminder every day?
Do the emails come from my own address?
What permissions does it need?
Does it need AI?
How many runs does it use?
Can I change how it works?
Related
You might also like
Send personal emails to a lead sheet and follow up on no-replies
Each weekday the next batch of leads in your sheet gets your email from Gmail, people who do not reply get a follow-up, and the sheet tracks every status.
See how it worksCopy a table from a web page into a sheet every morning
Each morning the listings on a page you choose are added to your Google Sheet, and you get the same rows by email as a CSV.
See how it worksDraft a LinkedIn post from your content sheet every weekday
Each weekday you get an email with a ready-to-edit LinkedIn post about the next idea in your Content sheet.
See how it worksKeep exploring
Set up “Send overdue invoice reminders from a sheet” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.