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: DistributionTwo systems, one screen