Projects / Demo
Invoice Follow-ups
n8n demo · All data is synthetic · Nothing is sent
I built this demo around a job most small businesses do by hand and put off: chasing unpaid invoices. From working in payments, first as a software engineer at i2c and now as a fintech/payments PM, I know the hard part isn't sending a reminder, it's not sending the wrong one, like nagging someone who already paid, sending two reminders in two days, or sending a final notice to a customer who's disputing the bill. So I wrote the rules down first: a friendly nudge before the due date, then gentle, firm, and final reminders as an invoice ages, a cooldown between emails, the remaining balance on part-paid invoices, and no automated email at all for disputes, which go to a person instead. Then I built it as an n8n workflow that reads a list of invoices, picks the right step for each one, drafts the email, and writes a short daily summary of what needs a human. I made up 16 invoices so each rule gets exercised, and a check script confirms that every invoice gets the action I expected. The data is synthetic and nothing is actually sent, so it's a demo, but going live mostly means swapping the CSV for Stripe or QuickBooks and the file output for Gmail.
How it works
Manual / daily trigger → Run Config → Read + Parse invoices.csv → Classify & Draft (Code) → [action_log.csv, email drafts, summary.md]Rules, checked in order
SKIP_PAIDStatus is paid or the balance is zero.
HOLD_DISPUTEDDisputed invoices get no automated email and are flagged for a person.
NOT_DUEMore than 3 days before the due date.
COOLDOWNA reminder already went out in the last 5 days, so skip today.
PRE_DUE_NUDGEDue within 3 days. A friendly heads-up.
GENTLE0 to 7 days overdue.
FIRM8 to 21 days overdue. Asks when payment is coming.
FINAL22 or more days overdue. Final reminder, the owner is CC'd, and it's flagged for a person.
Demo
A short walkthrough made from the screenshots below, not a screen recording. Emails are written to files as drafts; nothing is sent.
Screenshots




Stack
n8n 2.8.4 (self-hosted via npm, SQLite), Node 20 in the Code nodes, Python 3 for data generation and checks. The invoices are a local CSV, and "today" is pinned in the config so the demo gives the same result every time.
This is a demo. The 16 invoices are synthetic, the businesses are made up, emails use the reserved .example domain and nothing is actually sent.