Blog
September 4, 2026

Enrich Lead Lists in Google Sheets vs Paid Enrichment Tools

Enrich lead lists in Google Sheets: turn a 3-column export into a 14-column prospect sheet with formulas and no per-record fees. Copy the template.

Phil
Phil
17 mins read

You run outbound for a small software team, and 300 new leads land in your sheet every Monday. Each row has a name, a company, and a website, and nothing else. Looking every one of them up by hand takes about 6 hours, so most rows never get a personalized email.

Paid enrichment tools solve this for teams with budget and someone to manage the integration. Formulas solve it for teams with neither. Here is the first one. It runs down the whole column.

Formula
=AITEXT("What is the current job title of " & A2 & " at " & B2 & "? Reply with the title only. If you cannot find it, reply Not found.", , TRUE)

The third argument turns on web search, so the model looks the person up before it answers. Works with OpenAI, Claude, and Perplexity models picked in the sidebar.

What comes back

A (Name)B (Company)D (=AITEXT result)
Dana WhitfieldNorthwind LogisticsVP of Operations
Marcus OyelaranBrightline Dental GroupDirector of Patient Experience
Priya RamanKestrel AnalyticsHead of Revenue Operations
Tom AlvarezHarbor Point RoofingNot found

Drag that formula down 300 rows and go get coffee. One prompt, 300 lookups, and a title column you did not have to type. That is the whole idea of this post. A bare lead list becomes a research sheet one column at a time, and by the end you have 14 columns, a quality score, and a template you can import. New to the add-on? The getting started guide takes five minutes.

Quick verdict

OptionBest forPrice shapeData sourceSetup
SheetMagic formulasTeams that live in Sheets and want to define every field themselvesMonthly plan with a usage allowance, no per-record feeLive web pages, LinkedIn company pages, job boards, any AI modelInstall the add-on, paste formulas
ApolloTeams that want a contact database and email sequencing in one placeFree Starter plan, then paid plans by seat count, with monthly credit limitsIts own database, 240M+ contacts and 30M+ companiesSign up, search, export
ZoomInfoSales, marketing, and recruiting teams buying through a sales processNo public prices. Contact sales or start a free trialIts own database, 420M+ contacts and 145M+ companiesDemo, then one-click export to your CRM
ClearbitHubSpot customersClearbit has joined HubSpot. Pricing is not published on clearbit.comIts own databaseThrough HubSpot

What paid enrichment tools do well

They have a database you can search before you have a single name. Apollo's site puts it at 240M+ contacts and 30M+ companies, filtered by job title, seniority, company size, industry, and location. ZoomInfo's says 420M+ contacts, 145M+ companies, and 300+ attributes including technology stack and funding.

They connect to the CRM. Apollo describes syncing contact data and outreach campaigns with Salesforce and HubSpot. ZoomInfo describes one-click export and automatic record sync with major CRMs.

They send as well as enrich. Apollo includes built-in email sequencing, and ZoomInfo sells an Engage product alongside its data, offered by demo or free trial.

Where they fall short

The price scales with records. Apollo meters usage in credits with a monthly limit, and export credits are spent every time a contact leaves the tool. The month's allowance runs out right when the event list arrives.

The fields are whatever the database holds. If your playbook needs "does this company use HubSpot" or "what did they announce last quarter," you write that question yourself, and a database has no box for it.

The data is only as fresh as the last refresh. ZoomInfo describes continuous verification, and Apollo does not say. A formula that reads the company's website today needs no refresh cycle at all.

And the list lives in their tool. Every workflow starts with an export.

How SheetMagic handles the same job

Put one formula at the top of each new column, reference the columns you already have, and drag down. Each column is one question about the lead.

Columns A to C are your raw list. Everything after that is a formula.

ColumnFieldFormula
ANameyour data
BCompanyyour data
CWebsiteyour data
DJob titleAITEXT with web search
ESeniorityAITEXT
FHomepage textVISIT
GIndustryAITEXT reading F
HTech stackAITEXT reading F
IRecent newsAITEXT with web search
JHiring signalAITEXT with web search
KTalking pointAITEXT reading D, G, I
LPain hypothesisAITEXT reading G, H, J
MScorenative COUNTA
NDuplicatenative COUNTIF

