The enquiry came in on a Wednesday. You opened the sheet, added a row, typed the name and the number, and picked a pipeline stage from the dropdown. You told yourself you would follow up on Friday. Friday arrived full of other things. By the time you searched the sheet on Tuesday, the lead had replied to your competitor's quote and accepted it.
This is not a story about bad intentions. It is a story about what a Google Sheets CRM can and cannot do, and the specific gap between those two things is where deals go quiet and stay quiet. This guide builds the sheet properly, with the column structure, the data validation rules and the conditional formatting that most tutorials skip. Then it gives you an honest checklist for the moment the sheet has done everything it can and the cost of staying with it becomes real.
What should a Google Sheets CRM actually contain?
A functional Google Sheets CRM needs ten core columns, data validation on at least three of them, and a frozen header row. That is the foundation. Everything else is decoration that adds maintenance overhead without adding clarity.
Start with a blank sheet and name it "Leads". Add these columns in this order:
Contact Name - plain text, no validation needed.
Business Name - plain text.
Lead Source - apply a data validation dropdown. Your options might be: Website form, Referral, Facebook Ad, Instagram, LinkedIn, Cold outreach, Other. The goal is consistency. If one row says "FB" and another says "Facebook Ad" and a third says "facebook", your filter for ad-generated leads returns garbage. The dropdown prevents that.
Lead Capture Date - the date the enquiry arrived, not the date you entered it. Format the column as a date. This column anchors your lead response time reporting later.
Pipeline Stage - another data validation dropdown. Use stages that reflect your actual process, not a generic template. A reasonable set for a service business: New enquiry, Contacted, Proposal sent, Negotiating, Won, Lost, Nurturing. Six to seven options. More than that and people start picking the nearest approximation rather than the accurate stage, which corrupts your pipeline view.
Next Follow-Up Date - formatted as a date. This column does the most important work in the sheet. Every time you update a row, this date must move forward to the next action. If it does not move, the row is invisible to your weekly review.
Last Contact Date - also a date. Separate from Next Follow-Up Date because you need both: when you last spoke to them, and when you plan to speak to them next. Without both, you cannot see which leads have gone quiet.
Contact Method - a data validation dropdown: Email, Phone, WhatsApp, In person, LinkedIn, Other. Useful for filtering when you are doing a batch of calls or a batch of emails.
Notes - free text. Keep entries short and dated. "14 Nov - sent proposal, waiting on budget approval" is more useful than a paragraph of context only you will understand six weeks later.
Outcome - a final dropdown: Open, Won, Lost, No response after 5 touches. This column lets you filter out closed rows so your active lead view stays clean.
Freeze the header row so it stays visible as you scroll. Set a filter on the entire header row so you can sort by Next Follow-Up Date in one click. That sorted view, with overdue dates at the top, is your daily to-do list.
The sheet works when you treat the Next Follow-Up Date column as non-negotiable: every open row has a date, and that date never sits in the past without action.
How do you add follow-up reminders to a Google Sheets CRM?
You cannot add a true push notification to Google Sheets, but you can create a visual alarm and, with one short script, an email digest of overdue rows. Together these cover most of what a solo operator needs for sales follow-up when the lead list is under 100 active contacts.
For the visual alarm, use conditional formatting. Select your Next Follow-Up Date column, open Format, then Conditional formatting, and create two rules. The first: if the date is before today, colour the cell red. The second: if the date equals today, colour it orange. Now when you open the sheet each morning, overdue rows announce themselves without you having to sort or filter.
For an email digest, open Extensions, then Apps Script, and paste in a short function that loops through your Leads sheet, finds every row where the Next Follow-Up Date is today or earlier and the Outcome column is still "Open", and sends you a summary email. Set a time-driven trigger to run it at 8am each weekday. The script takes about twenty minutes to write and test, and a quick search for "Google Apps Script send email from sheet" will find step-by-step examples you can adapt without needing to know how to code.
The honest limitation is that neither of these methods fires unless you open the sheet or the script runs on its schedule - there is no system watching for changes in real time and nudging you the moment a lead has gone cold.
This matters because follow-up reminders in a dedicated CRM are active: they push to your phone, they surface in a task list, they sit in your face until you dismiss them. The sheet's version is passive: it waits for you to arrive. For a disciplined operator with a manageable list, passive is fine. For a busy week where the sheet goes unopened for three days, passive means three days of unanswered leads.
A useful addition to the script is a count of how many leads are overdue and how long the oldest one has been waiting. Research from XANT (formerly InsideSales.com) on lead response time consistently shows that the probability of making contact with a new lead drops sharply after the first hour and continues to fall over subsequent days. Knowing your oldest overdue lead is nine days old is the kind of number that changes behaviour.
How do you use data validation to keep the sheet accurate over time?
Inconsistent data is the silent killer of any Google Sheets CRM. A sheet with 200 rows where pipeline stage is spelled six different ways and lead source has no consistent vocabulary cannot be filtered, cannot be reported on and cannot be trusted. Data validation fixes this before the problem starts.
Beyond the dropdowns already described, apply these additional rules.
On the Lead Capture Date and Next Follow-Up Date columns, set validation to reject any entry that is not a valid date. This stops someone typing "next week" or "TBC" into a date field, which breaks sorting.
On the Contact Name column, use a custom formula to flag duplicates. The formula =COUNTIF($A$2:$A,A2)>1 marks any name that appears more than once, which helps you catch the same enquiry entered twice from different sources.
Create a second sheet tab named "Active Leads" and use a filter view or a FILTER formula that pulls only rows where the Outcome column is "Open". This is your working view. The main Leads tab becomes your archive. Working from a filtered view keeps the list manageable and stops the visual weight of 300 rows slowing your lead qualification process.
A clean sheet is not about aesthetics - it is about whether you can look at it on a Monday morning, sort by Next Follow-Up Date and know within thirty seconds exactly who needs to hear from you today.
If two people are updating the same sheet, add a "Last Updated By" column and ask everyone to type their initials when they change a row. It is a low-tech version of the activity log a dedicated CRM maintains automatically, but it at least creates accountability and reduces the "I thought you were handling that one" conversations that lose deals.
How do you build a pipeline view inside Google Sheets?
Most Google Sheets CRM tutorials stop at the flat list. A pipeline view, where you can see how many leads are at each stage and what the total potential value looks like, requires one extra tab and a handful of formulas.
Create a tab named "Pipeline Summary". In column A, list your pipeline stages exactly as they appear in your dropdown (New enquiry, Contacted, Proposal sent, and so on). In column B, use a COUNTIF formula for each stage: =COUNTIF(Leads!E:E,"Contacted") counts how many rows in the Leads tab have "Contacted" in the Pipeline Stage column. Replace "Contacted" with each stage name in successive rows.
If your sheet has a deal value column (add one if it does not - estimated value of the contract), add a column C with SUMIF formulas that total the value at each stage. Now you have a simple sales pipeline summary that updates automatically every time someone changes a row.
The pipeline summary does not require a formula, a plugin or a paid add-on - it requires five minutes and the discipline to keep the Pipeline Stage column accurate on every row.
For contact management across a pipeline with multiple stages, a visual kanban board is often clearer than a list. Google Sheets does not do kanban natively, but a simple pivot table grouped by stage gives you a count that serves the same planning purpose. If you need the visual, a Google Slides board linked to sheet data can work for a weekly review, though updating it manually is a reminder of what a dedicated tool automates.
What does your sheet tell you when it has stopped being enough?
The signs that a Google Sheets CRM has reached its limit are not dramatic. The sheet does not crash. It does not send you a warning. It just quietly fails to do things that you increasingly need it to do, and deals slip out through the gap.
Work through this checklist honestly.
Follow-up reminders: Does every lead on your list have a next follow-up date that you trust is accurate? Or are there rows where the date passed weeks ago and nobody moved it forward because the reminder never fired? If leads are slipping because the reminder system is passive and you have had a busy week, the sheet is costing you deals.
Email follow-up log: When you look at a contact's row, can you see the full email follow-up history? The date of every message you sent, what you said, whether they opened it? Or does that history live in your inbox, disconnected from your lead tracking? If you cannot answer "when did I last email this person and what did I say?" without switching to your inbox and searching, your contact management is split across two places and one of them will eventually drift.
Lead nurturing sequences: If a lead said "not right now, maybe in three months," do you have a reliable system for making sure they hear from you in three months? A date in a spreadsheet row depends on you opening the sheet and acting on it. A lead nurturing sequence in a CRM sends the email without you remembering to.
Lead qualification sorting: Can you filter your list by how qualified a lead is? Not just by pipeline stage, but by the signals that tell you which leads are worth the most of your attention this week? A sheet can hold a qualification score if you add a column and fill it in, but the scoring is entirely manual and entirely dependent on the notes you remembered to write.
Team visibility: If someone else on your team picks up your list today, can they see everything they need to understand the context of every relationship? Or would they need to read through a notes column, search your inbox and ask you questions? A sheet shared between two people is a coordination problem. A sheet shared between three or more people is a liability.
Duplicate leads and lost history: Have you ever had two people call the same lead from different rows? Have you ever overwritten a row by accident and lost the history? These are not edge cases in a sheet that two people update simultaneously; they are regular events.
If you ticked two or more of these, the spreadsheet is no longer a system. It is a record that trails behind your actual sales process and documents the leads you remembered to update, not the leads you needed to follow up.
The honest reality is that a Google Sheets CRM is a genuinely good tool for its moment. For a business in its first year, with a handful of new enquiries per week and one person managing them, a well-built sheet is faster to start than any dedicated tool and free to run. The trap is staying with it past its moment. The cost of staying is invisible on any given day and obvious only when you look back at a quarter and count the leads that went cold because a follow-up never happened.
Frequently Asked Questions
Can Google Sheets work as a CRM for a small business?
Yes, for a solo operator or a team of two tracking under 50 active leads, a well-structured Google Sheets CRM handles contact management, pipeline stages and basic lead tracking effectively. The sheet breaks down when you need automatic follow-up reminders, a logged email history or visibility across more than one person updating records simultaneously.
What columns should a Google Sheets CRM include?
A functional Google Sheets CRM needs at minimum: contact name, business name, lead source, lead capture date, current pipeline stage, next follow-up date, last contact date, contact method, notes and an outcome field. Data validation dropdowns on the stage and contact method columns prevent the inconsistent entries that make filtering useless.
How do I create follow-up reminders in Google Sheets?
You can use a conditional formatting rule to highlight rows where the next follow-up date is today or earlier, turning those cells red automatically. For email reminders, a Google Apps Script trigger can send a daily digest of overdue rows to your inbox. Neither method matches a dedicated CRM's push notifications, but both work well enough for a list under 100 leads.
When should a small business move from Google Sheets to a CRM?
Move when any of these are true: leads are slipping because no reminder fired, your email follow-up history lives only in your memory, two people are editing the sheet and overwriting each other, or lead qualification notes are so buried in a notes column that you cannot sort by them. At that point the sheet is costing you deals, not saving you software fees.
Is Google Sheets good for lead nurturing?
It is good for planning a lead nurturing sequence but poor at executing one. You can map out touch points in a sheet and tick them off manually, but the sheet cannot send emails, trigger tasks based on a contact's behaviour or alert you when a warm lead has gone quiet. Lead nurturing that depends on human memory to fire each step loses consistency after the first week.
How many leads can a Google Sheets CRM handle?
Practically, a single sheet performs well up to around 200 to 300 rows before filtering and conditional formatting slow noticeably on older machines. The real limit is not technical but operational: beyond roughly 50 active leads, the manual discipline required to keep next follow-up dates accurate and pipeline stages current becomes the bottleneck, not the spreadsheet's processing speed.
What is the difference between a Google Sheets CRM and a dedicated CRM for small business?
A Google Sheets CRM is a structured contact list you maintain by hand. A dedicated CRM for small business automates the operational layer: it logs emails, fires follow-up reminders, records every interaction without manual entry and gives you a visual sales pipeline you can filter in seconds. The sheet is free and fast to start. The dedicated tool removes the discipline tax that makes the sheet fail over time.
Ready to stop maintaining the sheet and start working the leads?
Kodeleads is built for exactly the moment after the spreadsheet stops being enough - it brings lead capture, follow-up reminders, email follow-up logging and a clear sales pipeline into one place without the setup week or the sales ops complexity of tools built for larger teams. Try Kodeleads and see how long it takes to import your sheet and have your first reminder fire automatically.