Cold email outreach agent

One true fact about a founder’s site becomes one short email, sent from its own outreach address.

Cold email to founders fails in two places before anyone reads it: the address (most founders publish none, and guessed ones bounce or land in spam) and the first line (a template opener is deleted on sight). Doing it by hand means hunting through company sites for an address, then staring at a blank email with nothing specific to say.

Running on our own company since Oct 17, 2026 · Email · Risk: Medium. Everything on this page is public; there is nothing to sign in for.

Goes inThe addresses the founder email finder recorded, the tracked YC leads file, and our free audit of their domain
Comes outUp to three emails a day, one per company, each with the audit card attached and one ledger row; one follow-up two weeks later
Human stepSomeone reads the replies that land in the agent’s inbox and answers them. While the channel is validated, that person reads the test copies instead
Runs onA machine with Node.js, a local Chrome for the card, an agent runner for the writing step, and the API key of the agent’s own mailbox (an AgentMail inbox)

Tasks and outputs

What it takes on

Pick who to write to, find the fact

Takes the addresses the email finder recorded, drops companies already in the ledger, on the do-not-contact list, or in a conversation elsewhere, and runs the free audit on each domain for its most concrete finding.

Up to 3 candidates, one audit finding each

Write and record

One email to the voice guide: the fact first, what it means, the free report as the only ask, an opt-out line, the sender’s signature. One ledger row each.

Draft + ledger row

Send, or test

Sends each draft from the agent’s inbox with the audit card attached (send: auto), or every draft to the team’s own test address only (send: test). Nothing reaches a founder in test.

Sent, or a test copy

Who it is for: Teams doing outbound into a list of startups who want every email to open with one true, checkable fact about the recipient’s own site, and who want the sending, the one follow-up and the bookkeeping done by the same run.

How we use it: Built October 2026 and running in its validation setting: every draft goes to the team’s own test mailbox, signed by the founder, and nobody outside the team has received one yet. The run log below shows every draft. Sending to founders starts once the sending address is settled.

This is the same build-it-or-we-run-it model behind our AEO work. See your own AI visibility baseline

Workflows/cold-email/voice.mdWriting rules of the voice guide

What an email is written to

01Body of 80 words or fewer; four paragraphs at most.

02A greeting and one sentence saying who is writing and why; then the audit finding, about their site, with the specific thing the check saw.

03One sentence on what it means, using only the measured mechanisms the guide lists; no numbers the agent did not measure.

04Who is writing and why, in one clause; no client results, no rankings, nothing guaranteed.

05The last line asks whether they want the free report. The opt-out line is in every email, verbatim.

06No link in the body; the sender’s site once, in the signature. Engines are named by name, never as “AEO” or “GEO”.

Read from the voice guideChecklist before every ledger row

The rules the agent’s output is written to, from the file named above. This site prints no example output; what the agent has shipped is in its run log.

Workflow

How a run goes, step by step

Pick a step to see what goes in, what comes out, and where a person is involved.

Step 1 of 4

Pick today’s candidates

Joins the email finder agent’s ledger (the latest found address per company) with the leads file, applies the filters, runs the free audit on each remaining domain and writes the candidates file.

Goes in

The finder’s ledger, the leads file, the ledger, the do-not-contact list

Comes out

A candidates file: founder, email, website, one-liner, audit finding

Where a person steps in

Nobody. If nobody can be written to today, the run stops and says why (no public email, every lead already contacted, or the daily audit limit).

Step 2 of 4

Write one email per candidate

The session reads the candidate and the voice guide, writes the email, runs the checklist, and records a ledger row. A candidate that is not a fit, or whose audit returned nothing usable, is skipped with a reason rather than written to.

Goes in

One candidate, the voice guide, the sender’s signature from the configuration

Comes out

One drafted email and its ledger row

Where a person steps in

Nobody during the write. The session cannot send, cannot run git, and cannot look anything up.

Step 3 of 4

Send, or send the test copies

