SalesTutorial10 min

Automated lead enrichment in a spreadsheet CRM that drafts your outreach

Automated lead enrichment in a spreadsheet CRM: an automation researches each lead from public sources, then drafts personalized outreach into Gmail.

LeadDraft
J. Riveradrafted
A. Chenskipped
JK
Joanna Kurylo

Automated lead enrichment is an automation that reads the blank rows in a CRM you own, researches each lead from public sources, records where every fact came from, and drafts a personalized first email per lead into Gmail. Your CRM is one file: a spreadsheet or a SQLite table.

Zo can send email on your behalf once Gmail or Outlook is connected. That capability is real and you can turn it on. This guide deliberately stops at the draft, because the work being built here is the enrichment and the writing, and a draft you glance at is the right default for a job that runs while you are asleep.

Key takeaways

  • Your CRM is a file you own, a CSV or a SQLite table, with columns for the raw lead, the enriched facts, and the drafted email. No seat, no monthly database bill.
  • One automation reads only the un-enriched rows, so you enrich leads automatically for the price of the new ones, not the whole list every night.
  • Every enriched fact carries a source URL. A field stays blank rather than guessed, which keeps a fake "you just raised a Series B" line out of your cold email.
  • Public pages get a fast read. A login-gated page, like a signed-in LinkedIn view, needs the real browser, which is slower and can log out mid-run.
  • Zo is able to send email as you once Gmail or Outlook is connected. This build stops at the draft by choice, since enrichment accuracy is the thing being tested, and a scheduled job is the last place you hand over the send button.
  • The generic-template trap is the real failure. A draft that reads like AI wrote it converts worse than no email, so the prompt forces one specific detail from the research into every message.

What is automated lead enrichment?

Automated lead enrichment takes a bare lead, usually a name, a company, and an email, and fills in the context that makes outreach land: the person's role, what the company sells, its rough size, and a recent, real reason to reach out. By hand it is twenty minutes a lead of tab-switching. As lead research automation it is a scheduled job that reads public sources and writes the facts back into your CRM file while you do something else.

The version worth building has one rule most tools skip. Every fact comes from a page you can name, and a field the automation cannot confirm stays empty. A blank cell is fine. A confident wrong cell puts a hallucinated funding round into a first email to a VP who will notice.

Why build a CRM in a spreadsheet instead of buying one?

Because the CRM you rent gives you a worse memory than a sticky note and bills you monthly for it. When you build a CRM in a spreadsheet, it is a file in your workspace. You can open it, sort it, grep it, sync it to your laptop, and hand it to a future you without reconnecting anything. Zo reads that file directly during a run, whether it is a CSV, an exported sheet, or a SQLite data.db next to your other files, and answers questions about the data in plain English with no setup.

Start with a spreadsheet. If the list grows past a few hundred rows, ask Zo to move it into SQLite, which runs on a Zo Site through Bun with nothing to install. The contact-form-to-SQLite guide covers that upgrade, though most people never need it.

What columns does the CRM need?

Group the columns into three blocks so the automation knows what to write and what to leave alone. The raw block is yours. Zo fills the enriched block from sources. Draft and status live in the outreach block.

ColumnBlockWhere the value comes fromThe gotcha
NameRaw leadYou, from your listMisspellings break the research. Clean these first.
CompanyRaw leadYouA common company name pulls the wrong firm. Add the domain.
EmailRaw leadYouIf it is blank, that is a different job. See the sibling guide below.
DomainRaw leadYouThe single best disambiguator for the research step.
RoleEnrichedCompany site, public profileTitles go stale. Record the date pulled.
Company summaryEnrichedCompany homepage or about pageMarketing copy inflates. Keep it to what they sell.
Company sizeEnrichedPublic sourcesOften a guess. Leave blank rather than approximate.
Recent hookEnrichedA news page, a blog post, a launchThe one that hallucinates. Must carry a source URL.
Source URLsEnrichedZo records the page per factNo URL, no fact. This column is the audit trail.
Draft bodyOutreachZo writes itReads generic unless the hook is forced in.
Draft statusOutreachZo sets it to drafted or skipped"Skipped" means enrichment came up empty.
SentOutreachYou, by handYours in this build. Hand the send to Zo later, once the drafts are consistently good.

The Source URLs and Sent columns matter most. One makes every claim checkable. The other is where you decide how much of the send you want to keep.

How does the enrichment automation work?

The job runs as a batch over blank rows, not a model looping over your whole list one row at a time. That is a cost decision. Reading only the un-enriched rows means a 400-row CRM with 6 new leads researches 6 leads, not 400. Connect Gmail or Outlook, which is the same connection that lets Zo send as you, sign into any login-gated source once in Zo's browser, then hand Zo this prompt verbatim. Change the path and the schedule.

text
Every weekday at 7:00am Mountain, open my CRM at /home/workspace/crm/leads.csv. Select only rows where the Role, Company summary, and Recent hook columns are
all blank. For each of those rows, and only those:

1. Research from public web pages only: the company's own site, a public
profile, a recent news or blog page. Fill Role, Company summary, Company
size, and one Recent hook (a specific, real, recent reason to reach out).
Write the exact source URL for each fact into Source URLs.
2. If you cannot confirm a fact on a page, leave that cell blank. Do not guess
or fill a cell from general knowledge.
3. If a page needs a login, open it in the browser using my signed-in session.
If the session has expired, skip that source and note it, do not stall.
4. Draft a short, personalized first-touch email and save it as a Gmail draft.
Two or three sentences. Work the Recent hook in so it reads like I did the
research. No "I hope this finds you well." Set Draft status to "drafted".
5. If enrichment turned up nothing usable, set Draft status to "skipped" and
write no draft.

