See llms.txt for all machine-readable content.

Back to Templates

Send quote and invoice follow-up emails with Google Sheets and Gmail

Quick overview

Follow up on open quotes and chase unpaid invoices from one Google Sheet. Every weekday morning, the workflow sends the next due email via Gmail, saves the stage so nothing is sent twice, and emails you a summary with a call list.

How it works

  1. Runs every weekday at 8:00 on a schedule.
  2. Loads configuration values (sheet URL/tab, follow-up day ladders, owner email, payment details, and dry-run mode) and reads all rows from the specified Google Sheets tab.
  3. For each open quote or invoice row, calculates how many days have passed since the row’s date, validates required fields (type, date, client email), and decides whether to send the next due follow-up, add the row to a call list, or flag it for attention.
  4. Sends due follow-up emails through Gmail (or routes them to your owner email in dry-run mode) and captures any send failures for retry on the next run.
  5. If not in dry-run mode, updates Google Sheets for successfully sent emails by writing the new follow-up stage and last-sent date back to the matching row.
  6. Compiles a daily summary (sent, failed, call list, and skipped rows needing fixes) and emails it to you via Gmail.

Setup

  1. Create a Google Sheet tab with the columns type, number, client_name, client_email, amount, date, status, last_stage and last_sent_at. Use quote or invoice as type and open as status, and write the amount with its currency (for example 1,250.00 EUR). Enter the date as a date cell or as YYYY-MM-DD text: the quote's send date or the invoice's due date. Leave last_stage and last_sent_at empty. n8n finds each row by its row number, so you don't need an ID column.
  2. Connect Google Sheets credentials (read and update) and a Gmail credential for sending the follow-ups and the daily summary.
  3. In the Settings values, set your Google Sheet URL and tab name, owner email, sender details/payment details, and adjust quote_days, invoice_days, and call_after_days as needed.
  4. Run with dry_run set to true to verify email content and recipients, then set dry_run to false before activating so the workflow emails clients and updates the sheet.

Requirements

  • A Google account with access to Google Sheets and Gmail

Customization

  • Set a row's status to paid, won or lost to stop its follow-ups

Additional info

At most one email per row and run: if the workflow was off for a while, it sends only the highest due stage instead of several emails at once. The summary email arrives on every run, also when nothing was due, so a missing summary means the workflow didn't run.

Limits: replies and bounces are not read. Gmail accepts a message to a wrong address and the bounce arrives later, so check addresses in the sheet and change a row's status yourself when a client answers. If Gmail sends but the sheet update fails, the same email can go out again the next day. The schedule uses your n8n instance time zone.