Every freelancer knows the invoice that goes into the void.
You did the work. You sent the PDF. "Net 30" in the footer like it means something. Day 31 comes and goes. Now there's $4,250 sitting in someone else's account, and the only way to get it is to write the email you least want to write — the one where you chase your own money and try not to sound desperate. So you don't. You tell yourself you'll do it Monday. Monday you find something else to do.
The tedious part isn't writing one reminder. It's that the right moment to send it is different for every client, and you have no idea what it is.
Net-30 is a lie your accounting software tells you
Here's the thing I learned staring at a spreadsheet of paid invoices: the due date has almost nothing to do with when people pay.
One client pays like clockwork — 3 days before due, every time. Another pays 12 days late but always pays, and a reminder before day 12 just annoys them. A third only pays when you nudge, and the nudge has a 4-day lag. If you send everyone the same "friendly reminder on day 31," you're early for some, late for others, and wrong for most.
The interesting problem isn't writing reminders. It's estimating each client's personal payment distribution and firing at the point where a nudge actually moves the date.
Model the client, not the invoice
Every client is a tiny time-series. For each one, collect the gap between issue date and paid date across their history:
# days-to-pay samples for one client
history = [28, 31, 33, 30, 45, 29] # 45 was the holiday one
# robust center + spread (median beats mean — one late pay skews it)
import statistics as st
median = st.median(history) # 30.5
mad = st.median([abs(x - median) for x in history]) # 1.5
# the window where a nudge is worth sending
nudge_start = median - 2*1.4826*mad # ~26 days
nudge_end = median + 2*1.4826*mad # ~35 days
MAD (median absolute deviation) instead of standard deviation matters more than it looks: one holiday-delayed payment shouldn't widen the whole window. You want the typical rhythm, not the worst case.
The signal you're really after is: is this invoice tracking behind this client's own baseline? Day 30 means nothing in the abstract. Day 30 for someone who always pays by day 27 is a real anomaly worth a nudge. Day 30 for the reliable-day-40 client is noise.
Cold start: you have no history
New client, zero samples. You can't model a distribution from nothing, so you fall back to a prior — a payment-terms segment (industry, invoice size, agency vs. direct) — and update toward the client's real behavior as payments land. Two invoices in, the prior barely matters. It's just enough to not send a tone-deaf reminder on day one.
estimate = (k * prior + n * client_median) / (k + n)
# k = prior strength (~2), n = number of real samples
The part everyone gets wrong: the words
A perfectly-timed reminder that reads like a debt collector still costs you the relationship. The timing model tells you when; the harder half is what, and it has to sound like you — same greeting, same sign-off, same amount of "hey, no rush but."
The trick we landed on: don't generate from scratch. Extract a voice profile from the user's already-sent emails (greeting style, formality, whether they use the client's first name, how they hedge), then condition the draft on both the profile and the situation — 4 days behind baseline reads different from 20 days behind. Early: light touch. Overdue past the whole distribution: warmer, firmer, and it offers a path (payment link, "want me to split this?").
And critically — it drafts. It never sends on its own. You still hit approve. The AI removes the dread of the blank compose window and the "is now the right time" second-guessing; you keep the final say on your own client relationship.
What actually changed
Once the moment is computed per client and the words show up pre-written in my voice, the invoice stops being a thing I avoid. There's no Monday-that-never-comes. The reminder is just there, correct, waiting for one click.
That's what we built into Kynth Invoices — it watches every invoice, learns each client's rhythm, and drafts the nudge at the moment that client actually pays.
Try it → https://kynth.studio/l/invoices
Top comments (1)
Some comments may only be visible to logged-in visitors. Sign in to view all comments.