SheetMagicSheetMagic

Enrich Lead Lists in Google Sheets

Enrich lead lists in Google Sheets with formulas. A 3-column export becomes a 14-column prospect sheet, 6 hours down to 20 minutes. Copy the template.

Phil Nguyen · 15 min read · Updated

You run outbound for a small software team, and 300 fresh leads land in your sheet every Monday. Each row holds a name, a company, and a website. Nothing else. Looking all 300 up by hand costs about 6 hours a week, so most rows never get a real first line.

Paid enrichment tools fix that if you have the budget and someone to own the integration. Formulas fix it if you have neither. Here is the first one.

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 answering. Pick an OpenAI, Claude, or Perplexity model in the sidebar for this one.

What comes back

A (Name)B (Company)E (=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

Now drag it down 300 rows and go do something else. One prompt, 300 lookups, a title column you never typed. That is the pattern for the rest of this post: one column at a time until the bare export is a research sheet. 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 each field themselvesMonthly plan with a usage allowance, no fee per recordLive web pages, LinkedIn company pages, job boards, plus any AI modelInstall the add-on, paste formulas
ApolloTeams that want a contact database and email sending in one toolFree Starter plan that is free forever, paid plans above it, usage metered in credits with a monthly capIts own database, 240M+ contacts and 30M+ companiesSign up, search, export
ZoomInfoSales, marketing, and recruiting teams buying through a sales processNo prices published. Request a demo or start a free trialIts own go-to-market databaseDemo, then export to your CRM
ClearbitHubSpot customersNot published on clearbit.comIts own databaseThrough HubSpot

What the paid tools do well

They hand you a database before you have a single name. Apollo's homepage puts its own at 240M+ contacts and 30M+ companies, with filtering by job title, seniority, company size, industry, and location. If your target list does not exist yet, that is worth paying for.

They plug into the CRM. Apollo lists integrations with Salesforce and HubSpot. ZoomInfo describes exporting straight into your CRM. Nobody has to babysit a spreadsheet.

They also send. Apollo includes built-in email sequencing and multi-touch campaigns, so research and outreach live in one place. Clearbit went further and joined HubSpot outright, and it does the normalized-role, corporate-hierarchy, and IP-intelligence work inside that platform.

Apollo says over 600,000 companies use it. ZoomInfo's about page says 30,000+ customers. These are real products doing a real job.

Where they fall short

The cost tracks the record count. Apollo meters usage in credits with a monthly cap, and its own page describes a 10,000 credit monthly limit on non-paying Unlimited accounts. Your allowance runs dry the week the conference list arrives.

The fields are whatever the vendor stores. Your playbook might need "does their careers page mention Python" or "what did they announce last quarter". A database has no column for a question you invented on Tuesday.

Prices are often not on the page at all. ZoomInfo's pricing page publishes no numbers and asks you to request a demo. Clearbit's site publishes none either. Small teams tend to want a number before a call.

And the freshness is the vendor's refresh cycle, not today. A formula that reads the company's homepage right now has no refresh cycle to wait for.

How SheetMagic handles the same job

Same sheet, one column per question. Every column below is a formula you drag down.

Read the company's own homepage

The website column is the most underused field in any lead export. Pull the page in, then ask questions of the text.

Formula

=VISIT(C2)

Returns the readable text of a page, up to 50,000 characters, in one cell. This one runs in the background, so you see a loading placeholder for up to about a minute before the text lands.

What comes back

C (Website)G (=VISIT result, truncated here)
northwindlogistics.comNorthwind Logistics moves temperature-sensitive freight for regional grocery chains. Our fleet of 240 trucks...
brightlinedental.comBrightline Dental Group operates 18 practices across Ohio and Indiana. Same-day crowns, clear aligners...
kestrelanalytics.ioKestrel Analytics builds churn models for subscription businesses. Built on Snowflake and dbt, integrates with...

Then two AI columns read that text instead of the whole internet.

Formula

=AITEXT("In 12 words or fewer, what does this company sell and who buys it?", G2)

The second argument is the context cell. The model only sees the page text, so the answer stays grounded in what the company actually says.

What comes back

B (Company)H (=AITEXT result)
Northwind LogisticsRefrigerated freight hauling for regional grocery chains
Brightline Dental GroupMulti-location dental care, same-day crowns and aligners
Kestrel AnalyticsChurn prediction software for subscription businesses

Swap the prompt and you get another column from the same text. "Name any software tools mentioned on this page" gives you a rough tech-stack signal for free, because the page is already in column G.

Pull the LinkedIn company facts

When your export has company LinkedIn URLs, one formula covers the whole list.

Formula

=LINKEDINCOMPANY(D2:D50)

Give it the whole range, not one cell. One formula, one job, one bill, one spilled table. It runs in the background and takes about a minute.

What comes back

Company NameIndustryEmployeesHeadquartersWebsiteSpecialties
Northwind LogisticsTruck Transportation310Columbus, OHnorthwindlogistics.comCold chain, LTL freight, grocery distribution
Brightline Dental GroupHospitals and Health Care640Cincinnati, OHbrightlinedental.comGeneral dentistry, orthodontics, DSO operations
Kestrel AnalyticsSoftware Development47Austin, TXkestrelanalytics.ioChurn modeling, data science, subscription analytics

Put this on its own tab. It spills a wide table, so it needs empty space to the right and below. Then bring the two fields you care about back to the main sheet with a plain VLOOKUP on company name.

When you only have the domain

Sometimes the row has a company and no person. Search by role instead of by name.

Formula

=FINDLEADS({"VP of Sales","Head of Revenue Operations"}, , "kestrelanalytics.io", , 25)

Job titles go in an array literal, the third argument is the company domain, and the last is the row cap. Background function, one spilled table.

What comes back

Full NameJob TitleSeniorityEmailLinkedInCompanyCompany Size
Priya RamanHead of Revenue OperationsDirectorpriya@kestrelanalytics.io/in/priyaramanKestrel Analytics11-50
Devon BlakeVP of SalesVPdevon.blake@kestrelanalytics.io/in/devonblakeKestrel Analytics11-50
Ana SousaSales Operations ManagerManagerana.sousa@kestrelanalytics.io/in/anasousaKestrel Analytics11-50

That covers the gap paid tools are hired for. You are searching by title and domain, and the result lands in the sheet rather than in an export queue.

Add an intent signal

A title is not a reason to email. News and hiring are.

Formula

=GNEWS(B2 & " funding OR launch OR expansion", "us", "en", TRUE, 5)

Google News for one company, newest first, five rows. Runs instantly and costs 3 integration credits per call.

What comes back

PositionTitleURLSourcePublishedAt
1Kestrel Analytics raises $12M Series Atechfundingnews.com/kestrel-series-aTech Funding News2026-08-27
2Kestrel Analytics opens Austin officeaustinbusinessjournal.com/kestrel-officeAustin Business Journal2026-08-14
3Five churn tools comparedsaasreview.io/churn-tools-2026SaaS Review2026-07-30

Hiring is the other tell. A company posting three sales roles is building a team, and that is a better opening line than a job title.

Formula

=JOBSEARCH("Sales Development Representative", "US", "Austin, TX", , , 50)

Searches Indeed, LinkedIn, Glassdoor, and ZipRecruiter in one call. Background function, one spilled table on its own tab.

What comes back

TitleCompanyLocationRemotePostedPlatformCompany Size
Sales Development RepresentativeKestrel AnalyticsAustin, TXFALSE2026-09-02LinkedIn11-50
SDR, Mid-MarketNorthwind LogisticsColumbus, OHTRUE2026-08-29Indeed201-500
Enterprise SDRBrightline Dental GroupCincinnati, OHFALSE2026-08-21Glassdoor501-1000

Back on the main sheet, =COUNTIF(Jobs!$B:$B, B2) turns that tab into a single hiring-signal number per row.

Check the emails before anyone sends

Bad addresses cost you domain reputation, which is more expensive than the research.

Formula

=VALIDATEEMAIL(M2:M300)

One call for the whole email column. Background function, spills a table with a verdict per address.

What comes back

EmailResultQualityDetailFree Provider
priya@kestrelanalytics.iodeliverable0.95accepted_emailFALSE
info@northwindlogistics.comrisky0.42role_basedFALSE
tom.alvarez@gmail.comdeliverable0.88accepted_emailTRUE
d.blake@harborpointroofing.comundeliverable0.02mailbox_not_foundFALSE

Drop the undeliverable rows, route the role-based ones to a different sequence, and send to the rest.

Score the row before you trust it

Enrichment is only useful if you know which rows are thin. Native Sheets handles this.

Formula

=COUNTA(E2:M2) & " of 9"

Counts how many enrichment cells actually filled in for that row. No AI, no credits, and it tells you which rows to send and which to skip.

What comes back

A (Name)B (Company)N (=COUNTA score)
Priya RamanKestrel Analytics9 of 9
Dana WhitfieldNorthwind Logistics7 of 9
Tom AlvarezHarbor Point Roofing3 of 9

Sort by that column and your best 80 rows are at the top. Those get a hand-checked first line. The 3-of-9 rows go back in the pile.

Note

Every AI formula here runs on every plan, Free included. Free comes with 20,000 AI tokens and 100 integration credits, one time, which is enough to run all of this on a few dozen rows. A 300-row week leans on the credit pool more than the token pool, and Solo's 10,000 credits a month covers it with room to spare. See pricing for the full picture.

Side by side on one real workflow

The task: 300 event leads, each with a name, a company, and a website. You want title, what they sell, employee count, a news hook, and a validated email.

By hand. Search the person. Open LinkedIn. Open the website. Skim it. Search the company name plus "funding". Guess the email pattern. Type six cells. Repeat 299 times. Call it 70 seconds a row on a good day, which is about 6 hours.

With a paid database. Upload the list. Match records. Choose fields. Spend export credits. Download. Paste into the sheet. Fast, and limited to fields the vendor stores. Any question outside those fields still gets researched by hand.

With formulas. Paste seven formulas into row 2. Drag down. Run three background scrapers on their own tabs. Wait. That is about 20 minutes of setup and a wait you can spend on calls. The 8th question you think of on Thursday is a new prompt, not a new tool.

When to still use a paid enrichment tool

Buy the database when the list does not exist yet. If your job starts with "find me 5,000 heads of ops at logistics companies with over 200 staff", that is a database query. Apollo's filters by title, seniority, size, industry, and location exist for that, and a spreadsheet is the wrong shape for it.

Buy it when the CRM is the system of record and sales ops needs enrichment to happen without anyone opening a sheet. That is an integration job.

And buy it when you need one tool for research plus sequencing plus dialing. Apollo bundles sending. SheetMagic does not send email.

Formulas win when the list already exists, when the fields you need keep changing, and when you would rather pay for a month than for every record.

Copy this template

Fourteen columns. Four you paste in, nine that fill themselves, one that scores the row.

ColHeaderFormula in row 2
AName(paste)
BCompany(paste)
CWebsite(paste)
DLinkedIn URL(paste)
ETitle=AITEXT("What is the current job title of " & A2 & " at " & B2 & "? Title only.", , TRUE)
FSeniority=AITEXT("Classify this title as IC, Manager, Director, VP, or C-level. One word.", E2)
GPage text=VISIT(C2)
HWhat they sell=AITEXT("In 12 words or fewer, what does this company sell and who buys it?", G2)
ITools mentioned=AITEXT("List any software tools named on this page, comma separated. If none, reply None.", G2)
JEmployees=VLOOKUP(B2, LinkedIn!$A:$C, 3, FALSE)
KIndustry=VLOOKUP(B2, LinkedIn!$A:$B, 2, FALSE)
LOpen sales roles=COUNTIF(Jobs!$B:$B, B2)
MWork email=VLOOKUP(A2, FindLeads!$A:$D, 4, FALSE)
NCompleteness=COUNTA(E2:M2) & " of 9"

Three helper tabs carry the wide tables. LinkedIn!A1 holds =LINKEDINCOMPANY(Leads!D2:D301). Jobs!A1 holds your JOBSEARCH call. FindLeads!A1 holds your FINDLEADS call. All three spill, so leave those tabs empty.

Columns J through M read from those tabs, so they show "add LinkedIn tab" or "add Jobs tab" until the tabs exist. Columns E through I and N work the moment you import. Run VALIDATEEMAIL on column M once it fills.

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

Writing the actual email is the next column over, and prompt templates has patterns for it. If you want the persona-level view of this whole workflow, the lead generation page walks through it.

What to watch for

  • Background formulas look broken for about a minute. VISIT, LINKEDINCOMPANY, FINDLEADS, JOBSEARCH, and VALIDATEEMAIL all show a loading placeholder while a worker does the job. It is not frozen. Leave it alone.
  • Spilled tables need empty space. A scraper that returns 50 rows and 12 columns needs those cells free, or Sheets shows #REF!. That is why the wide scrapers go on their own tabs.
  • Web search only works on some models. The webSearch=TRUE argument in AITEXT needs an OpenAI GPT-4o or newer model, a current Claude model, or a Perplexity Sonar model. Gemini and Mistral will ignore it.
  • Everything scraped is public. These formulas read pages anyone can open. No logged-in data, no private profiles, and no guaranteed direct dials.
  • Keep Formula freezes results. Once a result lands it becomes static text with the formula kept in the cell, so a recalculation does not re-run and re-bill 300 rows. That is the setting you want on for work like this.

Try it on 20 rows first

Take the top 20 rows of last week's list and run columns E through I. That is four formulas and a few minutes, and it tells you whether your prompts are asking the right questions before you spend a credit on all 300.

Then add the three helper tabs and let the rest of the list fill in while you make calls.

Text and scraping formulas run on the free allowance. Install from the Google Workspace Marketplace, no card, no expiry.

Install free for Google Sheets

About the author

Phil NguyenPhil builds SheetMagic, the Google Sheets add-on that brings AI and web scraping into the spreadsheet, used by 6,300+ people. He writes these guides from the formulas he runs on his own sheets.