Layer 1: company info from the homepage

VISIT pulls the readable text of a page into a cell. Then two AITEXT formulas read that cell and answer specific questions.

Formula
=VISIT(C2)

Column F. Fetches the homepage as clean text, up to 50K characters. The cell shows a loading placeholder first and fills in within about a minute.

Formula
=AITEXT("From this homepage text, give the industry and what the company sells in under 15 words. If unclear, reply Not found.", F2)

Column G. Reads the text in F2, so there is no second fetch and no second credit.

Formula
=AITEXT("List every software product, platform, or integration named in this text, comma separated. If none, reply None.", F2)

Column H. Tech stack from the same text.

What comes back

C (Website)G (Industry)H (Tech stack)
northwindlogistics.comFreight logistics, regional LTL trucking and warehousingSamsara, QuickBooks, HubSpot
brightlinedental.comMulti-location dental group, general and cosmetic dentistryDentrix, Weave, Google Reviews
kestrelanalytics.ioB2B analytics software for e-commerce brandsShopify, Snowflake, Slack, Stripe

One VISIT per company, then as many AITEXT questions as you want against that one cell. The AI columns spend tokens, not credits, and short prompts on a small model are cheap. Pick GPT-4o mini, Claude Haiku, or Gemini Flash in the sidebar for these classification jobs.

Keep Formula is on by default. Once a result lands, the value is frozen and the formula is kept as text with a leading apostrophe, so the sheet never re-runs it on recalculation. You pay for each lookup once.

If your list has LinkedIn company URLs, add employee counts from a side tab. LINKEDINCOMPANY takes a whole range and spills one row per company.

Formula
=LINKEDINCOMPANY(Companies!A2:A301)

Runs in the background and writes the table below the formula within about a minute. Put it on its own tab so the spill has room.

What comes back

Company NameIndustryEmployeesHeadquartersWebsite
Northwind LogisticsTransportation210Tacoma, WAnorthwindlogistics.com
Brightline Dental GroupHealth care340Las Vegas, NVbrightlinedental.com
Kestrel AnalyticsSoftware48Denver, COkestrelanalytics.io

A VLOOKUP on the website column pulls Employees back into the main sheet.

Layer 2: contact info (role, seniority)

The opening formula already filled column D with a job title. Seniority is a classification, so it needs no web search.

Formula
=AITEXT("Classify this job title as one of: C-level, VP, Director, Manager, Individual contributor. Reply with the label only.", D2)

Column E. A fixed label set means you can filter and count on it later.

What comes back

D (Job title)E (Seniority)
VP of OperationsVP
Director of Patient ExperienceDirector
Head of Revenue OperationsDirector
Not foundIndividual contributor

When you only have the company

Sometimes the export has a domain and no name at all. FINDLEADS searches for people by title at a domain, in a location, or in an industry, and spills a table.

Formula
=FINDLEADS({"VP of Sales","Head of Sales"}, , C2, , 5)

Up to 5 sales leaders at the domain in C2. Background function, about a minute. Run it in a side tab so the spill has room.

What comes back

Full NameJob TitleSeniorityEmailLinkedInCompany
Elena MarshVP of SalesVPe.marsh@northwindlogistics.comlinkedin.com/in/elenamarshNorthwind Logistics
Devon HaleHead of Sales, WestDirectord.hale@northwindlogistics.comlinkedin.com/in/devonhaleNorthwind Logistics
Ravi SethiSales DirectorDirectorNot foundlinkedin.com/in/ravisethiNorthwind Logistics

Then check the emails before anyone sends. VALIDATEEMAIL takes the whole column.

Formula
=VALIDATEEMAIL(Leads!D2:D301)

Flags undeliverable, disposable, and role-based addresses. Background function. One formula for the whole column.

What comes back

