Every hour
Put unpaid bills from a sheet into your calendar on their due dates
Every unpaid bill in your sheet shows up in your calendar on its due date with a reminder, and the event updates if the amount changes.
- Runs
- Every hour
- Apps
- Google Calendar, Google Sheets
- AI
- Not needed
- Access
- Sheet edit; Calendar read+write
Send this to your assistant
Create a ClickRuntime automation: for each unpaid bill in my sheet, create a calendar event on its due date with a reminder, and update it when the amount changes.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
A household and a side business share one bills sheet: rent, insurance, software, a supplier on 30-day terms. The sheet is accurate, but nobody opens it until a late fee arrives.
Putting each bill in the calendar, where everyone already looks, means due dates come with a reminder. When an amount changes, the event changes too, so nobody pays last month's figure.
What you get out of it
Fewer late fees
A reminder before each due date gives time to pay. Late charges and awkward supplier calls become rare.
Bills where you already look
Your calendar is open all day. A bill there is far harder to miss than a row in a sheet.
Amounts stay correct
When you edit an amount in the sheet, the calendar event is updated to match.
The sheet stays the source
You keep managing bills in the sheet you know. The calendar follows it.
How it works
What happens, step by step
Every few minutes, ClickRuntime reads the unpaid bills in your sheet.
For each new bill, it adds an event to your Google Calendar on the due date with a reminder.
If a bill's amount has changed since last time, it updates the existing event instead of adding another.
It writes the event link back to the row so each bill has exactly one event.
Before it runs live
- Connect Google Calendar
- 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
- Act only on the items that match your own rules, and skip the rest
- 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 Google Calendar 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
from clickruntime import on_trigger, credentials, report_fetched
SHEET_ID = "your-bills-sheet-id"
@on_trigger
def run(event):
creds = Credentials(credentials.connection("google", "work"))
values = build("sheets", "v4", credentials=creds, cache_discovery=False).spreadsheets().values()
rows = values.get(spreadsheetId=SHEET_ID, range="Bills!A2:F").execute().get("values", [])
todo = [(i, r + [""] * (6 - len(r))) for i, r in enumerate(rows, start=2)
if len(r) >= 3 and (r + [""] * 6)[3].lower() != "yes" and (r + [""] * 6)[5] != r[1]]
report_fetched(len(todo))
if not todo:
return {"changed": 0}
cal = build("calendar", "v3", credentials=creds, cache_discovery=False).events()
for i, (name, amount, due, _, event_id, _) in todo:
body = {"summary": f"Pay {name}: {amount}", "start": {"date": due}, "end": {"date": due},
"reminders": {"useDefault": False, "overrides": [{"method": "popup", "minutes": 2880}]}}
if event_id:
cal.patch(calendarId="primary", eventId=event_id, body=body).execute()
else:
event_id = cal.insert(calendarId="primary", body=body).execute()["id"]
values.update(spreadsheetId=SHEET_ID, range=f"Bills!E{i}:F{i}", valueInputOption="RAW",
body={"values": [[event_id, amount]]}).execute()
return {"changed": len(todo)}FAQ
Common questions
How far ahead is the reminder?
What happens when I mark a bill as paid?
What columns does the sheet need?
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
Invite new sheet registrants to your calendar event
Each new email in your registrations sheet is added as a guest to your event and gets a calendar invite.
See how it worksKeep a Google Sheet of every work calendar event
Your sheet always lists every event on your work calendar with its title, time, guests and status, and updates when events change.
See how it worksFill cancelled appointments from your waitlist sheet
When an appointment is cancelled, you get an email naming the next person on your waitlist to offer the slot to.
See how it worksKeep exploring
Set up “Put unpaid bills from a sheet into your calendar on their due dates” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.