FREE HOW-TO

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

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.

CustomerPhoneJob typeEstimate $Sent dateTouchesNext follow-upStatusNotes
EXAMPLE - Sample Customer A555-0101Roof repair42002026-10-0502026-10-07 (formula)OpenExample row
EXAMPLE - Sample Customer B555-0102Water heater swap18502026-10-0112026-10-06 (formula)OpenExample row
EXAMPLE - Sample Customer C555-0103Interior paint, 3 rooms29002026-09-2422026-10-03 (formula)OpenExample row
EXAMPLE - Sample Customer D555-0104Deck rebuild76002026-09-1832026-10-02 (formula)OpenExample row
EXAMPLE - Sample Customer E555-0105Gutter cleaning3202026-09-201(blank: not Open)WonExample 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:

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:

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

  1. Open the sheet (or the Due today tab) and look for DUE.
  2. Send a short, specific follow-up on each DUE row: by text or email, whichever the customer used with you.
  3. Add 1 to Touches on that row. The next date moves out by itself.
  4. Add a row for every estimate you sent today, with Touches 0.
  5. 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

Related free guides

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.

Get the $9 tracker on Gumroad

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