Guide · Updated October 2026

Payment Follow-up Tracker in Google Sheets

Money stuck with customers is the most common problem in small businesses. Here is how to build one Google Sheet that shows who owes how much and since when — and sends a polite reminder on its own.

By Rajesh Kumar, Google Sheets & Apps Script developer

What it looks like

Each bill is one row. The sheet works out what is pending and how old it is. When a follow-up date comes, a reminder goes out and the row is updated:

Step 1: Make the Payments sheet

Name the tab Payments and put these headers in row 1. Columns H, I, K and L are formulas — you only type the others.

ColHeaderWhat goes in it
ACustomerCustomer or company name
BPhonePhone number
CEmailWhere the reminder goes
DInvoice NoINV-001
EInvoice DateDate of the bill
FAmountBill amount
GPaidMoney received so far
HBalanceFormula — what is still pending
IDays PendingFormula — how many days old
JNext Follow-upDate of the next reminder or call
KAge GroupFormula — 0-30, 31-60, 61-90 or 90+
LStatusFormula — Overdue, Today, Planned or Paid
MLast ReminderLeave empty — the script fills it

Step 2: Add the formulas

Type these in row 2 and drag them down for all rows:

H2 — Balance=F2-G2
I2 — Days Pending=IF(H2>0, TODAY()-E2, "")
K2 — Age Group=IF(H2<=0, "Paid", IF(I2<=30, "0-30", IF(I2<=60, "31-60", IF(I2<=90, "61-90", "90+"))))
L2 — Status=IF(H2<=0, "Paid", IF(J2="", "No date set", IF(J2<TODAY(), "Overdue", IF(J2=TODAY(), "Today", "Planned"))))

Tip: use Format → Conditional formatting with the custom formula =$K2="90+" (red) and =$L2="Overdue" (orange), so old and missed payments stand out.

Step 3: A Summary tab for the big picture

Add a second tab called Summary with these formulas:

Total pending=SUMIF(Payments!H2:H, ">0")
Pending for 90+ days=SUMIF(Payments!K2:K, "90+", Payments!H2:H)
5 biggest pending amounts=SORTN(FILTER(Payments!A2:H, Payments!H2:H>0), 5, 0, 8, FALSE)
Follow-ups for today=IFERROR(FILTER(Payments!A2:J, Payments!J2:J=TODAY(), Payments!H2:H>0), "Nothing for today")

Now one look tells you the total pending, how much is very old, who to call first, and whose follow-up is today.

Step 4: Send reminders on their own

Open Extensions → Apps Script, paste this script and change YOUR_NAME. It emails every customer whose follow-up date has come, skips anyone who has paid, and sets the next follow-up 7 days later.

// Sheet name: Payments. Row 1 = headers.
// Needed columns: Customer | Email | Invoice No | Balance | Next Follow-up | Last Reminder
const YOUR_NAME = 'Your Business Name';
const DAYS_BETWEEN_REMINDERS = 7;

function sendPaymentReminders() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Payments');
  const rows = sheet.getDataRange().getValues();
  const head = rows[0];
  const col = (name) => head.indexOf(name);
  const tz = Session.getScriptTimeZone();
  const day = (d) => Utilities.formatDate(d, tz, 'yyyy-MM-dd');
  const today = day(new Date());

  for (let i = 1; i < rows.length; i++) {
    const r = rows[i];
    const balance = Number(r[col('Balance')]) || 0;
    const email = String(r[col('Email')]).trim();
    const next = r[col('Next Follow-up')];
    const last = r[col('Last Reminder')];

    if (balance <= 0 || !email) continue;              // paid, or no email
    if (!(next instanceof Date) || day(next) > today) continue; // no date, or not due yet
    if (last instanceof Date && day(last) === today) continue;  // already sent today

    MailApp.sendEmail(
      email,
      'Payment reminder: invoice ' + r[col('Invoice No')],
      'Hello ' + r[col('Customer')] + ',\n\n' +
        'A payment of Rs. ' + inr(balance) + ' for invoice ' + r[col('Invoice No')] + ' is pending.\n' +
        'If you have already paid, please ignore this message.\n\n' +
        'Thank you,\n' + YOUR_NAME
    );

    // Note the reminder, and plan the next one
    const nextDate = new Date();
    nextDate.setDate(nextDate.getDate() + DAYS_BETWEEN_REMINDERS);
    sheet.getRange(i + 1, col('Last Reminder') + 1).setValue(new Date());
    sheet.getRange(i + 1, col('Next Follow-up') + 1).setValue(nextDate);
  }
}

// 125000 -> "1,25,000" (Indian style)
function inr(n) {
  const s = String(Math.round(n));
  const last3 = s.slice(-3);
  const rest = s.slice(0, -3);
  return rest ? rest.replace(/\B(?=(\d{2})+(?!\d))/g, ',') + ',' + last3 : last3;
}
  • To run it every morning, add a trigger: Triggers → Add trigger → choose sendPaymentReminders, “Time-driven”, “Day timer”, 9am to 10am.
  • Run it once by hand first and allow the permissions. Test with your own email address in a few rows.
  • Want WhatsApp instead of email? See sending WhatsApp messages from Google Sheets.

Tips that bring the money back faster

  • Call or remind the biggest and oldest amounts first — the Summary tab shows them.
  • Always put a Next Follow-up date. A pending bill with no date is easy to forget.
  • Update the Paid column the same day money comes in, so the customer is not reminded by mistake.
  • Keep the message short and polite. You want the money and the customer.
  • Look at the Summary tab once a week — it shows if old money is growing.

Making the bills too? The PDF invoices from Google Sheets guide shows how to make and email them from the same sheet.

Frequently asked questions

Can Google Sheets send payment reminders on its own?

Yes. A short Apps Script checks your sheet every morning and emails a polite reminder to each customer whose follow-up date has come. It also writes down when it sent the reminder and plans the next one.

Can the reminders go on WhatsApp instead of email?

Yes. The same sheet can send WhatsApp messages through a WhatsApp sending service. My guide on sending WhatsApp messages from Google Sheets explains the options and their costs.

Will customers find automatic reminders rude?

Not if the message is short and polite, goes only when the payment is really due, and stops once they pay. The sample message also says “if you have already paid, please ignore this message”.

Can I use it with Tally or my billing software?

Yes. Most billing software can export the outstanding list to Excel or CSV, which you can paste into the sheet. A live connection is possible only if your software allows it.

How many reminders can it send in a day?

Gmail lets a script email about 100 people a day from a free account and about 1,500 from Google Workspace. That is enough for most small businesses.

Contact Me

Tell me your work problem

Tell me what work your team does by hand today. I will tell you honestly how it can be made easier. No cost, no pressure.

+91