Save these as drafts and do not send them yet. I want to read them first. When done, email me one line per lead: name, drafted or skipped, and any source you couldn't reach. If a lookup failed outright, say so instead of treating it as zero results.

That prompt carries every guardrail at once: blank-rows-only for cost, a source URL per fact, blank-over-guess, the browser fallback for gated pages, the forced hook against generic drafts, and a failure flag instead of a silent zero. The last line is the one you will change first if you later want the sending handled too. The plugin-inside-an-automation guide covers why scheduled Zo has the same Gmail access your chat does, including the ability to send.

When does Zo read a page versus drive the browser?

Ask one question: could a logged-out stranger open that exact URL and see the fact? If yes, Zo does a fast text read. If it needs your session, Zo drives its real browser as you, which is slower and depends on a session you signed into once. The read versus browse guide has the full rule. Most of what enrichment wants, a homepage, an about page, a news article, is a public read. Reach for the browser only when a fact lives behind a login.

Can Zo send the outreach, or does it only draft?

It can send. Connect Gmail or Outlook and sending mail as you is one of the things Zo does, in a chat or on a schedule. Ask it to send and it sends.

This tutorial is not about that. It is about getting the enrichment right and the writing specific, and for that the draft is the useful stopping point. You cannot judge whether the research is any good until you have read a few of the emails it produced. So the first version of this automation writes into Gmail drafts and stops, and you spend a week reading them.

That week tells you what to do next. If the hooks are accurate and the drafts read like you, hand over more of the send: let it send to a warm segment, or send anything you have pre-approved, and keep the cold first touches for yourself. If you would rather it stay at drafts permanently, that is a fine place to land too, and you can enforce it rather than just intend it. Run the automation under a persona whose scopes cover reading files, browsing, and writing a draft, and leave the send scope off. The persona scopes guide walks through the toggles. A tool a persona does not have is a tool that cannot fire at 5:01am with a typo in someone's name.

What goes wrong, and how do you catch it?

Every part of this has a failure mode. Naming them keeps the automation trustworthy instead of quietly wrong.

Hallucinated company facts. A model with no source invents a plausible funding round or title. The fix is structural: require a source URL for every fact and leave the cell blank without one. Read the Source URLs column when a hook looks too good.

Stale enrichment. A title from eighteen months ago reads as current after the person changed jobs. Record the date each fact was pulled, and re-enrich a lead that has sat cold before you reach out.

Token cost on a big list. Enriching 400 rows nightly when a few leads are new burns credits for nothing. The blank-rows-only filter is the fix: you research new leads, not the archive.

Browser session expiry. A login-gated source lapses eventually, and the run keeps firing while that page returns a sign-in wall. Tell the automation to note a skipped source instead of treating it as zero, then re-sign-in.

The generic-draft trap. Personalized cold email drafts are the point; a template that could go to anyone reads like AI wrote it and converts worse than nothing. The prompt forces the specific Recent hook into every draft. If a draft could be pasted to another prospect unchanged, it goes in the bin.

Assuming it sent. In this build it did not. The prompt asks for drafts, so the Sent column stays empty until you fill it or until you change that line. Check the drafts folder the first few runs so you know which mode you are actually in.

Frequently asked questions

What is automated lead enrichment?

Automated lead enrichment is a scheduled job that takes a bare lead, a name and a company, and fills in the context around it: the role, what the company does, its size, and a recent real reason to reach out. It reads public sources, records where each fact came from, and writes the results back into your CRM file.

Can I build a CRM in a spreadsheet instead of buying one?

Yes. A spreadsheet or CSV in your workspace is a working CRM that Zo reads directly during a run. Add columns for the enriched facts and the draft, and the automation fills them. If the list outgrows a spreadsheet, move it into a SQLite table, which needs nothing installed.

Can Zo send the cold emails for me?

Yes. With Gmail or Outlook connected, Zo can send email on your behalf. This tutorial has it stop at the draft on purpose, because the thing being built is the enrichment and the writing, and you want to read a batch before any of it goes to a stranger. Once the drafts are consistently good, change the last line of the prompt and hand over as much of the sending as you want. If you prefer it never sends, run the automation under a persona without the send scope so it is enforced rather than remembered.

How does AI lead enrichment avoid making up facts?

By requiring a source. The prompt tells Zo to record the exact URL for every enriched fact and to leave a field blank rather than guess. A blank cell is acceptable. A confident wrong cell, like an invented funding round in a first email, is what you are preventing.

How much does it cost to enrich leads automatically over a large list?

Every scheduled run spends AI credits whether or not it notifies you, and browsing a login-gated page costs more than a fast public read. Keep it cheap by enriching only the un-enriched rows each run and matching the schedule to how fast new leads arrive. Pricing is at zo.computer/pricing.

What if a lead has no email yet?

Enrichment fills context; it does not find a missing address. That is a separate job, covered by the next article on finding a prospect's email from just a name and company, which you run before this pass.

Put it to work

Open Zo, connect the tools this guide uses, and ask it to build the workflow with you.

Try Zo