Skip to content
Little Red Bot AI automation for Singapore SMEs
Playbooks13 min readSource-verified · our method

Automate your invoice chasing in one afternoon (free template)

Build a polite, persistent invoice-reminder machine: a 7/14/30-day email ladder that runs itself from a Google Sheet. Free n8n template included, plus Make and Zapier routes. Checked 26 Aug 2026.

Intermediate⏱One afternoon (about 45 minutes of build once n8n is running; Step 3 is the logic)💳S$0 self-hosted (a small VPS is about US$4/month); n8n Cloud from €20/month; Make and Zapier routes priced insidefinance/admin🧰n8n · Google Sheets · Gmail

Published 26 Aug 2026 · Facts checked 26 Aug 2026

What you'll have by tonight: a workflow that reads your invoice list from a Google Sheet every morning at nine, works out who's overdue, and sends the right reminder: friendly at 7 days, firmer at 14, final at 30. Then it writes down what it sent, so nobody gets nagged twice. You'll never again discover in week five that nobody chased the S$8,400 invoice from week one.

No statistics theatre here. If you run a services business in Singapore, you already know late payment is a cash-flow tax, and that chasing feels awkward, so it gets skipped. The fix isn't motivation. It's a machine that is politely incapable of feeling awkward.

Is this for you?

Build it if you send roughly ten or more invoices a month, some of them drift past due, and the chasing keeps not happening. You (or your one technical person) need to be comfortable importing a file into n8n and editing a few lines at the top of a code block. That's the whole "technical" bit, and the template does the rest.

Skip it if any of these are true:

  • Three or four invoices a month, clients who mostly pay on time. A monthly calendar reminder and five minutes of bookkeeping beat maintaining any workflow. Automation is worth it on repetition. Below roughly ten receivables a month this is a hobby, not a saving. (More on where that line sits in the Make vs Zapier verdict.)
  • Your accounting software already chases. Xero and QuickBooks both have built-in reminders. Native beats glued-on, so switch theirs on first. This template is worth it when you want a custom ladder and copy, reminders across systems your accounting tool doesn't see, or a LastReminded audit trail your whole team can read in a sheet. (Xero vs QuickBooks for Singapore if you're choosing.)
  • You want the reminders on WhatsApp. Not out of the box, and that's deliberate. Customer-facing WhatsApp needs Meta's Business Platform setup and template approvals (the app-vs-API split). Email is the right channel for money conversations anyway. It's calm, it's threaded, and it's evidence.

What it costs

S$0 for the software if you self-host n8n. The only bill is the small server it runs on. Verified 26 Aug 2026, the Make figures a day earlier. Prices move, so click through before you budget.