With send set to auto, sends every drafted row inside the send window, up to the day’s cap and a minute or more apart, from the agent’s inbox with the audit card attached, and stamps the row with the message id. With send set to test, every draft goes to the team’s own test address with the founder’s address in the subject, and the rows stay drafted.

Goes in

Today’s drafted ledger rows, the do-not-contact list

Comes out

Sent rows with their message ids, or test copies in the team’s mailbox

Where a person steps in

Nobody during the send. A person sets the mode and reads the test copies.

Step 4 of 4

Settle, and follow up once

Each morning a script reads every sent row’s thread in the inbox: a reply marks it replied, an unsubscribe reply marks it opted-out and puts the address on the do-not-contact list, a delivery failure marks it bounced. Rows sent two weeks ago with no reply get one two-sentence follow-up in the same thread; there is never a third email.

Goes in

The threads in the agent’s inbox

Comes out

A ledger that matches the inbox, and the follow-ups sent

Where a person steps in

Whoever answers the replies that came in; the agent writes no reply beyond the one follow-up.

Before you start

What you’ll need to bring

Company material

A leads file with company, founder and YC slug, the kind the YC scraping agent writes, and the email finder agent’s ledger of addresses it found on public pages. This agent looks for no address itself.

Source material

Our free audit, reachable as an API, for the opening fact. Any set of checks that returns something true and specific about a site would do the same job.

Platform account

A mailbox of the agent’s own, reachable over an API for sending and for reading the threads (ours is an AgentMail inbox); its key lives on the sending machine, outside the repository.

Run environment

Node.js for the scripts, a local Chrome for the audit card, and an agent runner that follows a written workflow for the writing step. For the scheduled run, a scheduler.

Guides and files

Set it up yourself

The setup guide, and the files the agent is built from. You run it in your own environment, with your own accounts.

Open · no account neededEight Node scripts (pick, audit, card, ledger, send, reconcile, notify, and the mailbox layer) and a scheduled wrapper, plus the workflow and voice guide the writing session follows. The writing session never sends; the send script does, and only in the mode the configuration allows. Not packaged for public download yet — the setup guide below describes what they do; the managed tier runs it for you today.
Setup guide
  1. 01

    Runtime

    • Node.js for the scripts; an agent runner that follows a written workflow for the writing step (ours is Claude Code); a scheduler for the daily run, or a person running it by hand during validation.
    • A mailbox of the agent’s own to send from and read replies in (ours is an AgentMail inbox, driven over its API), signed in the founder’s name. A test address the drafts go to during validation.
  2. 02

    Browser setup

    • A local Chrome, headless, only to draw the audit card (the five checks as one picture). The audit itself is an API call.
  3. 03

    Account setup

    • The mailbox’s API key, kept outside the repository on the machine that sends. Nothing else: no SES, no Gmail sign-in.
  4. 04

    Configuration

    • The daily cap (at most 5: the free audit allows five runs per IP per day), the follow-up delay, where the drafts are handed over, and the signature: name, title, site, and the postal address a commercial email carries.
    • A do-not-contact list of addresses and domains, appended to by itself when a recipient opts out.
  5. 05

    First run

    • Run the pick step alone and read the candidates file: confirm each address came from the email finder’s ledger with a public source and each audit finding is one you could verify on their site in ten seconds.
    • Run the writing session once and read every draft as the founder would; anything that reads as a template is a voice-guide problem, not a sending problem.
    • With send set to test, send once and read the copy in the test mailbox as the founder would: the text, the attached card, the signature. Only then set send to auto.
Files · 14

cold-email.md

Workflow · Markdown. The steps: prerequisites, reconcile, pick, one pass per candidate (read, write, checklist, record), report, send or test, follow up, commit; the hard rules.

Workflow

voice.md

Voice guide · Markdown. The greeting and one-line introduction, the 80-word rule, the fact second, the mechanisms a sentence may rest on, the opt-out line, the banned words, the checklist.

Voice guide

config.md

Configuration · Markdown. The daily cap and warm-up, the send window, the mode (off, test, auto), the mailbox, the test address, the founder’s signature, the audit endpoint, the slugs never to write to.

