A sales prospecting spreadsheet needs three zones: what you type, what gets looked up, and what you track. In 2020, I ran outbound with one colleague off a shared sheet: six columns and a Notes column. It worked for about three weeks. Then two things broke on the same Tuesday. So we rebuilt it, and this sales prospecting spreadsheet template is that rebuild.
Here’s what happened. I emailed a prospect my colleague had emailed the day before. And 40 rows sat untouched for eleven days, because nobody could see whose turn it was.
Three columns fixed both problems: Owner, Next Step, and Next Step Date. Six years later, I still use that layout. Let’s build it.
📌 TL;DR: 21 columns in three zones: what you type (A-F), what a lookup fills (G-L), what you manage (M-U). Five formulas, two dropdowns, two conditional-formatting rules, one protected range. Paste the header row below into cell A1 and you're done in about fifteen minutes.
What Should a Sales Prospecting Spreadsheet Track?
Who the prospect is, what you know about them, and what happens next. Three jobs, so three zones. And keeping them apart is the whole trick.
Zone 1, INPUT. The handful of fields you type or import: company, domain, name, title, profile URL. Keep it small. Every extra field here is one somebody researches by hand.
Zone 2, ENRICHED. The fields a lookup fills for you: work email, phone, industry, size, country. Nobody types here. Ever.
Zone 3, WORKFLOW. Status, owner, next step, dates, touches. This is where deals quietly go missing, and most template pages treat it as an afterthought.
Why does separating them matter? Because when typed data and looked-up data share a column, you can’t tell which cells to trust. That one habit ruins data hygiene in almost every sheet I’ve inherited.
One honest note before we build. A sheet like this suits one or two people and a few hundred live rows. Past that, you want a CRM, and the exact signals get their own section below.
Also worth saying: sales prospecting starts with the targeting decision, not the columns. Still deciding who goes in? My guide to building a winning prospecting list covers that, and a good prospect list drops straight into this layout.
The Template: 21 Columns, Defined
Here’s the actual sales prospecting spreadsheet template. Open a blank Google Sheet, click cell A1, and paste this line:
Company,Domain,First Name,Last Name,Job Title,LinkedIn URL,Work Email,Company Phone,Industry,Employees,Country,Enriched On,Ready,Status,Owner,Last Touch,Next Step,Next Step Date,Touches,Outcome,Notes
Then go to Data → Split text to columns → Comma. Your 21 headers land in A1 through U1. Freeze row 1 and setup is done. No download, no gated file, no email to hand over.
Zone 1: Columns A-F, the fields you fill
- A. Company: the name as the company writes it. Type “Bluepine Software,” not “bluepine sw.”
- B. Domain: bluepinesoftware.com, no https:// and no www. Your join key and your duplicate check.
- C. First Name: one person per cell. Split “Lena and Marco” into two rows first.
- D. Last Name: always separate from the first name. A merged cell is harder to match.
- E. Job Title: the title they actually use. Handy for filtering by seniority.
- F. LinkedIn URL: the profile URL, if you have it. Prefer it; a URL points at one human.
List arriving as a file instead? Same six inputs. My CSV enrichment walkthrough covers the import round-trip.
Zone 2: Columns G-L, the fields a lookup fills
- G. Work Email: the verified business address. Never type a guess here; zone 2 means “checked.”
- H. Company Phone: the main business line, for accounts worth calling twice.
- I. Industry: a company-level field, so it repeats across every contact there.
- J. Employees: headcount as a number, not “50-100,” or you can’t sort it.
- K. Country: drives sending times and compliance rules, so it earns a column.
- L. Enriched On: the date of the run. Type it with Ctrl+; and do NOT use
=TODAY(), which rewrites itself whenever the file opens.
Columns I, J and K are all company-level, so they fill in one pass. That’s the company enrichment in Google Sheets job rather than the contact one.
Zone 3: Columns M-U, the fields you manage
- M. Ready: a formula, not a typed value. It says whether the row is contactable.
- N. Status: a dropdown of nine options. Free text here and your counts stop working.
- O. Owner: a dropdown of the people who send. Non-negotiable on a shared sheet.
- P. Last Touch: the date of your most recent contact, formatted as a date.
- Q. Next Step: one line of free text, written as an action (“send case study”).
- R. Next Step Date: the most important column in the sheet. Empty means the row is drifting.
- S. Touches: a number you bump after each contact. It exposes rows you quietly gave up on.
- T. Outcome: a second dropdown with Won, Lost, No reply, Not a fit. Status is where a row is; outcome is how it ended.
- U. Notes: one column, far right, where the messy human context lives.
💡 Pro Tip: Put your two date columns (P and R) side by side and format both as dates, not text. A date stored as text can't be sorted, compared or counted, so every overdue rule you build on it fails silently.
Which Formulas Make the Sheet Work?
Five short formulas: a readiness check, a duplicate flag, a name helper, and a small summary block. None of them is clever. All of them save you from reading rows one at a time.
- M. Ready:
=IF(COUNTA($A2,$C2,$D2,$G2)=4,"Ready","Missing data"). A row is contactable only when the company, both name fields and the email are all present. - Duplicate check:
=IF($G2="","",IF(COUNTIF($G$2:$G,$G2)>1,"duplicate","")). Drop it into any empty column while you clean, then delete the column when you’re done. - Full-name helper (optional):
=IF($C2="","",$C2&" "&$D2). Handy when a mail-merge tool wants one name field instead of two.
Now the summary block. Put these six on a second tab, or in spare cells above the header, and you get your pipeline at a glance:
- Rows:
=COUNTA($A$2:$A) - Ready to contact:
=COUNTIF($M$2:$M,"Ready") - Email coverage:
=IFERROR(COUNTA($G$2:$G)/COUNTA($A$2:$A),""), formatted as a percentage - Contacted:
=COUNTIF($N$2:$N,"Contacted") - Reply rate:
=IFERROR(COUNTIF($N$2:$N,"Replied")/COUNTIF($N$2:$N,"Contacted"),""), formatted as a percentage - Overdue follow-ups:
=COUNTIFS($R$2:$R,"<"&TODAY(),$R$2:$R,"<>",$N$2:$N,"<>Won",$N$2:$N,"<>Lost")
That last COUNTIFS is the one nobody bothers to write, and the one I check every morning. It counts rows with a past next-step date that haven’t closed.
Be honest with yourself about one number, though. Reply rate off a spreadsheet is rough, because status only moves when somebody remembers to move it.
How Do You Set Up the Dropdowns, Colors and Locked Columns?
Data validation for the typed columns, conditional formatting for the dates, and a protected range for zone 2. Fifteen minutes, once, and the sheet starts doing work for you.
The status dropdown (column N)
Select N2:N, then Data → Data validation → Dropdown, and enter these nine options exactly: New · Researching · Ready · Contacted · Replied · Meeting · Won · Lost · Nurture. Google’s in-cell dropdown help page walks through the dialog if it’s your first one.
Why nine and not twenty? Because a shorter list actually gets used. Nine covers the real states of a deal, and nobody hesitates over which one to pick.
The owner dropdown (column O)
Same setup, different list: the names of the people who actually send. This column exists because of my Tuesday, and every shared sheet needs it.
📌 Example (Mary's Tuesday): Two reps, one shared sheet, one prospect emailed twice in two days, and 40 rows that sat untouched for eleven. Three columns fixed all of it: Owner, Next Step, Next Step Date.
Two color rules that chase you
Select A2:U, then Format → Conditional formatting → Custom formula is, and paste this for the overdue rule:
=AND($R2<>"",$R2<TODAY(),$N2<>"Won",$N2<>"Lost")
Google’s conditional formatting guide covers the custom-formula option. And the effect is the point: the sheet now tells YOU who is overdue, instead of waiting to be asked.
Add a second rule in a different color for rows that have gone quiet:
=AND($P2<>"",TODAY()-$P2>14,$N2="Contacted")
That catches rows you contacted a fortnight ago and never touched again. Adapt the 14 to your own cadence; two weeks is a convention, not a law.
Lock zone 2
Select columns G through L, then Data → Protect sheets and ranges, and set the range to warn or restrict. Google’s protect sheets and ranges help page shows both settings.
This rule keeps typed and looked-up data from mixing. It’s the least glamorous step here, and it pays off longest.
How Do You Fill the Enriched Columns Without Typing Them?
Point an enrichment add-on at your input columns and let it write zone 2. That’s prospecting in Google Sheets with far less typing.
Think about what the add-on sees. Zone 1 is what a lookup reads, zone 2 is what it writes, and zone 3 stays yours. No other lead tracker template for Google Sheets I’ve used is built that way.
- Install the add-on. Grab it from the Google Workspace Marketplace. Never installed one before? Google’s add-ons help page explains where they appear.
- Copy your API key. It lives in your CUFinder dashboard.
- Enter the API key in the add-on. Once, and you’re connected.
- Pick the service that matches what you HAVE. Open the add-on from the Google Sheets menu. It opens as a right panel listing all the enrichment services. Names plus companies → Contact Enrichment, which returns email, phone, job title and LinkedIn. LinkedIn profile URLs → the work email from LinkedIn service. Industry, size and country → company enrichment.
- Map the columns and set the range. Input columns A and C-D (or F if you have profile URLs), output column at the start of zone 2, row range 2-201, and run it.
Then one habit: type today’s date into column L for the rows you just ran. In three months, that column tells you whether to trust the email or re-run it.
Filling only column G? That’s the email finder in Google Sheets workflow, and it’s the fastest run in the sheet. Want G through K in one pass? Then you’re doing lead enrichment in Google Sheets. And for a really big batch, the bulk email finder route handles volume better.
Now the limits, plainly. Some rows come back empty, and that’s the honest answer rather than a failure. Credits get consumed on each run, and coverage varies by region and seniority. So test rows 2-6 first, check those five results, then run the full range.
A Worked Example: 5 Rows, Before and After
Let’s shrink the sheet to fit the page. Below, columns A, C, D, G and M sit side by side: company, first name, last name, work email, Ready. Here’s the list before any run:
| A | C | D | G | M | |
|---|---|---|---|---|---|
| 1 | Company | First Name | Last Name | Work Email | Ready |
| 2 | Hansel Logistics | Lena | Fischer | Missing data | |
| 3 | Bluepine Software | Marco | Ruiz | Missing data | |
| 4 | Corvid Analytics | Priya | Nair | Missing data | |
| 5 | Marlow & Sons | Tom | Okafor | Missing data | |
| 6 | Tidewater Robotics | Sofia | Berg | Missing data |
Then I picked Contact Enrichment, set the inputs to the company and name columns, the output to column G, and the range to rows 2-6. A minute later, the same five rows looked like this:
| A | C | D | G | M | |
|---|---|---|---|---|---|
| 1 | Company | First Name | Last Name | Work Email | Ready |
| 2 | Hansel Logistics | Lena | Fischer | lena.fischer@hansellogistics.com | Ready |
| 3 | Bluepine Software | Marco | Ruiz | marco.ruiz@bluepinesoftware.com | Ready |
| 4 | Corvid Analytics | Priya | Nair | priya.nair@corvidanalytics.com | Ready |
| 5 | Marlow & Sons | Tom | Okafor | Missing data | |
| 6 | Tidewater Robotics | Sofia | Berg | sofia.berg@tidewaterrobotics.com | Ready |
One run filled column G, and column M recalculated itself the instant the emails landed. Nobody typed the word “Ready” anywhere.
→ names → emails → Ready → your sending list, filtered in one click.
And row 5? It didn’t fail silently. Tom’s cell stayed empty, column M kept saying “Missing data,” and that row never entered the cold outreach batch. Honest beats optimistic.
When Should You Stop Using a Spreadsheet?
When more than two people edit it, or when you pass a few hundred live rows. I’d rather tell you that than pretend a sales leads spreadsheet scales forever.
Watch for these five signals:
- Two or more people editing at the same time, overwriting each other’s rows.
- No history of what changed, so nobody can answer “who moved this to Lost?”
- Reply tracking done from memory, or from a mailbox somebody has to remember to check.
- Sequences you want to schedule and simply can’t, because a sheet doesn’t send anything.
- Reporting that takes longer than the prospecting itself.
Hit three of those and it’s time to move. The upgrade path is boring on purpose: export as CSV, import it, and keep the same column names so the mapping takes five minutes.
Nothing in this template locks you in. And if you’d rather stay in Sheets a while longer, there’s a wider world of Google Sheets add-ons for lead generation that can stretch a lead generation spreadsheet further than you’d expect.
What Mistakes Ruin a Prospecting Sheet?
Typing into the enriched zone, no owner, no next-step date, and free text where a dropdown belongs. I’ve made all of these, so treat this list as a scar map.
- Typing into the enriched zone. Once a human edits column G, you can’t tell which addresses were verified and which were hopeful.
- No Owner column on a shared sheet. That’s my Tuesday: two reps, one prospect, two emails, one confused reply.
- No Next Step Date. Rows go quiet for eleven days and nobody notices, because nothing is asking.
- Free text where a dropdown belongs. “Contacted,” “contacted” and “Emailed” become three statuses, and every COUNTIF goes wrong.
- Dates stored as text. Nothing sorts, nothing counts, and the overdue rule never fires.
- Sending without a lawful basis or an opt-out. GDPR wants a lawful basis such as legitimate interest plus an easy opt-out, and the CAN-SPAM Act wants honest headers, a physical address and a working unsubscribe. Both apply to a spreadsheet exactly as they apply to a CRM.
🔍 Did You Know? A status list of nine beats a status list of twenty. Every extra option is a decision your future self has to make at 8am with a coffee in one hand.
FAQ: Sales Prospecting Spreadsheets
How do I track leads in Google Sheets?
One row per prospect, a status dropdown, an owner, and a next-step date. Lead tracking in Google Sheets works fine at small scale, and that last column does most of the work. Without a date to chase, rows just drift.
What columns should a sales prospecting spreadsheet have?
Three groups: what you type, what a lookup fills, and what you manage. If you only keep five, keep Company, Domain, Work Email, Status and Next Step Date. Everything else in this prospect tracking spreadsheet helps, but those five you can’t run without.
Is there a free sales prospecting spreadsheet template?
Yes, plenty, including this one. You build it from the header row above in about fifteen minutes, and it costs nothing. No file to download, no address to hand over: the template is the text on this page.
Can I use Google Sheets as a CRM?
Yes, for one or two people and a few hundred rows. The limits are concurrent editing, change history and reporting, and all three bite quickly. Once you hit them, move. The section above lists the five signals.
How do I fill in emails for a prospecting sheet?
Run a lookup on your name and company columns, or on LinkedIn URLs. Never guess a pattern and send the same day. A verified address in column G is worth ten plausible ones, and unmatched rows should stay empty.
How often should I update a sales prospecting spreadsheet?
Touch dates the same day, always. Status and Last Touch are worthless if you update them on Friday from memory. Then re-verify any email column older than about six months, because people change jobs and addresses rot.
Should the same sheet hold companies and contacts?
Keep one row per PERSON, with the company name repeated on each row. That repetition looks wasteful and saves you constantly. Need company-level tracking too? Make that a second tab, keyed on the domain column.
Build It Before Your Next Batch
That’s the whole sales prospecting spreadsheet template. Twenty-one columns, three zones, the formulas, the dropdowns, and two rules that make the sheet chase you instead of the other way round.
Six years after that Tuesday, I’m still using this layout. Not because it’s clever, but because it stopped costing me prospects.
So go paste that header row before your next batch lands. Then come back to the data enrichment in Google Sheets hub when you’re ready to fill more of zone 2 automatically.
One question for you: which column would YOU add? Tell me in the comments; I’ve changed my own layout twice because of an answer like that.