RouteThe softwareWhat you actually pay
n8n, self-hosted (what the template targets)Free. n8n's pricing page describes the Community Edition as "A standard, self-hosted version of n8n" that "is available on GitHub"A VPS. DigitalOcean's Droplets "start from as low as $4 per month" (that's US$)
n8n CloudStarter is "20€ /mo, billed annually" for "2.5K workflow executions with unlimited steps", and "No credit card required" for the trial (n8n pricing)About €20 a month on the annual toggle. The page offers a "Monthly" or "Annually (Save 17%)" toggle, so the monthly rate is higher
MakeFree plan "Up to 1,000 credits/mo"; cheapest paid plan US$10.59/mo billed monthly, US$9/mo billed annually (Make pricing, live page 25 Aug 2026)S$0 to start. The free tier will usually cover a daily invoice sweep for a small firm
ZapierFree is "Free forever $0 /month" with "100 tasks per month", but only "Two-step Zap workflows". This build has five steps, so you need Professional, "Starting from $19.99 /month" (the yearly toggle; $29.99 billed monthly when we read the page on 25 Aug 2026)Paid from day one

Why n8n is so cheap here. n8n bills per workflow execution "regardless of complexity", and this workflow runs once a day. That's about 30 executions a month (our arithmetic, one run a day), against a Starter allowance of 2,500. You will not get near it. If you ever do outgrow Starter, Pro is "50€ /mo, billed annually" for "10K workflow executions" on the same page.

Whatever you pick, the Sheet and the emails are free. You're only ever paying for the thing that presses the button at nine o'clock.

Pick your engine (three options)

Option A — n8n, self-hosted (what our template targets). You pay only for somewhere to run it. Choose this route if you, or your one technical person, can follow a Docker tutorial. It's the cheapest at volume, and your data stays on your box. n8n's own docs cover the install; this playbook starts at the moment you can open the n8n editor.

Option B — n8n Cloud. Same template, no server. Start on the trial ("No credit card required"), then Starter. Choose this if self-hosting sounds scary but you still want the template exactly as shipped.

Option C — Make or Zapier. No server, a visual canvas, and you rebuild the same five stages with their modules instead of importing our file. Make's free tier will usually cover a daily sweep. Zapier needs a paid plan because the free tier stops at two steps. Pick one of these only if your team already lives in it. Full comparison: Make vs Zapier for Singapore SMEs.

Before you start (about 15 minutes)

  1. A Google account. The template reads a Google Sheet and sends from Gmail. Not on Gmail? You'll swap one node for n8n's Send Email (SMTP) node in Step 2, so have your SMTP details handy.
  2. An n8n you can log into. Self-hosted, or an n8n Cloud trial.
  3. Your receivables. Every unpaid invoice, with the client's email and the due date. Step 1 turns this into the sheet, and doing it is a useful audit on its own.
  4. The template. Download invoice-chaser-n8n.json and the README. Both live on the templates page.

Build it, step by step

Step 1 — Set up the sheet (10 minutes)

One Google Sheet, one tab named Invoices, and these columns in row 1, exactly:

InvoiceNo | ClientName | Email | AmountSGD | DueDate | Status | LastReminded

Dates go in as YYYY-MM-DD (2026-06-30). The code also reads 30/6/2026 and 30 Jun 2026, but pick one shape and stick to it. Status is either Paid or anything else (Sent, Unpaid, blank). Leave LastReminded empty; the workflow owns that column. Fill it with your real receivables.

You'll know this worked when you have a tab called Invoices with those seven headers, real rows underneath, and an empty LastReminded column.

Step 2 — Import the template and connect your accounts (10 minutes)

In n8n: Workflows → Import from file, pick the JSON. You'll see five working nodes plus four sticky notes explaining each part: a 9 am schedule trigger, a Sheets reader, a Code node with the ladder logic, a Gmail sender, and a Sheets updater.

Then, in order:

  1. Open Read invoices sheet and connect a Google Sheets credential. n8n walks you through the OAuth screens; you're granting your own instance access to your own account.
  2. Open Update LastReminded and reuse the same credential.
  3. Open Send reminder email and connect a Gmail credential. Not on Gmail? Delete this node, add n8n's Send Email (SMTP) node, and map the same three fields across: To, Subject, Text.
  4. Paste your spreadsheet ID into both Sheets nodes, replacing PASTE_YOUR_SPREADSHEET_ID_HERE. The ID is the long string in the sheet's URL between /d/ and /edit.
  5. Open Pick invoices due a reminder and edit the BUSINESS block at the top: company name, contact person, phone, PayNow or bank details. That's the only code you must touch.

You'll know this worked when all three credentials show as connected and no node has a red warning triangle.

Step 3 — Understand the ladder logic (5 minutes — really, read it)

The Code node works out daysOverdue = today − DueDate in Singapore time and picks a rung: 7+, 14+ or 30+. It skips a row when Status is Paid (any capitalisation), when Email or DueDate is empty, when the date won't parse, when the invoice is fewer than 7 days overdue, or when LastReminded is less than 6 days ago. An invoice that's 20 days overdue gets the 14-day email, not two emails.

Want different thresholds? Edit the three numbers in LADDER at the top of the node, and MIN_DAYS_BETWEEN_REMINDERS if six days is too gentle. Nothing else in the workflow needs touching.

Step 4 — Make the emails sound like you (10 minutes)

The template ships with three plain-text emails inside buildEmail() in the same Code node, already filled with your BUSINESS details. Edit them there. If you'd rather start from copy with a bit more warmth, here's ours:

Step 1 — day 7, friendly:

Subject: Invoice {{InvoiceNo}} — gentle reminder

Hi {{ClientName}},

Hope things are going well. Just a note that invoice {{InvoiceNo}} for S${{AmountSGD}} was due on {{DueDate}} and hasn't come through yet. Quite possibly it's already in motion — if so, please ignore this.

If it's slipped through the cracks (happens to all of us), the payment details are on the invoice. Give me a shout if you'd like it resent.

Thanks!

Step 2 — day 14, firmer:

Subject: Invoice {{InvoiceNo}} — now 2 weeks overdue

Hi {{ClientName}},

Following up on invoice {{InvoiceNo}} (S${{AmountSGD}}, due {{DueDate}}) — it's now more than two weeks past due and I haven't heard back.

Could you let me know when payment will be made? If there's an issue with the invoice or the work, tell me directly and we'll sort it out.

Regards,

Step 3 — day 30, final notice (still no lawyers):

Subject: Final reminder — invoice {{InvoiceNo}}, 30 days overdue

Hi {{ClientName}},

Invoice {{InvoiceNo}} for S${{AmountSGD}} is now a month past its due date of {{DueDate}}, with two reminders sent. I need payment or a payment date within the next 7 days.

If payment has been made in the last day or two, thank you — please disregard. Otherwise I'll pause further work until this is settled.

Regards,

Keep your edits in the same temperature range: warm → direct → firm. Threats you wouldn't act on train clients to ignore you. The emails send from your own Gmail address, so a "sorry, paying today!" lands in your inbox, where you want it. The template also switches off n8n's promotional footer on the email node. A payment chaser is no place for someone else's ad.

Step 5 — Set the clock and switch it on (2 minutes)

The schedule trigger is set to 9 am daily, and the workflow's time zone is Asia/Singapore in its settings. Check both, then toggle the workflow to Active. Until you do that, nothing runs on its own, however well the manual test went.

You'll know this worked when the workflow shows as Active and the next run time reads 09:00 Singapore.

Test it works (15 minutes)

Do this before the schedule is switched on, with the workflow inactive.

  1. Add two fake rows pointing at your own email address: one 8 days overdue, one 31 days overdue. Leave a real Paid row in the sheet too.
  2. Run the workflow manually (Execute workflow). Check three things: the day-7 and day-30 emails arrived, LastReminded got today's date on both fake rows, and the Paid row stayed silent.
  3. Run it manually again, straight away. Nothing should send. That's the 6-day guard doing its job.
  4. Delete the fake rows, activate the schedule (Step 5), and wait for tomorrow's 9 am run. Watch the run history for the first week. Until it has fired on its own once, the build isn't finished.

When it doesn't

Nothing sends at 9 am, but the manual run works. The workflow isn't Active, or the time zone in the workflow settings isn't Asia/Singapore, so it fired at a different hour. Fix the setting and toggle it on.

Nothing sends at all, even manually. The Code node found nothing to send, which is usually the sheet, not the code. Check in order: no row is 7 or more days overdue yet; the Status cell says Paid; Email or DueDate is blank; the date is in a shape the code can't read (use YYYY-MM-DD); or LastReminded is within the last 6 days.

Someone got the same reminder two days running. LastReminded isn't being written back. Open Update LastReminded: it needs the same spreadsheet ID and credential as the reader, and the header must be spelled LastReminded exactly.

A paid client got chased. Their Status cell doesn't say Paid. The code accepts paid, PAID and Paid , but not Paid on Tuesday or Settled. Mark rows Paid promptly. That word is the workflow's off switch.

The amount in the email looks wrong. The AmountSGD cell has text the formatter can't turn into a number, so it prints S$ followed by whatever is in the cell. Put a plain number in the cell; the code adds the S$ and the commas.

The Gmail node errors. The credential isn't connected, or you're not on Gmail. Reconnect it, or swap in the Send Email (SMTP) node as in Step 2.

Each email carries an n8n footer. You rebuilt the send node from scratch and the attribution option came back on. On the node, Options → switch off "Append n8n Attribution".

Your data (read this one)

Your invoice list is personal data. Client names, email addresses, amounts owed and how late they are. Under Singapore's PDPA, using a client's email to chase an invoice for work they engaged you for is using it for the purpose it was given to you. That's ordinary business use. What you must not do is quietly add those addresses to a marketing list. That's a different purpose and needs its own consent. The template's PDPA sticky note says the same thing, where your team will actually see it.

What moves, and where. Every morning the workflow reads the whole Invoices tab and, for the rows that need a reminder, sends an email through your own Gmail account. On self-hosted n8n that processing happens on your server. On n8n Cloud it happens on n8n's: their pricing page states "For cloud plans, data is stored within the EU, on servers located in Frankfurt, Germany. For self-hosted plans, it's wherever you decide to host n8n." On Make or Zapier the rows pass through their servers as the scenario runs.

Housekeeping. Restrict the sheet to whoever handles billing. Archive or delete rows once an invoice is settled. And the run history in n8n keeps a copy of each execution's data for as long as your retention setting says, so treat that log as part of the sheet.

Switch it off

To pause it, toggle the workflow inactive in n8n. It stays built.

To remove it properly:

  1. Delete the workflow in n8n.
  2. Revoke n8n's access to your Google account from Google's side, in your Google Account's security settings under third-party access. That's the step that truly cuts the connection.
  3. If you self-hosted just for this, delete the Droplet so the US$4 stops.
  4. On Make or Zapier, delete the scenario or Zap and revoke Google access the same way.

Your Google Sheet is yours throughout. Keep it, export it, or delete it.

What's next

Reconcile the sheet weekly. The workflow only ever knows what the sheet knows. Clients who pay by cheque or by bank transfer with no reference still need someone to mark the row Paid, and a stale sheet sends awkward reminders.

Copy your accounts person. Add a cc field on the send node and the whole ladder is visible to whoever does the books.

Before you buy anything bigger, run it quietly for a fortnight, then put your numbers through the grant-stacking calculator. And if a vendor quotes you a five-figure "automation package" for what you just built free, you know which article to read next. The real cost of automation covers the maintenance side that "free" doesn't.

FAQ

I use Xero or QuickBooks. Do I need this? Check their built-in reminders first. Native beats glued-on. Build this when you want a custom ladder and copy, reminders across systems your accounting tool doesn't see, or an audit trail your whole team can read in a sheet.

Is emailing payment reminders okay under the PDPA? Chasing your own invoices is using a client's contact details for the purpose they were collected for. Yes. Just don't reuse the list for marketing without separate consent. See "Your data" above.

Can it send WhatsApp reminders instead? Not out of the box. Customer-facing WhatsApp needs Meta's Business Platform and template approvals, and email is the better channel for money conversations anyway. It's calm, threaded, and it's evidence.

What if I invoice in another currency? The sgd() helper in the Code node formats amounts as S$ with two decimals. Edit that helper if you invoice in something else.

Everything above was written from the template itself and each vendor's official pricing page on 26 August 2026 (Make's on 25 August, read on the live page). That's what Level 1 research means on this site. Screens move; if a button has been renamed, the thing you're looking for is described in words next to it. More builds like this one are in the playbooks library.

Sources

Every factual claim above traces to one of these, fetched on the fact-check date in the byline.

  1. n8n pricing — Community Edition is 'a standard, self-hosted version of n8n… available on GitHub'; Cloud Starter '20€ /mo, billed annually', '2.5K workflow executions with unlimited steps', 'No credit card required'; cloud data stored in Frankfurt (fetched 26 Aug 2026)
  2. DigitalOcean Droplet pricing — Bundled Plans 'start from as low as $4 per month' (fetched 26 Aug 2026)
  3. Make pricing — Free 'Up to 1,000 credits/mo'; cheapest paid plan US$10.59/mo billed monthly, US$9/mo billed annually (figures read on the live page, 25 Aug 2026)
  4. Zapier pricing — Free 'Free forever $0 /month', '100 tasks per month', 'Two-step Zap workflows'; Professional 'Starting from $19.99 /month' on the yearly toggle, 'Multi-step Zap workflows' (fetched 26 Aug 2026; $29.99 billed monthly read on the live page 25 Aug 2026)

How we're funded: some links on this page are affiliate links — if you sign up through one, we may earn a commission, at no extra cost to you. It never changes what we recommend. Full disclosure.

Get the next one in your inbox

The Red Dot Report — one useful automation email a week.