Configuration

do-not-contact.md

List · Markdown. Addresses and domains never to write to; appended to by every opt-out and complaint.

List

pick.mjs

Script · Node. Today’s candidates: the finder’s addresses joined with the leads file, the filters, the audit per domain, the candidates file.

Script

audit.mjs

Script · Node. The free audit on a domain and the choice of the opening fact: fails before warns, the most concrete check first.

Script

card.mjs

Script · Node. The audit card: the five checks and the score as one picture, drawn by a local Chrome.

Script

ledger.mjs

Script · Node. Appends a row per draft and takes marks, with the format module it shares with the website, which builds this log from the file.

Script

send.mjs

Script · Node. Sends the drafted rows in the allowed mode and the one follow-up; the window, the cap, the spacing, the do-not-contact check.

Script

agentmail.mjs

Script · Node. The mailbox over its API: send, reply in a thread, read a thread.

Script

reconcile.mjs

Script · Node. Reads each sent row’s thread and marks replied, opted-out or bounced.

Script

notify.mjs

Script · Node. The hand-off page with a compose link per draft, for the mode where a person sends.

Script

run-cold-email.ps1

Scheduler · PowerShell. The daily run: the checkout, reconcile, the pick, the writing session, the send, one commit of the ledger and the do-not-contact list.

Scheduler

email-log.md

Ledger · Markdown. One row per drafted email: date, company, founder, address, finding, subject, body, status, sent, replied and followed dates, message id. The file this log is built from.

Ledger

Not packaged for public download yet. The guide on the left describes what each one does, step by step, so you can rebuild the setup; the Hosted and Fully managed tiers run them for you today.

Rather have us run it?

Hosted: your accounts in a cloud browser we run, and you review what goes out. Fully managed: we set the strategy and run the agents.

Good to know

Where it stops and asks for you

  • The sender’s name is not configured. The run stops before the pick: the email is signed by the founder, and the name, title and mailbox are configuration values.
  • Nobody can be written to today. Every address the finder found is already in the ledger or on the do-not-contact list, or the finder has found none yet. The run says so and writes nothing.
  • The free audit’s daily limit is reached. The pick stops at the limit; candidates after it wait for tomorrow. No email is written without a finding.
  • The session skipped every candidate. A note goes to the person with the reasons. A run that finds nothing worth writing is a run, not an error.
  • A send fails. The row stays drafted and the run stops and says so; nothing is marked sent that did not go out, and nothing is retried on its own.
  • A recipient opts out, or marks the email as spam. The row is marked opted-out and the address goes on the do-not-contact list, never to be written to again; a spam complaint also pauses sending for the day until a person has read the ledger.

Risk notice

What to watch for

  • The sending domain’s reputation is the whole risk of cold email: spam reports hurt every message from that domain. The agent sends from its own mailbox, a few a day with a warm-up ramp, and during validation only to the team’s own test address; a complaint pauses sending for the day.
  • Email addresses are only what the email finder agent found on public pages. Coverage is uneven by design, and neither agent guesses or buys an address.
  • Commercial email law (CAN-SPAM, and GDPR for European recipients) asks for an opt-out and a postal address. The opt-out line is in every email and an opt-out goes on the do-not-contact list by itself; the postal address is a configuration value the team fills before the scheduled run starts.
  • Replies land in the agent’s inbox and are settled into the ledger by a script that reads the thread; a reply it misreads (a thank-you taken for an opt-out, or the reverse) is corrected by hand, so the log is as true as that reading.

FAQ

Questions about this agent

Most companies show no email at all.

Expected. Only an address the email finder agent found on a public page counts; many founders publish none, and this agent skips them rather than guess. It never looks for an address itself.

The audit says everything passes.

A clean audit is still a fact, and the email says so. The agent does not invent a problem to have something to write about.

The daily audit limit was reached.

Five audits per IP per day; results for a domain are reused for seven days. The run stops at the limit and says so; it does not write an email without a finding.