GSFinance opsCase 04

Mark a row paid or unpaid — the right email drafts itself.

The problem

A client chased payments by hand from a Google Sheet — re-typing the same reminder emails over and over.

Our approach

We wrote a script bound to the sheet. The moment a row's status changes — paid, unpaid, reminder — it drafts the correct email from the matching template. The user just reads it and hits send.

User journey
Sheet updated
→
Trigger fires
→
Read status
→
Draft email from template
→
Review
→
Send
System architecture
☁ Google Cloud
Trigger
Apps Script onEdit
Webhook → Cloud Function
row status changed
Logic
Read statuspaid / unpaid / reminder
Template engine
pick the template
Draft
LLM draftvia LiteLLM gateway
Send
Gmail API
Idempotency guardnever double-send
Firestore log
Scales viaevent-driven triggerstemplate engineidempotent sendsrate-limited delivery
Google Sheets APIApps ScriptTemplatingEmail
Hours of chasing removedZero re-typingConsistent tone

Representative build — real project type and architecture, anonymised client, illustrative figures.

Want this for your stack?

I'll map your problem to an architecture like this — and prove it with an MVP before you pay.

Start a build →

Next: Distribution — Two systems, one screen →