All articles

Lead list template for Google Sheets and Excel (free CSV download)

A free lead list template with the columns that matter, status dropdowns, data validation and dedupe formulas for Google Sheets and Excel. Download the CSV.

The Leadraft teamLeadraft
Published
Read time
9 min
Category
Guide

A good lead list template has three groups of columns: who the business is (name, category, address), how to reach it (email with its verification result, phone, website, social pages), and where you are with it (status, owner, last contact, next step, do-not-contact). Add a unique ID so you can dedupe, a dropdown for status so values stay consistent, and a COUNTIF check that flags duplicates as you paste in new leads.

Download the free lead list template (CSV). It opens in Google Sheets, Excel, Numbers and any CRM import. It has 29 columns and three clearly fictional example rows to delete. The rest of this guide explains each column and the formulas to add.

What columns should a lead list template have?#

Use columns that answer three questions: who is this, how do I reach them, and what happens next. The template uses the same column names as a Leadraft export, so a file from Leadraft pastes straight in, but every column makes sense for a list you build by hand.

Who the business is#

Scroll horizontally if needed →

ColumnWhat goes in itWhy it matters
lead_idYour own ID: L0001, L0002...A stable key that never changes, even if the name does
businessTrading name as customers see itWhat you'll write in the email
categoryMain trade: Plumber, DentistLets you segment and personalize
address, city, state, postal_code, countryFull address, splitFilter by city or ZIP; use for direct mail
rating, reviewsGoogle rating and review countA rough size and activity signal
maps_url, google_place_idThe listing link and its place IDLets you check the listing and dedupe exactly

The Google place ID is the best dedupe key for businesses from Google Maps. Google describes it as a textual identifier that uniquely identifies a place, so the same business found by two different searches carries the same ID. Place IDs can change occasionally when Google's database is updated, and Google suggests refreshing ones older than a year [1].

How to reach them#

Scroll horizontally if needed →

ColumnWhat goes in itWhy it matters
emailThe best address for this businessYour send address
email_gradeThe verification resultDecides whether you send at all
email_roleGeneric (info@), personal (jane@), and so onChanges how you write the email
phoneE.164 format: +15125550101Sorts, dedupes and dials cleanly
websiteFull URLResearch, and the source of the email
facebook, instagram, linkedinPage URLsA second way to check the business is active

Keep email_grade next to the email. A Leadraft export writes valid for a Verified address and catch_all for an Accept-all one. If you verify with another tool, use its values, but keep the column. An address whose server accepts everything is a maybe, never a yes, so you'll want to filter on it. Catch-all emails, explained covers why.

Where you are with them#

Scroll horizontally if needed →

ColumnWhat goes in it
sourceWhere the lead came from: "Google Maps search", "Referral", "Trade show"
date_addedWhen it entered the sheet (YYYY-MM-DD)
statusOne value from the status list below
assigned_toWho works this lead
last_contactedDate of the last touch
next_step, next_step_dateWhat happens next, and when
do_not_contactTRUE or FALSE
notesAnything else, short

Don't delete a row when someone asks you to stop contacting them. Set do_not_contact to TRUE and keep it. If you delete it, the same business can come back in next month's list and get emailed again.

Which lead statuses should I use?#

Use a short, fixed list where each status means one thing. Nine is enough for most teams:

Scroll horizontally if needed →

StatusMeans
NewAdded, not yet checked
ResearchingChecking fit, finding the right contact
ContactedFirst message sent
RepliedThey answered, any answer
Meeting bookedA call or visit is on the calendar
WonBecame a customer
LostTalked, didn't buy
Not a fitWrong size, wrong trade, closed
Do not contactAsked to stop, or bounced hard

Put the list on a second tab called Lists (one value per cell in column A) and point the dropdown at it. When you need a new status, you add it in one place.

How do I set up data validation and dropdowns?#

Add a dropdown to status and do_not_contact, and reject anything else. This is what keeps a shared sheet usable after a month.

In Google Sheets [2]:

  1. Select the status column, from row 2 down.
  2. Go to Insert > Dropdown (or Data > Data validation > Add rule).
  3. Under Criteria, choose Dropdown (from a range) and select Lists!A2:A10.
  4. Leave invalid entries rejected (the default). Advanced options > Show a warning is the softer choice.
  5. Click Done. Repeat for do_not_contact with the values TRUE and FALSE.

In Excel [3]: select the column, go to Data > Data Validation, set Allow to List, and set Source to =Lists!$A$2:$A$10.

Two more rules worth adding:

  • Dates: on date_added, last_contacted and next_step_date, allow only valid dates.
  • Email: in Google Sheets, data validation has a criterion that checks the text is a valid email. It only checks the format, not whether the mailbox exists.

Watch the import step too. Spreadsheets like to turn +15125550101 into a number and drop leading zeros from ZIP codes such as 02134. In Google Sheets, untick Convert text to numbers, dates, and formulas when you import, or format the phone and postal_code columns as plain text first.

What formulas find duplicate leads?#

Normalize first, then count. Two rows are only duplicates if they match on a stable key, and "Example.com/", "https://www.example.com" and "example.com" are the same website.

Column letters below match the template: D is email, G is phone, H is website, Q is google_place_id.

Normalize the keys (add helper columns at the end of the sheet):

Scroll horizontally if needed →