EmailResultQualityDetail
e.marsh@northwindlogistics.comdeliverablehighmailbox exists
d.hale@northwindlogistics.comdeliverablehighmailbox exists
info@harborpointroofing.comriskylowrole-based address

Layer 3: intent signals (news, hiring)

Now the columns that make an email timely. The pattern is the same as the opening formula: AITEXT with web search on, asking one narrow question.

Formula
=AITEXT("In two sentences, what is the most recent public news about " & B2 & " in the last 6 months? Cover funding, hiring, leadership changes, or launches, and include the month. If nothing is found, reply Not found.", , TRUE)

Column I. Asking for the month lets you sort by recency later.

Formula
=AITEXT("Is " & B2 & " currently hiring for sales, marketing, or operations roles? Reply Yes or No, then one job title if Yes.", , TRUE)

Column J. A hiring company has budget and a problem. That is a reason to write this week.

What comes back

B (Company)I (Recent news)J (Hiring signal)
Northwind LogisticsOpened a fourth Tacoma terminal in July 2026 and is hiring 40 dispatchers. Announced a customer tracking portal in August 2026.Yes, Operations Manager
Brightline Dental GroupAcquired two Las Vegas practices in June 2026, bringing the group to 22 locations. No funding news found.Yes, Regional Marketing Manager
Kestrel AnalyticsRaised a Series A in May 2026 and added a Snowflake integration in August 2026.Yes, Account Executive

For your top 30 accounts, replace the one-cell answer with the full picture. JOBSEARCH returns every open role across Indeed, LinkedIn, Glassdoor, and ZipRecruiter as a table.

Formula
=JOBSEARCH(B2, "US", , , , 20)

Up to 20 openings for the company name in B2. Background function. Columns include title, location, posted date, salary range, and platform.

What comes back

TitleCompanyLocationPostedPlatform
Operations ManagerNorthwind LogisticsTacoma, WA2026-08-28Indeed
Dispatcher (Night)Northwind LogisticsTacoma, WA2026-08-26ZipRecruiter
Fleet CoordinatorNorthwind LogisticsSeattle, WA2026-08-19LinkedIn

Layer 4: personalization (talking points, pain hypotheses)

The last two columns turn research into an opening line. They reference the columns you already filled, so they need no web search at all. For more prompt patterns like these, see the 50 prompt templates.

Formula
=AITEXT("Write one sentence a salesperson could open an email with, referencing this: Title: " & D2 & ". Industry: " & G2 & ". News: " & I2 & ". No flattery, no exclamation marks.", )

Column K. Specific because it reads three specific cells.

Formula
=AITEXT("Given this industry, tech stack, and hiring signal, name the single most likely operational pain this company has right now, in under 20 words. Industry: " & G2 & ". Stack: " & H2 & ". Hiring: " & J2, )

Column L. A hypothesis, not a fact. Label it that way in the email.

What comes back

A (Name)K (Talking point)L (Pain hypothesis)
Dana WhitfieldCongrats on the fourth Tacoma terminal, 40 new dispatchers is a lot of onboarding for an ops team.Dispatcher onboarding and shift scheduling across four sites with a QuickBooks-era back office.
Marcus OyelaranTwo new Las Vegas practices in June means 22 locations sharing one patient experience playbook.Keeping review response and recall reminders consistent across 22 practices on Weave.
Priya RamanA Series A and a Snowflake integration in the same summer usually means the sales team is about to grow.New AEs need a repeatable outbound motion before the Series A runway gets spent.

Score the data before anyone emails it

Two native formulas keep bad rows out of the sequencer.

Formula
=COUNTA(D2:L2) - COUNTIF(D2:L2, "Not found") - COUNTIF(D2:L2, "None")

Column M. Counts filled research cells and subtracts the misses. A row scoring 7 or more is ready. Below 4, skip it or look it up by hand.

Formula
=IF(COUNTIF($A$2:$A$301, A2) > 1, "Duplicate", "")

Column N. Flags any name that appears twice. Event lists and LinkedIn exports overlap more than you would think.

What comes back

