The Problem With Manual Chasing

Most freelancers have the same issue: the invoice goes out, payment terms are NET 30, and then… nothing. Following up feels uncomfortable. You don't want to damage the relationship. You write a polite email, wait another week, write another one. Some invoices just quietly age into uncollectable debt.

Our client had six overdue invoices ranging from £400 to £2,200. The oldest was 94 days old. She'd sent one follow-up email to each client and then avoided it. Total outstanding: £8,340.

The System We Built

We used n8n connected to Stripe (her billing tool) and Gmail. The workflow runs every morning, checks Stripe for unpaid invoices past their due date, and sends escalating reminder emails based on how overdue the invoice is.

Trigger: n8n Cron — runs daily at 08:00
Stripe: List all invoices with status = 'open' + due_date < today
n8n Function: Calculate days overdue, assign escalation tier
n8n IF node: Route by tier (7d / 14d / 30d / 45d+)
Gmail: Send personalised email for that tier
Google Sheets: Log action taken + timestamp

The Escalation Tiers

This is where the real work was. We wrote four email templates that escalate in tone without ever becoming hostile:

Each email is personalised with the client's name, invoice number, amount, and a direct link to the Stripe payment page. The system also tracks whether an email was already sent at each tier, so clients don't get the same reminder twice.

⚠ Important: the workflow checks a "last_contacted" column in Google Sheets before sending. If a client was emailed less than 48 hours ago (e.g. they replied and she sent a manual response), no automated email goes out. Human override is always possible.

What Happened

Within the first week, three of the six overdue clients paid. Two of them responded to the Tier 1 nudge — they'd genuinely forgotten. One responded to the Tier 2 email with an apology and same-day payment. The remaining three needed Tier 3 messages before responding.

The £2,200 oldest invoice (94 days) took a Tier 4 message and a manual follow-up call she made herself — but the automated escalation created the urgency that made her finally pick up the phone.

// outcome — 6 weeks post-launch

The Technical Nuances

Stripe's invoice API is well-documented but has a few gotchas. The due_date field is only populated if you set payment terms explicitly — if you use Stripe's default, invoices may not have a due_date at all. We handled this by falling back to created + 30 days when due_date is null.

The Gmail node needed OAuth setup, which is straightforward but requires a Google Cloud project. The whole system was running in under a day. Ongoing maintenance: essentially zero.

Can You Build This?

If you're comfortable with n8n and the Stripe API, yes — this is a solid weekend project. The email templates take the most thought. If you'd rather not spend the weekend on it, we build this kind of system for a fixed price, and it typically pays for itself within the first recovered invoice.