KeyGoogle SheetsExcel (Microsoft 365)
Email=LOWER(TRIM(D2))=LOWER(TRIM(D2))
Website domain=REGEXEXTRACT(LOWER(H2),"^(?:https?://)?(?:www\.)?([^/]+)")=TEXTBEFORE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(LOWER(H2),"https://",""),"http://",""),"www.","")&"/","/")
Phone digits=REGEXREPLACE(G2&"","[^0-9]","")Format as text, then compare as-is

Flag duplicates with COUNTIF [4]. Put these in a column called dupe:

  • Every copy, including the first: =COUNTIF($Q$2:$Q$5000,Q2)>1
  • Only the second and later copies: =COUNTIF($Q$2:Q2,Q2)>1

The second version is the one you want for cleaning, because the first occurrence returns FALSE and you can filter out the TRUE rows. Run it on the place ID first, then on the normalized domain, then on the email. A chain with one website and ten locations will match on domain but not on place ID: decide whether you want one row per location or one per company.

Highlight duplicates as you type. Select column D, open conditional formatting, choose a custom formula and enter =COUNTIF($D:$D,$D1)>1. Every repeated email turns a color the moment it's pasted.

Check against a suppression tab. Keep everyone who opted out or bounced on a tab called Suppression, one email per row in column A. Then flag them in the main sheet:

=IF(COUNTIF(Suppression!$A:$A,LOWER(TRIM(D2)))>0,"Suppressed","")

Built-in tools. Google Sheets has Data > Data cleanup > Remove duplicates and Excel has Data > Remove Duplicates. Both delete rows in place, so make a copy first and prefer the formula when the sheet holds status history.

How do I use the sheet day to day?#

Filter, work, update. A sheet only works as a tracker if the status and next step are always current.

  1. Each morning, filter next_step_date to today or earlier and do_not_contact to FALSE. That's your list.
  2. After every touch, update status, last_contacted, next_step and next_step_date before you move on.
  3. Each week, filter status = Contacted with last_contacted older than 14 days. Follow up or close them out.
  4. When you add leads, paste them at the bottom, then filter dupe = TRUE and delete those rows.

A helper column for days since last contact makes step 3 one click: =IF(Y2="","",TODAY()-Y2).

How a local lead list is built, step by stepSix steps: find every business with every keyword across every tile of the area; fence the results to the area and trade; remove duplicates by Google place ID; find emails on each business's own website; verify each mailbox; deliver to a file, a cold email tool or a CRM.01Find
Every keyword × every tile
02Fence
Keep in-area, on-trade
03Dedupe
One row per place ID
04Find emails
On their own website
05Verify
Live mailbox check
06Deliver
CSV, Instantly, HubSpot
The six steps behind a list you can send to. Skipping any one of them shows up later as missed businesses, wasted credits or bounces.

Where do the leads come from?#

Any source works with the template, as long as you fill source honestly. For local businesses, the most complete free source is Google Maps: every listing has a name, category, address, phone and often a website. The catch is that Maps shows a limited number of results per search, and it doesn't show email addresses. You find emails on each business's own website, then verify them.

Our guides cover each step: export Google Maps results to Excel, why Maps stops at about 120 results, and the full Google Maps lead generation playbook. If you're sizing a campaign, the lead list calculator works out how many businesses you need for a target number of replies.

When should I move from a spreadsheet to a CRM?#

Move when the sheet starts costing you deals. A spreadsheet is fine for one person or a small team working a few thousand leads. Switch to a CRM when:

  • Several people work the same leads and overwrite each other's updates.
  • You need every email and call logged automatically, not typed in.
  • You're running sequences in a cold-email tool and want replies to update the status on their own.
  • The sheet is tens of thousands of rows and filters get slow.

Because the template uses plain column names, it maps cleanly into a CRM import later. Keep lead_id and google_place_id when you move, so you can still dedupe against the old sheet.

FAQ#

What columns should a lead list have?#

At minimum: business name, category, email, email verification result, phone, website, full address split into city, state and ZIP, a source, the date added, a status, who owns the lead, the last contact date, the next step and a do-not-contact flag. Add a unique ID such as the Google place ID so you can dedupe reliably.

How do I make a lead tracking spreadsheet in Google Sheets?#

Import the CSV template with File > Import, freeze the header row, add a dropdown to the status column (Insert > Dropdown), add a duplicate check with COUNTIF on the email and place ID columns, and filter by status and next-step date each day.

How do I find duplicate leads in Google Sheets or Excel?#

Use COUNTIF on a stable key. =COUNTIF($D$2:$D$5000,D2)>1 flags every email that appears more than once, and =COUNTIF($D$2:D2,D2)>1 flags only the second and later copies, so you keep the first. Normalize first: lowercase emails, strip www. and https:// from websites, and keep only digits in phone numbers.

What lead statuses should I use?#

Keep it short: New, Researching, Contacted, Replied, Meeting booked, Won, Lost, Not a fit and Do not contact. Each status should mean one clear thing, and every lead should have exactly one. Use a dropdown so nobody types a new variation.

Is a spreadsheet good enough, or do I need a CRM?#

A spreadsheet works well for one person or a small team working a few thousand leads. Move to a CRM when several people work the same leads, when you need email history logged automatically, or when the sheet passes tens of thousands of rows and gets slow.

Sources#

  1. Google for Developers, Place IDs.
  2. Google Docs Editors Help, Create an in-cell dropdown list.
  3. Microsoft Support, Create a drop-down list.
  4. Microsoft Support, COUNTIF function.