Contractor estimate tracker in Google Sheets (free starter + copy-paste formulas)
If you send estimates from a notebook, a texting thread or memory, a few always slip through: a decent job you priced and then never asked about again. A contractor estimate tracker fixes that with one Google Sheet: one row per estimate, a status, and a next follow-up date the sheet works out for you. This guide is for owner-operators in the trades and home services (roofing, plumbing, HVAC, painting, cleaning, landscaping). It uses plain Google Sheets: no add-ons, no scripts, no paid tools, and the same formulas work in Excel.
What you end up with
- One row per estimate with the customer, job type, amount and status.
- A Next follow-up date that fills itself in on day 2, 5, 9 and 14 after the estimate went out.
- A Due column that says DUE on the rows to deal with today, highlighted in yellow.
- A Days since sent number on every row, and a one-cell open pipeline total.
Free starter: Estimate Follow-Up Tracker
Skip the setup: the free starter already has the columns, the three formulas (pre-filled for 200 rows in the .xlsx), the Status dropdown, the yellow DUE highlight and 5 made-up example rows. No email or sign-up needed.
Free starter (.xlsx, Excel + Google Sheets) Free starter (.csv)
To open the .xlsx in Google Sheets: in a blank sheet, File > Import > Upload, pick the file, then choose Replace spreadsheet. Or upload it to Google Drive and open it with Google Sheets. The .csv carries the formulas for the 5 example rows only; copy them down as you add rows, and if Next follow-up shows a number like 46302, select column G and choose Format > Number > Date.
Example rows
These are the 5 made-up rows from the starter (fake names, 555 numbers). Next follow-up shows what the step 3 formula returns.
| Customer | Phone | Job type | Estimate $ | Sent date | Touches | Next follow-up | Status | Notes |
|---|---|---|---|---|---|---|---|---|
| EXAMPLE - Sample Customer A | 555-0101 | Roof repair | 4200 | 2026-10-05 | 0 | 2026-10-07 (formula) | Open | Example row |
| EXAMPLE - Sample Customer B | 555-0102 | Water heater swap | 1850 | 2026-10-01 | 1 | 2026-10-06 (formula) | Open | Example row |
| EXAMPLE - Sample Customer C | 555-0103 | Interior paint, 3 rooms | 2900 | 2026-09-24 | 2 | 2026-10-03 (formula) | Open | Example row |
| EXAMPLE - Sample Customer D | 555-0104 | Deck rebuild | 7600 | 2026-09-18 | 3 | 2026-10-02 (formula) | Open | Example row |
| EXAMPLE - Sample Customer E | 555-0105 | Gutter cleaning | 320 | 2026-09-20 | 1 | (blank: not Open) | Won | Example row |
Step 1. Set up the columns (about 10 minutes)
Create a blank Google Sheet and rename the first tab Estimates (double-click the tab name). In row 1 type these headers, one per column:
- A – Customer: name or company.
- B – Phone: or email: however you reach this customer.
- C – Job type: what the estimate covers, in a few words (“Roof repair”, “Deck rebuild”).
- D – Estimate $: the quoted total. Format > Number > Currency.
- E – Sent date: the day the estimate went out. Format > Number > Date.
- F – Touches: how many follow-ups you have sent so far, 0 to 4. Type 0 when the estimate first goes out.
- G – Next follow-up: a formula (step 3). Do not type here.
- H – Status: Open, Won, Lost or On hold (dropdown, step 2).
- I – Notes: one line: what they asked, why they said no, when to revisit.
- J – Due: a formula that shows DUE on rows to follow up on today (step 4).
- K – Days since sent: a formula (step 5). Handy for spotting estimates that have gone quiet.
Freeze the header row: View > Freeze > 1 row.
Step 2. Add a Status dropdown
Select H2:H, click Insert > Dropdown and add four options: Open, Won, Lost, On hold. Only Open rows get follow-up dates, so use the exact same wording every time: the formulas look for the word Open.
Step 3. Next follow-up date (day 2, 5, 9, 14)
In G2 paste:
=IF(OR(E2="",H2<>"Open",N(F2)>=4),"",E2+CHOOSE(N(F2)+1,2,5,9,14))
Drag it down as far as you expect to have rows, and format column G as a date (Format > Number > Date). What it does:
- Blank if there is no Sent date, if Status is not Open, or once Touches reaches 4.
- Touches 0 → Sent date + 2 days. Touches 1 → + 5. Touches 2 → + 9. Touches 3 → + 14.
N(F2)treats an empty Touches cell as 0, so a new row works before you type anything in F.
Check it against the example rows: Customer A was sent 2026-10-05 with 0 touches, so 5 Oct + 2 = 2026-10-07. Customer C was sent 2026-09-24 with 2 touches, so 24 Sep + 9 = 2026-10-03. Customer E is Won, so G stays blank.
The schedule counts from the Sent date, so the dates stay fixed: if you follow up late, the next date may already be in the past and the row shows DUE straight away. That is on purpose: it tells you the estimate is behind.
Step 4. A DUE flag and a yellow highlight
In J2 paste and drag down:
=IF(G2="","",IF(G2<=TODAY(),"DUE",""))
It shows DUE when the row has a next follow-up date of today or earlier (which only happens on Open rows), and stays blank otherwise. To highlight those rows, select A2:K, then Format > Conditional formatting > Custom formula is:
=$J2="DUE"
Pick a light yellow fill and click Done. TODAY() updates each time the sheet opens, so the flags are always current.
Step 5. Days since sent
In K2 paste and drag down:
=IF(E2="","",TODAY()-E2)
Format column K as a plain number (Format > Number > Number, then remove decimals). Sort by it now and then to see which open estimates have been sitting the longest.
Step 6. Optional: a Due today tab and a pipeline total
Add a tab named Due today and paste this in A1. It lists every DUE row, oldest next follow-up first (column 7 of A:K is Next follow-up):
=IFERROR(SORT(FILTER(Estimates!A2:K,Estimates!J2:J="DUE"),7,TRUE),"Nothing due today")
Format column G on that tab as a date. Make your edits on the Estimates tab; this tab is a live view. For the total value of open estimates, put this in any spare cell:
=SUMIFS(Estimates!D:D,Estimates!H:H,"Open")
With the 5 example rows, open pipeline is $16,550 (A to D are Open; E is Won).
Step 7. The 5-minute daily habit
- Open the sheet (or the Due today tab) and look for DUE.
- Send a short, specific follow-up on each DUE row: by text or email, whichever the customer used with you.
- Add 1 to Touches on that row. The next date moves out by itself.
- Add a row for every estimate you sent today, with Touches 0.
- The moment a customer says yes or no, change Status to Won or Lost and add a note.
After the 4th touch the next date goes blank: decide Won, Lost or On hold, and write the reason in Notes.
Good to know
- Dates must be real dates, not text. A date sitting left-aligned in its cell is probably text: retype it or use Format > Number > Date.
- TODAY() uses the spreadsheet time zone (File > Settings).
- Want a different rhythm? Change the
2,5,9,14inside CHOOSE, then drag the formula down again. - Sharing with a crew lead or office help? Add an Owner column at the end, and use Data > Create filter view so each person can filter without changing what others see.
Related free guides
- Quote follow up spreadsheet: the same idea counted from your last contact, with a win rate summary and three follow-up messages to copy.
- Weekly quote sort: a 15-minute Saturday routine to Chase, Park or Close every open quote.
Want it pre-built?
The free starter and the steps above work fine on their own. If you would rather start from a finished version, the Home-Service Lead & Estimate Follow-Up Tracker (Google Sheets + Excel, with follow-up scripts) is a ready-made tracker you copy and adapt. It is $9 through October 31, 2026, then $12.
This is a free guide to copy and adapt, not a managed service; no support or warranty. Test with sample data first.
Written with AI assistance by Help With Automation.
Sample builds · Quote follow up spreadsheet guide · Weekly quote sort guide · Home