July 29, 2026 · ViaSheet Team
How to Build a Custom CRM in Google Sheets: The Complete 2026 Tutorial
Learn how to build a fully automated, scalable CRM in Google Sheets from scratch. Step-by-step instructions with formulas, Apps Script email reminders, and KPI dashboards.
Managing customer relationships is the lifeblood of any growing business. However, traditional enterprise software solutions like Salesforce, HubSpot, or Dynamics 365 often burden small businesses, freelancers, and growing startups with monthly subscription fees running into thousands of dollars per year. Furthermore, studies by the Sales Management Association reveal that over 65% of sales representatives report feeling overwhelmed by complex CRM interfaces, leading to poor data entry compliance and lost sales opportunities.
For micro-enterprises, solopreneurs, and lean sales teams of 1 to 10 people, Google Sheets provides an ideal, highly flexible alternative. Built on secure cloud architecture with native real-time collaboration, Google Sheets allows you to manage lead pipelines, calculate deal values, log interaction histories, and generate automated email reminders without paying a single dollar in recurring software costs.
In this exhaustive guide, we will walk you step-by-step through building a production-ready, automated Google Sheets CRM from scratch. By the end of this guide, you will have a functional system equipped with dropdown validation, conditional formatting alerts, automated KPI dashboards, and Google Apps Script triggers.
Why Use Google Sheets as Your CRM?
Before diving into spreadsheet design, it is essential to understand why over 50% of early-stage startups choose spreadsheets over dedicated CRM software:
- Zero Financial Overhead: Traditional SaaS CRMs charge per user seat per month. Google Sheets is completely free with any standard Google account or Google Workspace subscription.
- Infinite Customization: Dedicated platforms force your sales process into rigid, predefined fields. With Google Sheets, you can add custom columns, modify pipeline stages, and tweak formulas in seconds.
- Seamless Real-Time Collaboration: Multiple team members can view, edit, and update client records simultaneously. Built-in version history tracks every modification, ensuring full accountability.
- Complete Data Ownership: Your customer database remains under your control in your Google Drive, formatted as standard tabular data that can be exported to
.CSVor.XLSXat any moment. - No Steep Learning Curve: Almost everyone already knows how to enter text into a cell, making employee onboarding instantaneous.
Key Architecture of a Spreadsheet CRM
A common pitfall when using spreadsheets for customer relationship management is mixing database storage with presentation visual layouts on a single tab. To maintain high performance and prevent broken formulas, structure your spreadsheet into three distinct tabs:
- Tab 1:
Leads & Contacts(The Core Database) — Holds every customer record, deal value, pipeline stage, and follow-up date. - Tab 2:
Activity Log(Communication History) — Tracks touchpoints, emails, call notes, and meeting dates linked to specific clients. - Tab 3:
Sales Dashboard(KPI Analytics) — Displays real-time revenue summaries, conversion funnels, and stale lead alerts using dynamic formulas.
Step 1: Building the Core Leads & Contacts Database
Open a new Google Sheets file, rename the spreadsheet to Viasheet Custom CRM, and rename the first tab to Leads & Contacts.
1. Define Column Headers
In Row 1, set up the following structured headers from Column A to Column L. Apply bold styling, a sleek dark gray fill (#1E293B), and white text (#FFFFFF) to row 1:
| Column | Header Name | Data Type | Purpose |
|---|---|---|---|
| A | Lead ID | Text / Formula | Unique record identifier (e.g., LEAD-1001) |
| B | Company / Client | Text | Business or client name |
| C | Primary Contact | Text | Full name of contact person |
| D | Email Address | Primary communication address | |
| E | Phone Number | Text | Phone number |
| F | Lead Source | Dropdown | Where the lead originated (Website, Referral, etc.) |
| G | Pipeline Stage | Dropdown | Current stage in your sales funnel |
| H | Deal Value ($) | Currency | Estimated financial value of the deal |
| I | Win Probability (%) | Percentage | Likelihood of closing the sale |
| J | Weighted Value ($) | Formula | Expected value (Deal Value × Probability) |
| K | Last Contact Date | Date | Date of most recent communication |
| L | Days Since Contact | Formula | Automated tracking of lead staleness |
| M | Follow-Up Status | Formula | Visual alert flag (Active, Due, Urgent) |
2. Implement Data Validation Dropdowns
Data entry errors (such as misspelling “Qualified” as “Qualifed”) will ruin your analytics formulas. Enforce strict consistency with dropdown menus:
- Select Column F (Lead Source).
- Click Data → Data validation → Add rule.
- Under Criteria, select Dropdown.
- Enter the options:
Website,Referral,Cold Outreach,Social Media,Paid Ads,Event. - Repeat the process for Column G (Pipeline Stage) with these sales stages:
1. New Prospect(Gray fill)2. Contact Made(Blue fill)3. Discovery Call(Purple fill)4. Proposal Sent(Yellow fill)5. Negotiation(Orange fill)6. Closed-Won(Green fill)7. Closed-Lost(Red fill)
3. Add Automated Formulas for Lead Tracking
Now, write formulas to automate calculations across your database:
A. Automated Lead ID (Column A)
In cell A2, enter:
=IF(ISBLANK(B2), "", "LEAD-" & TEXT(ROW()-1, "0000"))
Explanation: If Column B contains a client name, this formula automatically generates a clean lead identifier like LEAD-0001, LEAD-0002, etc.
B. Weighted Deal Value (Column J)
In cell J2, enter:
=IF(OR(ISBLANK(H2), ISBLANK(I2)), 0, H2 * I2)
Explanation: Multiplies the total potential deal size by the estimated closing probability. A $10,000 deal at 50% probability yields a weighted value of $5,000.
C. Days Since Last Contact (Column L)
In cell L2, enter:
=IF(ISBLANK(K2), "No Logged Contact", TODAY() - K2)
Explanation: Subtracts the Last Contact Date from today’s date (TODAY()), returning the exact number of days since you last reached out.
D. Automated Follow-Up Alert Status (Column M)
In cell M2, enter:
=IF(G2="6. Closed-Won", "Closed", IF(G2="7. Closed-Lost", "Archived", IF(ISBLANK(K2), "Needs Contact", IF((TODAY()-K2) > 14, "🚨 URGENT (14+ Days)", IF((TODAY()-K2) > 7, "⚠️ Follow-Up Due", "✅ Up to Date")))))
Explanation: Classifies your leads automatically:
- If closed, marks as “Closed” or “Archived”.
- If no contact has occurred in 14+ days, flags as
🚨 URGENT (14+ Days). - If no contact in 7–14 days, flags as
⚠️ Follow-Up Due. - Otherwise, displays
✅ Up to Date.
Drag cells A2, J2, L2, and M2 down to row 1000, or wrap them in an ARRAYFORMULA for automated extension across new rows.
4. Apply Conditional Formatting for Visual Clarity
Visual cues prevent leads from slipping through the cracks:
- Highlight Column M (Follow-Up Status).
- Go to Format → Conditional formatting.
- Create a rule: Text contains
URGENT→ Fill: Light Red (#FEE2E2), Text: Dark Red (#991B1B). - Create a second rule: Text contains
Follow-Up Due→ Fill: Light Yellow (#FEF08A), Text: Dark Yellow (#854D0E). - Create a third rule: Text contains
Up to Date→ Fill: Light Green (#DCFCE7), Text: Dark Green (#166534).
Step 2: Designing the Activity Log Tab
Tracking touchpoints is critical for maintaining deal continuity when multiple team members work in the same sheet.
-
Create a new tab named Activity Log.
-
Set up headers in Row 1:
A: Log IDB: TimestampC: Lead IDD: Client NameE: Activity Type(Dropdown: Email, Phone Call, Video Meeting, Proposal Sent, Note)F: Summary / NotesG: Logged By(Team member name)
-
In cell
D2, useXLOOKUPto retrieve the client name automatically when aLead IDis entered in Column C:
=IF(ISBLANK(C2), "", XLOOKUP(C2, 'Leads & Contacts'!A:A, 'Leads & Contacts'!B:B, "Unknown Lead"))
This ensures your communication logs remain perfectly indexed to your main contact database.
Step 3: Building the Executive Sales Dashboard
The true power of a spreadsheet CRM lies in executive reporting. Create a third tab named Sales Dashboard to view high-level metrics without wading through hundreds of rows.
1. High-Level Summary KPI Cards
Place these formulas in dedicated dashboard summary blocks:
A. Total Active Pipeline Value
Sums up all active deals excluding closed sales:
=SUMIFS('Leads & Contacts'!H:H, 'Leads & Contacts'!G:G, "<>6. Closed-Won", 'Leads & Contacts'!G:G, "<>7. Closed-Lost")
B. Total Weighted Pipeline Forecast
Calculates expected revenue weighted by deal stage probabilities:
=SUMIFS('Leads & Contacts'!J:J, 'Leads & Contacts'!G:G, "<>6. Closed-Won", 'Leads & Contacts'!G:G, "<>7. Closed-Lost")
C. Total Closed Revenue (YTD)
Sums all successfully closed deals:
=SUMIFS('Leads & Contacts'!H:H, 'Leads & Contacts'!G:G, "6. Closed-Won")
D. Win Rate Percentage
Calculates your conversion efficiency:
=COUNTIF('Leads & Contacts'!G:G, "6. Closed-Won") / (COUNTIF('Leads & Contacts'!G:G, "6. Closed-Won") + COUNTIF('Leads & Contacts'!G:G, "7. Closed-Lost"))
Format cell as Percentage (%).
2. Breakdown by Sales Stage (Pipeline Breakdown Table)
Create a summary table on your dashboard tab:
| Stage Name | Deal Count | Stage Total Value ($) |
|---|---|---|
| 1. New Prospect | =COUNTIF('Leads & Contacts'!G:G, "1. New Prospect") | =SUMIF('Leads & Contacts'!G:G, "1. New Prospect", 'Leads & Contacts'!H:H) |
| 2. Contact Made | =COUNTIF('Leads & Contacts'!G:G, "2. Contact Made") | =SUMIF('Leads & Contacts'!G:G, "2. Contact Made", 'Leads & Contacts'!H:H) |
| 3. Discovery Call | =COUNTIF('Leads & Contacts'!G:G, "3. Discovery Call") | =SUMIF('Leads & Contacts'!G:G, "3. Discovery Call", 'Leads & Contacts'!H:H) |
| 4. Proposal Sent | =COUNTIF('Leads & Contacts'!G:G, "4. Proposal Sent") | =SUMIF('Leads & Contacts'!G:G, "4. Proposal Sent", 'Leads & Contacts'!H:H) |
| 5. Negotiation | =COUNTIF('Leads & Contacts'!G:G, "5. Negotiation") | =SUMIF('Leads & Contacts'!G:G, "5. Negotiation", 'Leads & Contacts'!H:H) |
| 6. Closed-Won | =COUNTIF('Leads & Contacts'!G:G, "6. Closed-Won") | =SUMIF('Leads & Contacts'!G:G, "6. Closed-Won", 'Leads & Contacts'!H:H) |
| 7. Closed-Lost | =COUNTIF('Leads & Contacts'!G:G, "7. Closed-Lost") | =SUMIF('Leads & Contacts'!G:G, "7. Closed-Lost", 'Leads & Contacts'!H:H) |
Select this table and click Insert → Chart → Column Chart or Bar Chart to generate a visual sales funnel right on your dashboard!
Step 4: Automating Email Alerts with Google Apps Script
One advantage cloud software holds over basic spreadsheets is automated notifications. However, using Google Apps Script, you can program Google Sheets to scan your leads every morning and send you an email alert listing all leads requiring follow-up!
1. Access Apps Script
In Google Sheets, click Extensions → Apps Script. Delete any default code in the editor and paste the following custom JavaScript snippet:
/**
* Daily Automated Follow-Up Scanner for ViaSheet Google Sheets CRM
*/
function sendDailyFollowUpReminders() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Leads & Contacts");
if (!sheet) return;
const data = sheet.getDataRange().getValues();
const urgentLeads = [];
// Loop through rows skipping header (i = 1)
for (let i = 1; i < data.length; i++) {
const row = data[i];
const clientName = row[1];
const contactEmail = row[3];
const stage = row[6];
const daysSinceContact = row[11];
const followUpStatus = row[12];
// Check if follow up status contains URGENT or Follow-Up Due
if (followUpStatus && (followUpStatus.indexOf("URGENT") !== -1 || followUpStatus.indexOf("Follow-Up Due") !== -1)) {
urgentLeads.push({
name: clientName,
email: contactEmail,
stage: stage,
days: daysSinceContact
});
}
}
// If urgent leads exist, send email notification
if (urgentLeads.length > 0) {
const recipient = Session.getActiveUser().getEmail(); // Sends to sheet owner
const subject = "🚨 Daily CRM Alert: " + urgentLeads.length + " Leads Need Immediate Follow-Up";
let body = "Hello Sales Team,\n\nThe following leads in your ViaSheet CRM require attention today:\n\n";
urgentLeads.forEach((lead, index) => {
body += (index + 1) + ". " + lead.name + " (" + lead.stage + ") - Last contacted " + lead.days + " days ago.\n";
});
body += "\nOpen your CRM sheet now to log activities and update statuses.\n\nBest regards,\nViaSheet Automated Assistant";
MailApp.sendEmail(recipient, subject, body);
Logger.log("Reminder email successfully sent to " + recipient);
}
}
2. Set Up a Time-Driven Trigger
- In the Apps Script sidebar, click the Triggers icon (the alarm clock icon ⏰).
- Click + Add Trigger (bottom right).
- Set Choose which function to run:
sendDailyFollowUpReminders. - Set Select event source: Time-driven.
- Set Select type of time based trigger: Day timer.
- Set Select time of day: Choose 8am to 9am.
- Click Save and grant permissions when prompted.
Now, every morning at 8:00 AM, Google Sheets will automatically inspect your database and send an email directly to your inbox listing stale leads!
Best Practices for Maintaining Spreadsheet Data Integrity
To prevent your Google Sheets CRM from becoming bloated or corrupted over time, enforce these five security and management guidelines:
- Protect Formula Columns: Select Columns A, J, L, and M on the
Leads & Contactssheet. Right-click, select View more cell actions → Protect range, and restrict editing access strictly to administrators. - Enable 2-Factor Authentication (2FA): Ensure every team member accessing the CRM spreadsheet has Google 2FA enabled on their account to protect sensitive client contact details.
- Use Filter Views Instead of Raw Sorting: When sorting leads by deal size or stage, use Data → Filter views → Create new filter view. Sorting raw data directly can corrupt row associations if formulas reference offset rows.
- Archive Closed Deals Periodically: Move deals marked
6. Closed-Wonor7. Closed-Lostolder than 12 months to anArchivetab to maintain snappy recalculation performance. - Enforce Cell Note Hygiene: Train your team to log interaction details in the dedicated
Activity Logtab rather than cramming paragraph notes into main database cells.
When to Upgrade: The Spreadsheet CRM Break-Point
While a Google Sheets CRM is an extraordinary tool for early-stage ventures, every business eventually reaches operational milestones where specialized architecture becomes necessary.
You should consider moving beyond a basic spreadsheet CRM when:
- Your Sales Team Exceeds 10-15 Active Users: Concurrent edits by dozens of users can cause temporary lagging or sheet locks.
- Your Contact Database Surpasses 25,000 Rows: While Google Sheets supports up to 10 million cells, spreadsheets with tens of thousands of complex
SUMIFSorARRAYFORMULAcalculations can experience slower response times. - You Require Granular Row-Level Access Controls: In Google Sheets, a user with edit permissions can view all rows in a sheet. If your sales representatives must only view their assigned accounts, dedicated software or gated database views are required.
- You Need Native Multi-Channel Phone & Telephony Integration: Click-to-call dialing, automated SMS logging, and call recording natively require VoIP platform integration.
Frequently Asked Questions (FAQ)
Can I connect my Google Sheets CRM to my website contact form?
Yes! You can connect website forms (Elementor, Typeform, WPForms, Squarespace) directly to your Google Sheets CRM using Google Forms natively, or via no-code connectors like Zapier, Make (Integromat), or Webhooks. Every time a potential client submits a inquiry form, a new row is instantly appended to your Leads & Contacts tab.
Can I run a CRM in Microsoft Excel instead of Google Sheets?
Yes. All formulas used in this guide (SUMIFS, XLOOKUP, IF, TODAY) function identically in Microsoft Excel 365. Excel Desktop offers powerful VBA capabilities, though Google Sheets remains superior for cloud-native real-time collaboration.
Is Google Sheets HIPAA compliant for medical or healthcare client records?
Standard Google Sheets accounts are not HIPAA compliant out-of-the-box. However, if your organization subscribes to Google Workspace and signs a Business Associate Agreement (BAA) with Google, HIPAA compliance can be configured with proper access auditing and data loss prevention (DLP) controls.
Upgrade to Pre-Built Professional Spreadsheet CRMs
Building a custom spreadsheet CRM is an empowering project, but setting up executive graphics, formatting responsive mobile views, and debugging complex formulas takes valuable time away from selling.
At ViaSheet, we build battle-tested, professionally engineered Google Sheets & Excel CRM templates tailored specifically for your industry.
Explore our top-rated CRM templates:
- Real Estate CRM Spreadsheet — Built for agents and brokers with property tracking, commission splits, and client follow-up dashboards.
- Construction CRM Template — Tracks bid stages, sub-contractors, project estimate values, and site meeting logs.
- Airbnb & Vacation Rental CRM — Manage reservations, guest communications, cleaning schedules, and revenue performance.
- Insurance Agent CRM — Track policy renewals, premium payouts, carrier metrics, and client policy logs.
- Photography Client Tracker — Manage shoot dates, deposit invoices, gallery delivery statuses, and contract signatures.
Save hours of configuration time today. Explore our complete collection of ViaSheet CRM Spreadsheets and take complete control of your sales pipeline with zero monthly subscription fees!