A (Name)M (Score)N (Duplicate)
Dana Whitfield9
Marcus Oyelaran9
Priya Raman9
Tom Alvarez3Duplicate

Filter on Score and Duplicate, and the 300-row list becomes the 180 rows worth a personalized email.

Every formula in this post runs on the free plan. Free comes with 20,000 AI tokens and 100 integration credits, one time, no card. That covers the AI columns on a few dozen rows and about 100 page fetches. If you enrich a list like this every week, Solo gives you 3.25M tokens and 10K credits a month, which is thousands of leads. See pricing.

Side by side on a real workflow

The task: 300 leads from a trade show, enriched and ready for a sequencer.

StepPaid enrichment toolSheetMagic in Sheets
1Export the badge scan to CSVPaste the badge scan into columns A to C
2Import into the tool, map columnsPaste the 11 formulas from the template into row 2
3Run enrichment, spend 300 creditsDrag row 2 down, wait about a minute for the background functions
4Export the enriched CSVFilter on Score and Duplicate
5Import into Sheets or the CRMDone, it is already in Sheets
6Add custom fields by hand or with a second toolAdd a column and write another prompt

The tool wins step 1 when you have no list at all. The sheet wins everywhere else, and step 6 is the one that matters. Your playbook changes every quarter, and a new question is a new column, not a support ticket.

When to still use a paid enrichment tool

Use one when you are starting from zero and need a searchable database of people, not just companies. FINDLEADS helps, but a full database is deeper.

Use one when CRM sync is the whole point and nobody on the team will touch a sheet. Apollo names Salesforce and HubSpot on its site.

Use one when you need direct phone numbers at scale. Apollo sells mobile credits, and ZoomInfo advertises 120M+ direct dials. Website scraping finds the main line, not the direct dial.

For everything else, the sheet is cheaper, more current, and yours. More lead-gen workflows are on the lead generation page.

Copy this template

Download the template CSV. Import it into a blank sheet (File, Import, Upload) and the formulas are ready to drag down.

ColumnHeaderRow 2
ANameyour data
BCompanyyour data
CWebsiteyour data
DJob title=AITEXT("What is the current job title of " & A2 & " at " & B2 & "? ...", , TRUE)
ESeniority=AITEXT("Classify this job title as one of: ...", D2)
FHomepage text=VISIT(C2)
GIndustry=AITEXT("From this homepage text, give the industry ...", F2)
HTech stack=AITEXT("List every software product ...", F2)
IRecent news=AITEXT("... most recent public news about " & B2 & " ...", , TRUE)
JHiring signal=AITEXT("Is " & B2 & " currently hiring ...", , TRUE)
KTalking point=AITEXT("Write one sentence ... " & D2 & ... & I2, )
LPain hypothesis=AITEXT("... " & G2 & ... & J2, )
MScore=COUNTA(D2:L2) - COUNTIF(D2:L2, "Not found") - COUNTIF(D2:L2, "None")
NDuplicate=IF(COUNTIF($A$2:$A$301, A2) > 1, "Duplicate", "")

Put LINKEDINCOMPANY, FINDLEADS, VALIDATEEMAIL, and JOBSEARCH on their own tabs. They spill tables, and a spill needs empty cells below and to the right.

What to watch for

  • Background functions (VISIT, LINKEDINCOMPANY, FINDLEADS, VALIDATEEMAIL, JOBSEARCH) show a loading placeholder first and fill in within about a minute. The formula is not broken.
  • Spilled tables land one row below the formula cell. Leave that space empty or Sheets shows a #REF! error.
  • Web search and scraping only see public pages. "Not found" is a real answer, and the score column exists so you notice it.
  • Background scrapers bill a few credits per row returned, so set the last argument (the row limit) on purpose.

Start with the job title column on your next 20 leads. Once that works, add one column a day until the sheet matches the template.

Wrap-up

Spreadsheets shouldn't limit what you can do. SheetMagic brings AI and web scraping to your workflow, whether you're generating content, scraping data, or automating repetitive tasks.

If that sounds like the kind of tooling you want to use, try SheetMagic or watch our tutorials.