You mean to reply. Then three days pass. This page helps you spot threads where someone wrote last and you have not answered for N days.
Private by design: paste stays in this tab. No account, no upload, no server call for the checker.
Two honest ways to use it: paste a list (below), or run a free Apps Script in your own Gmail that writes unreplied threads into a Google Sheet.
1. Paste a list (CSV / TSV / lines)
Export or copy rows with at least From, Subject and Date. Optional Direction column: Them (they wrote last — you owe a reply) or Me (you wrote last). If Direction is missing, every row is treated as waiting on you.
Tip: in Gmail, open a search like is:inbox -from:me, then copy subject / sender / date into a spreadsheet and paste here. Or use the Apps Script below to fill a sheet automatically.
| From | Subject | Date | Days | Last from | Result |
|---|
2. Free Apps Script (lists unreplied threads in your Sheet)
This script runs in your Google account. It searches recent inbox threads, keeps those where the last message is from someone else, and writes Subject / From / Date / Days waiting into the active sheet. Nothing is sent to Karuna Labs.
- Open a blank Google Sheet.
- Extensions › Apps Script, delete any stub code, paste the script below, save.
- Run listUnreplied. The first time, Google asks you to authorise Gmail + Sheets access for your project (you own the script).
- Optional: set
MAX_DAYS/LOOKBACK_DAYSat the top. Re-run whenever you want a fresh list.
Prefer this automated? Try FollowSheet
/**
* List unreplied Gmail threads into the active Google Sheet.
* Own this script: it runs only in your Google account.
* Authorise when prompted (Gmail read + Spreadsheet write for this project).
*/
var MAX_DAYS = 3; // flag rows waiting at least this many days
var LOOKBACK_DAYS = 60; // how far back to search
var MAX_THREADS = 100; // GmailApp.search page size cap for this run
function listUnreplied() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
sheet.clear();
sheet.getRange(1, 1, 1, 6).setValues([[
'From', 'Subject', 'Date', 'Days waiting', 'Thread link', 'Flagged (>=' + MAX_DAYS + 'd)'
]]).setFontWeight('bold');
var after = Utilities.formatDate(
new Date(Date.now() - LOOKBACK_DAYS * 86400000),
Session.getScriptTimeZone(),
'yyyy/MM/dd'
);
// Threads in inbox, not from me as the only participant filter — we still check last message.
var query = 'in:inbox after:' + after;
var threads = GmailApp.search(query, 0, MAX_THREADS);
var me = Session.getActiveUser().getEmail().toLowerCase();
var rows = [];
var today = new Date();
threads.forEach(function (t) {
var msgs = t.getMessages();
if (!msgs.length) return;
var last = msgs[msgs.length - 1];
var from = last.getFrom();
var fromEmail = extractEmail_(from).toLowerCase();
if (fromEmail === me || fromEmail.indexOf(me) !== -1) return; // I wrote last
var when = last.getDate();
var days = Math.floor((today - when) / 86400000);
var link = 'https://mail.google.com/mail/u/0/#inbox/' + t.getId();
rows.push([
from,
t.getFirstMessageSubject(),
when,
days,
link,
days >= MAX_DAYS ? 'Yes' : 'No'
]);
});
rows.sort(function (a, b) { return b[3] - a[3]; });
if (rows.length) {
sheet.getRange(2, 1, rows.length, 6).setValues(rows);
sheet.getRange(2, 3, rows.length, 1).setNumberFormat('yyyy-mm-dd');
}
sheet.autoResizeColumns(1, 6);
try {
SpreadsheetApp.getUi().alert(
rows.length
? ('Wrote ' + rows.length + ' unreplied thread(s). ' +
rows.filter(function (r) { return r[5] === 'Yes'; }).length +
' flagged at >=' + MAX_DAYS + ' days.')
: 'No unreplied threads found in the lookback window.'
);
} catch (e) {
// Running from the script editor without a UI is fine; data is already on the sheet.
}
}
function extractEmail_(fromHeader) {
var m = /<([^>]+)>/.exec(fromHeader);
if (m) return m[1].trim();
return String(fromHeader || '').replace(/^.*\s/, '').trim();
}
Quotas: consumer Gmail accounts have daily Apps Script / Gmail read limits. Keep MAX_THREADS modest. See Apps Script quotas.
Want this on autopilot?
FollowSheet is our Gmail follow-up CRM inside your own Google Sheet. It fills in last contacted and who wrote last from Gmail, flags Needs reply / overdue / gone cold, and (on Pro) emails you a daily list. Free plan for 25 contacts; Pro $7/month or $59/year. Your data stays in your Sheet — FollowSheet has no server.
Make a FollowSheet copy (free) How FollowSheet works vs Streak
Disclosure: FollowSheet is made by Karuna Labs (that's us). This checker is free either way.
What this is not
- It does not connect to your Gmail from this website (paste stays local; the script runs in your Apps Script project).
- It does not send email, track opens, or sync LinkedIn.
- It does not write emails for you. For unpaid invoices, try the free invoice reminder email generator.
- It does not replace a full CRM. If you need pipelines + daily chase lists kept up from Gmail, use FollowSheet or another CRM.