Blog / Construction Operations
Construction Bid Follow-Up: Email Templates and a Tracker That Reminds You
By Keyona Meeks, Founder, ReRev Labs · Oct 31, 2026 · 8 min read
The short answer: Send a short follow-up two or three business days after you submit a bid, then again about a week later, and keep every bid in one sheet with a next follow-up date. The templates below cover the first message, the second, and the "any news" check-in. The script below emails you each morning with the bids that are due for a nudge, so the follow-up does not depend on your memory.
By the end of this post, you'll be able to:
- Send a bid follow-up that is short, specific and easy to answer.
- Keep a tracker with a next follow-up date on every open bid.
- Get a morning email listing the bids you should chase today.
You priced a job last month. You sent the bid. Then the next fire started, and you did not look at it again. Six weeks later you find out the general contractor awarded it. Nobody told you. You never asked.
Follow-up is not pushy. A bid sits in a stack, and the person with the stack is busy. A clear, short message puts yours back on top. This post gives you the words and the system. The timing numbers are my suggestions, not rules. Adjust them to how your bid contacts work.
When should you follow up on a bid?
My starting point:
- Two or three business days after you submit. Confirm they received it and offer to answer questions.
- About a week after the first. Ask where the decision stands and when they expect to decide.
- On the date they gave you. If they said "end of the month," write on the last day of the month.
- Then at a slower rhythm. Every two or three weeks is enough. Stop if they ask you to.
If the bid had a stated decision date, use that date first. If it asked you not to contact the owner, do not. Follow the instructions in the bid documents.
What should the email say?
Short. One question. A reason to answer. Here are three you can copy. Replace the brackets.
1. After you submit
Subject: [Project name] bid received?
Hi [Name], I sent our bid for [project] on [date]. I wanted to make sure it reached you. If you have questions on scope, pricing or schedule, I can answer them today. Is there anything you need from us to move it forward?
[Your name, phone]
2. A week later
Subject: [Project name] where does the decision stand?
Hi [Name], checking in on [project]. Do you have a sense of when you expect to decide? If a number or a scope item is the sticking point, tell me which one and I will take a look.
[Your name, phone]
3. On their date, or after it passes
Subject: [Project name] any news?
Hi [Name], you mentioned a decision by [date]. Where did it land? If it went another way, I would like to hear that too. It helps me price the next one.
[Your name, phone]
Three habits make these work. Name the project in the subject line. Ask for one thing. Say that a "no" is an acceptable answer. A clear no lets you move on, and it tells you something about your pricing.
What does the tracker look like?
Make one Google Sheet with a tab called Bids. Put these headers in row 1. The script reads them by name, so spell them exactly.
| Column | Header | What goes in it |
|---|---|---|
| A | Project | Name or job number |
| B | Contact | Who you sent it to |
| C | Contact email | Their email |
| D | Bid amount | Optional |
| E | Date submitted | The day you sent it |
| F | Status | A dropdown: Submitted, Following up, Won, Lost, No response |
| G | Next follow-up | A date you type, or a formula |
| H | Last contact | The day you last wrote or called |
| I | Notes | What they said |
To set up the dropdown, select F2:F1000 and choose Data → Data validation → Add rule. Under Criteria, choose Dropdown and enter the five statuses. Google's help page for dropdown lists covers the steps. It was checked on October 30, 2026.
To set a first follow-up date automatically, put this in G2 and fill it down. It adds three business days to the submit date, and stays empty until you enter a date.
=IF(E2="","",WORKDAY(E2,3))
After you send the first follow-up, type a new date over the formula. That is a manual step, and it keeps you in control of the rhythm.
To color late bids, select A2:I1000, choose Format → Conditional formatting, and under Format cells if choose Custom formula is. Enter:
=AND(OR($F2="Submitted",$F2="Following up"),$G2<>"",$G2<=TODAY())
Pick a fill. Every open bid that is due or late now stands out. Google's help page for conditional formatting covers the menu. It was checked on October 30, 2026.
How do you get a morning email about bids to chase?
Open the sheet. Choose Extensions → Apps Script. Delete the sample code and paste this. Change the email address in OWNER_EMAIL. Save.
If you have never used Apps Script, read what Google Apps Script is first.
// Bid follow-up reminders. Paste into Extensions > Apps Script.
const CONFIG = {
SHEET: 'Bids',
OWNER_EMAIL: 'you@yourcompany.com', // change this
OPEN_STATUSES: ['Submitted', 'Following up']
};
function sendBidReminders() {
const sheet = SpreadsheetApp.getActive().getSheetByName(CONFIG.SHEET);
const data = sheet.getDataRange().getValues();
const col = headerMap_(data[0]);
const today = startOfDay_(new Date());
const lines = [];
for (let r = 1; r < data.length; r++) {
const row = data[r];
if (CONFIG.OPEN_STATUSES.indexOf(row[col['Status']]) === -1) continue;
const next = row[col['Next follow-up']];
if (!(next instanceof Date) || startOfDay_(next) > today) continue;
const days = Math.round((today - startOfDay_(next)) / 86400000);
lines.push(row[col['Project']] + ' | ' + row[col['Contact']] + ' | ' +
(days === 0 ? 'follow up today' : days + (days === 1 ? ' day' : ' days') + ' late'));
}
if (lines.length === 0) return;
MailApp.sendEmail({
to: CONFIG.OWNER_EMAIL,
subject: 'Bids to follow up: ' + lines.length,
body: lines.join('\n')
});
}
function setupBidTrigger() {
ScriptApp.getProjectTriggers().forEach(function (t) { ScriptApp.deleteTrigger(t); });
ScriptApp.newTrigger('sendBidReminders').timeBased().everyDays(1).atHour(7).create();
}
function headerMap_(headers) {
const map = {};
headers.forEach(function (h, i) { map[String(h).trim()] = i; });
return map;
}
function startOfDay_(d) {
return new Date(d.getFullYear(), d.getMonth(), d.getDate());
}
Run setupBidTrigger once. Google will ask you to authorize the script, because it reads your sheet and sends email as you. Approve it only if you wrote or checked the code. Then open Triggers in the left menu and confirm you see one daily trigger.
The script emails you only when a bid is open and its follow-up date is today or earlier. It sends one email to you. It does not write to your contacts. You decide who to chase and what to say.
Google runs an atHour trigger anywhere inside that hour, in the script's time zone. Check the time zone under Project settings. Source: Google's ClockTriggerBuilder reference, checked October 30, 2026.
Where does an LLM fit in bid follow-up?
Not in the reminder. The reminder is a rule, and a plain script runs it the same way every day. An LLM can help in one place: turning your notes into a first draft of the follow-up email. Read every draft before it goes out. It is your name on the message.
Where this has limits
- It reminds you. It does not write or send for you. That is deliberate. A follow-up sent in your name should say what you mean.
- I tested the script with mock data only. It was not run in a live Google account. Run it on a copy of your sheet first.
- Email quotas. Apps Script limits how many emails a script can send each day. A morning email to yourself uses one. See Google's quotas page, checked October 30, 2026.
- Rules of the bid come first. Some public and private bids limit contact during the process, and public owners run bids under formal state rules: Alabama's public works law, for example, requires bids over $100,000 to be advertised, sealed and opened publicly (Code of Alabama, Title 39, Section 39-2-2: https://alison.legislature.state.al.us/code-of-alabama?section=39-2-2, checked October 30, 2026). It is one state's code, shown as an example; your state and your bid documents set your rules. Follow the bid documents first. Check with your attorney if you are unsure.
- One owner. If the script fails, the reminders stop. Check the Executions page now and then.
- When to buy software instead. If a team of estimators shares the pipeline, or you need bid-board features, project software is built for that. A sheet fits one person or a small team.
If your bids live across email, text and a notebook, and you want a tracker that follows up without you, you can apply on /letstalk. Bring a list of your open bids with the names removed, and a note on where follow-up slips. Do not send bid documents or pricing.
Frequently asked questions
How often is too often?
Past the third message in two weeks, most people read it as pressure. After that, space it out to every two or three weeks. If the contact tells you to stop, stop.
What if the general contractor never answers?
Mark the bid No response after your last planned message, and note the date. Do not delete it. A pattern of no answer from one contact is worth knowing before you price their next job.
Should I call or email?
Email leaves a record. A short call can get an answer faster. Many people do both: email first, then call on the second follow-up. Use the way your contact prefers.
Do I need a CRM?
Not for a handful of bids. A sheet works until you have more bids than you can scan in a minute, or more than one person updating it.
Does this work for residential jobs?
Yes. Change the wording, and the tracker stays the same.
Is this legal advice about bidding rules?
No. It tracks and organizes follow-up. Bid and procurement rules depend on the owner, the contract and your state. Check with an attorney if you are unsure.
Read next: A deal pipeline inside Gmail if you want the bids tracked where the emails already are. The paperwork map shows where bid follow-up sits with the rest of the office paper, from RFIs to closeout.