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_PAID

Status is paid or the balance is zero.

HOLD_DISPUTED

Disputed invoices get no automated email and are flagged for a person.

NOT_DUE

More than 3 days before the due date.

COOLDOWN

A reminder already went out in the last 5 days, so skip today.

PRE_DUE_NUDGE

Due within 3 days. A friendly heads-up.

GENTLE

0 to 7 days overdue.

FIRM

8 to 21 days overdue. Asks when payment is coming.

FINAL

22 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

The n8n workflow canvas
The n8n workflow canvas
A successful run
A successful run
The action log and daily summary
The action log and daily summary
Sample drafted emails
Sample drafted emails

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.