Late invoices are normal. What burns the relationship is either silence or a sudden angry email. A better default is a short, staged reminder cadence: same facts every time, tone that steps up only as days pile up, and numbers you can prove.
This is the workflow we use in Kitwise Studio's free Invoice Chaser sample. Full write-up, downloads, and a worked Claude run live on the Invoice Chaser late-fee guide.
1. Collect the facts before you write
You need:
- Invoice number, amount, issue date, due date
- Client name and what you delivered
- Payment terms (especially any late-fee clause). If the contract never said a late fee, do not invent one in the email
- Reminders already sent and any replies
- Today's date and a payment link (or a clear "reply with how you want to pay" line)
2. Pick a stage from days overdue (and never go backwards)
A simple convention (not a legal rule):
| Stage | Rough window | Tone |
|---|---|---|
| 1 Friendly | 1-7 days late | Assume the invoice got lost |
| 2 Firm | 8-21 days | Clear ask + a date |
| 3 Final notice | 22-44 days | Spell out next step you will actually take |
| 4 Escalate | 45+ days | Pause work / formal demand / collections (only if you mean it) |
If you already sent stages 1 and 2, do not send "friendly" again just because you restarted the thread. Move forward only.
3. Check the late fee offline (optional, only if your terms allow it)
If your contract states a monthly rate on overdue balances, you can verify the fee with a small Python 3 script (standard library only, no API key, no network). Formula: simple interest, no compounding:
amount × monthly_rate × 12 / 365 × days_overdue
Example (made-up invoice):
python3 late_fee.py --amount 2400 --due 2026-09-15 --today 2026-10-16 --monthly-rate 0.015
Expected for that input: 31 days overdue, late fee $36.69, total $2,436.69, stage 3. The free sample ships late_fee.py, run-script.sh, and expected-script-output.json so you can run bash run-script.sh and get a PASS when the math matches.
If your terms state no late fee, run with --monthly-rate 0 and leave fees out of the email.
4. Draft the email: short, exact, one ask
Keep it under about 150 words. Every draft should include:
- Subject with invoice number
- Amount and original due date
- Days overdue (and late fee only if terms allow)
- Payment link or clear next action
- One ask with a date ("please confirm payment by Friday")
Tone by stage:
- Friendly: "Just checking this landed. Happy to resend the PDF."
- Firm: "Still open on my side. Can you confirm a payment date this week?"
- Final notice: State the real next step you will take (pause new work, formal letter, etc.). Do not threaten something you will not do.
- Escalate: General options only; this is not legal advice and depends on your contract and jurisdiction.
Read every draft before you send it. A drafting helper can write the first pass. You own the send.
5. Put the next reminders on a calendar
Default spacing that works for many solo freelancers: +7, +14, +21 days from today, each at the next stage. When the client replies "we'll pay next week," write the date back. If they ask for installments, offer a short 2-3 part plan with dates instead of a vague "whenever."
Free workflow files
Download the free Invoice Chaser sample (MIT): SKILL.md, late_fee.py, run-script.sh, and the expected JSON. The longer guide (linked at the top) walks through a full Claude.ai run on a made-up packaging invoice, including the status line and follow-up schedule.
Optional related product (list price only)
If you also want fillable invoice and quote PDFs with an invoice log for days overdue, Kitwise's Invoice & Quote Set is $9.99. Not required for the free late-fee check.
Top comments (0)