A Google Sheets CRM works if it answers one question every morning: who do I need to contact today? Most templates are one long tab of names, so the answer is "scroll and guess." This layout uses four tabs, Leads, Activities, Deals and Dashboard, so that the sheet computes the answer for you.
You can build it in about an hour. Below are the columns for each tab, the exact formulas for the follow-up due date and the pipeline value, one worked example with dates that add up, and the point at which a sheet stops being enough. There is nothing to download: type the headers in row 1 of each tab and paste the formulas into row 2. Copy them down as far as you have data.
What a sheet can do and what it cannot
A sheet can store contacts, count things, compute dates and show you a list of what is due. It cannot notice that someone replied to your email, remind you unless you open it, or keep a history of what a cell used to say. The Activities tab below works around the last one by logging each touch as its own row. The first two are why the "where it breaks" section exists.
Nell runs a four-person commercial cleaning company and tracks 30 prospects this way. The example rows below are hers, with today's date set to October 13, 2026.
Tab 1: Leads, one row per person
Columns, left to right: A Lead ID (L001, L002), B Name, C Company, D Email, E Phone, F Source, G Added (date), H Status, I Last touch, J Days since last touch, K Next follow-up, L Flag, M Revisit on. Make H a dropdown (Data, Data validation) with the values New, Contacted, Replied, Meeting, Not now, Dead. Columns I to L are formulas; the rest you type.
Last touch in I2:
=IF(COUNTIF(Activities!$B:$B,$A2)=0,"",MAXIFS(Activities!$A:$A,Activities!$B:$B,$A2))
Days since last touch in J2:
=IF(I2="","",TODAY()-I2)
Next follow-up in K2. This is the formula that does the work. It adds a number of days to the last touch, and the number depends on the status (set on the Dashboard tab, below). A lead with no touches yet is due two days after it was added:
=IF(OR(A2="",H2="Dead",H2="Not now"),"",IF(I2="",G2+2,I2+IFERROR(VLOOKUP(H2,Dashboard!$F$3:$G$6,2,FALSE),3)))
Flag in L2:
=IF(K2="","",IF(K2<TODAY(),"OVERDUE",IF(K2=TODAY(),"TODAY","")))
Why it works: the due date is derived from what you actually did, so it moves when you log a touch and nobody has to remember to type a new date. Variation: to bring "Not now" leads back, type a date in column M and change the first branch of K2 so that a Not now lead returns M2 instead of a blank. Add a conditional-formatting rule (Format, Conditional formatting, custom formula =$L2="OVERDUE") to turn overdue rows red.
Tab 2: Activities, one row per touch
Columns: A Date, B Lead ID, C Type (dropdown: Email, Call, Text, Meeting, Note), D What happened, E Next step. Every time you email, call or meet someone, add a row at the bottom. Never edit an old row. The Lead ID column can use a dropdown that points at Leads!A2:A so you cannot mistype it.
Why it works: the history stays, because a new row never overwrites the old one, and the Leads tab reads the newest date from it. Variation: add a column F for "Reply received?" if you want to count your reply rate with a COUNTIF later.
Tab 3: Deals, one row per proposal
Columns: A Deal ID, B Lead ID, C Company, D Stage (dropdown: Proposal, Negotiating, Won, Lost), E Value, F Chance, G Weighted value, H Proposal sent, I Days since proposal, J Follow-up due, K Closed on. C, F, G, I and J are formulas.
Company in C2:
=IFERROR(INDEX(Leads!$C:$C,MATCH($B2,Leads!$A:$A,0)),"")
Chance in F2 and weighted value in G2:
=IFERROR(VLOOKUP(D2,Dashboard!$F$9:$G$12,2,FALSE),0)
=E2*F2
Follow-up due in J2 is four days after the later of the proposal date and the last touch on that lead:
=IF(OR(H2="",D2="Won",D2="Lost"),"",MAX(H2,IFERROR(N(INDEX(Leads!$I:$I,MATCH($B2,Leads!$A:$A,0))),0))+4)
Days since proposal in I2 is =IF(OR(H2="",D2="Won",D2="Lost"),"",TODAY()-H2). Why it works: a deal does not need its own reminder column, because every touch you log on the lead pushes the deal's due date forward. Variation: change the 4 to a 3 if your proposals go cold fast.
Tab 4: Dashboard, the part you open every morning
Put the settings here. In F3:G6, type the number of days to wait by status: New 2, Contacted 4, Replied 1, Meeting 5. In F9:G12, the chance by stage: Proposal 0.25, Negotiating 0.5, Won 1, Lost 0. These are placeholders, so change them to match your own results after a month.
Then four numbers in B2 to B5, with labels in column A:
Open pipeline: =SUMIFS(Deals!$E:$E,Deals!$D:$D,"Proposal")+SUMIFS(Deals!$E:$E,Deals!$D:$D,"Negotiating") Weighted pipeline: =SUMIFS(Deals!$G:$G,Deals!$D:$D,"Proposal")+SUMIFS(Deals!$G:$G,Deals!$D:$D,"Negotiating") Won this month: =SUMIFS(Deals!$E:$E,Deals!$D:$D,"Won",Deals!$K:$K,">="&DATE(YEAR(TODAY()),MONTH(TODAY()),1)) Follow-ups due: =COUNTIF(Leads!$L:$L,"OVERDUE")+COUNTIF(Leads!$L:$L,"TODAY")
And the line that replaces scrolling, in B9: a list of everyone due today or earlier.
=IFERROR(FILTER(Leads!$C$2:$C$500,Leads!$K$2:$K$500<>"",Leads!$K$2:$K$500<=TODAY()),"Nothing due")
The follow-up formula on three leads
Nell's sheet on October 13, 2026, with the status delays above:
- L001, Hartwell Dental. Status Contacted, added Oct 1, emails logged Oct 2 and Oct 6. Last touch Oct 6, days since 7, next follow-up Oct 6 + 4 = Oct 10, flag OVERDUE.
- L002, Birch and Lane Realty. Status New, added Oct 12, nothing logged. Next follow-up Oct 12 + 2 = Oct 14, no flag yet.
- L003, Summit Orthodontics. Status Replied, email logged Oct 12. Next follow-up Oct 12 + 1 = Oct 13, flag TODAY.
On the Deals side, two more leads have a Proposal at $6,400 and a Negotiating deal at $9,000. Open pipeline is $6,400 + $9,000 = $15,400. Weighted at 25 and 50 percent it is $1,600 + $4,500 = $6,100. A deal marked Won on October 6 for $3,200 shows as $3,200 under Won this month. The B9 list shows Hartwell Dental and Summit Orthodontics, and Nell's morning job is two names long.
When to move to a board
This layout holds for a while, and the signs that it has stopped are specific. You are copying replies from Gmail into the Activities tab for more than a few minutes a day. The overdue count keeps rising even though you open the file daily. Two people edit at once and one overwrites the other. Or you have more than about 25 to 50 active deals and the Dashboard list is long enough to need scrolling. The threshold test in CRM vs spreadsheet turns those signs into a count, and Gmail CRM: labels, extensions or a pipeline board compares the next steps.
Related reading: the list is not the customer, do I need a CRM as a solo founder, what a customer database should do and a startup pipeline that is really a list.
When the Activities tab becomes a chore, Rocketship takes that work over: it finds the buyers, emails them from your own Gmail, follows up, and books the meeting on its own, and it reads the replies so you do not type them in. Plans that get you customers start at $24.99 a month (Launch), and every monthly plan starts with a 7-day free trial, card required.
