Daily
Send polite payment reminders by email and text
Customers or tenants with overdue payments get polite reminders by email and text, stepping up gently over time.
- Runs
- Daily
- Apps
- Gmail, Twilio
- AI
- Not needed
- Access
- gmail.send; Twilio
Send this to your assistant
Create a ClickRuntime automation: every morning, read my overdue list; send a friendly email and text at 3 days overdue, a firmer reminder at 10 days, and a final one at 21 days, and record which reminder each has had.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
Small landlords and service businesses hate chasing money. Reminders get sent late or not at all, and the conversation becomes awkward when it finally happens.
Sending polite reminders on a fixed schedule, by email and text, keeps payments coming in without anyone having to write a single chasing message, and the steps make clear the reminders are routine, not personal.
What you get out of it
Paid sooner
Prompt, regular reminders shorten the time money is outstanding.
No awkward chasing
The messages are routine and polite, sent for you.
Escalates gently
Reminders get firmer only as time passes.
Never sent twice
Each reminder stage is recorded per invoice.
How it works
What happens, step by step
Every morning it reads your overdue list.
For each item, it works out how many days overdue it is and which reminder stage applies.
If that stage hasn't been sent yet, the person gets the matching email and text.
The stage is recorded so each reminder is only sent once.
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 Twilio
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
- Add an AI step, for example to summarize, sort or draft a reply
- Add another app, for example also send it to Slack
- Combine it with other Gmail and Twilio steps into one automation
Under the hood
The code that runs this automation
from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
from twilio.rest import Client
import base64
from datetime import date
from clickruntime import on_trigger, credentials, http, state
OVERDUE = "https://billing.example.com/api/overdue"
STAGES = [(3, "a friendly reminder"), (10, "a second reminder"), (21, "a final reminder")]
FROM = "+15005550006"
def sms(to, body):
return Client(credentials.secret("TWILIO_ACCOUNT_SID"), credentials.secret("TWILIO_AUTH_TOKEN")).messages.create(to=to, from_=FROM, body=body)
gmail = lambda: build("gmail", "v1", credentials=Credentials(credentials.connection("google", "work")), cache_discovery=False).users()
def send_email(to, subject, text):
gmail().messages().send(userId="me", body={"raw": base64.urlsafe_b64encode(f"To: {to}\r\nSubject: {subject}\r\n\r\n{text}".encode()).decode()}).execute()
@on_trigger
def run(event):
items = http.get(OVERDUE, headers={"Authorization": f"Bearer {credentials.secret('BILLING_TOKEN')}"}).json()
sent = 0
for it in items:
days = (date.today() - date.fromisoformat(it["due_date"])).days
stage = max((i for i, (d, _) in enumerate(STAGES) if days >= d), default=-1)
if stage < 0 or (state.get(f"stage:{it['id']}") or -1) >= stage:
continue
text = f"Hi {it['name']}, this is {STAGES[stage][1]} that {it['amount']} was due on {it['due_date']}. Pay here: {it['pay_url']}"
send_email(it["email"], f"Payment reminder: {it['amount']}", text)
if it.get("phone"): sms(it["phone"], text[:300])
state.set(f"stage:{it['id']}", stage); sent += 1
return {"sent": sent}FAQ
Common questions
Where does the overdue list come from?
Can I change the wording and timing?
What happens once they pay?
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
Get a text and an email when a value crosses your limit
When a value you watch, like a price, temperature or reading, crosses your threshold, you get a text and an email once, not every check.
See how it worksConfirm appointments, remind clients and rebook no-shows
Clients get an email and text confirming their appointment, a reminder the day before, and a rebooking message if they don't turn up.
See how it worksWin back abandoned carts by email, then text
Shoppers who leave checkout get a reminder email after an hour and a text the next day if they still haven't bought.
See how it worksKeep exploring
Set up “Send polite payment reminders by email and text” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.