A B2B prospecting agent
Targeting, enrichment, signal and message, with a human on the send button.

A prospecting agent is worth building when it does the research a good SDR would do on every lead and nobody has time for: find the accounts, find the right person, find one real reason to write today, and draft a message that sounds like you. It should stop there. A person reads the drafts, builds the sequence and presses send. That split is what lets you scale the research without scaling the risk.
Outbound is old ground for me: LaGrowthMachine, a multichannel prospecting tool, came out of Deux.io, the agency I co-founded, in 2018. The agent version I use today is a published Claude Code plugin built for Derrick, which I also co-founded. It runs as six stages, and I describe them below because each one has a different rule for what the agent may decide.
Six stages, each with its own owner
| Stage | What the agent does | What a person decides |
|---|---|---|
| Import | Sources accounts and decision makers from a written ICP | The ICP, and whether the first 20 rows are right |
| Enrichment | Looks for one usable signal per lead, stops when it finds one | Which signal types count |
| Message | Drafts a short first message in your voice, plus follow-ups | Reads every draft before it goes anywhere |
| Sequence | Recommends channel, number of steps and spacing | Builds the sequence in the sending tool |
| Push | Sends leads and their fields to the sending tool, after a collision check | Launches the campaign |
| Weekly review | Classifies replies and links them to what was tested | What changes next week |
Building the account list itself is covered in the TAM chapter on agents; here I start from a qualified list and focus on what happens per lead.
Write the ICP as a spec the agent can check
“Heads of sales at SaaS companies” produces a list of everyone. The agent needs criteria it can check, exclusions, and a rule for picking one person per account. Say you sell payroll software to French SMEs:
icp: payroll_smb_france
accounts:
country: FR
headcount: 20-250
exclude: [payroll_providers, accounting_firms, public_sector]
persona:
priority: [DAF, CFO, "Responsable administratif et financier", "Head of People"]
exclude_titles: [intern, assistant, freelance, consultant]
one_per_account: true
sample_first: 20
stop_if:
no_decision_maker_rate_above: 0.4
The sample_first line makes the agent stop after 20 leads so you read them before it spends credits on the rest. If the sample is wrong, the fix almost always belongs in the spec.
Enrich until you find one signal, then stop
Enrichment is where agents waste money. The temptation is to fill every column for every lead. What the message needs is one fact that makes today a reasonable day to write: a job change, a hiring wave in the team you sell to, a funding round, a new tool in their stack, a post they wrote. So the agent works through sources in order of cost and stops at the first usable signal. If two signals point the same way, even better: a hire in finance plus a funding round tells a clearer story than either alone.
The output per lead is a short dossier, with the source of every claim:
{
"lead": "Head of finance, 120-person logistics company",
"signal": {
"type": "hiring",
"fact": "Two open payroll administrator roles posted this month",
"source_url": "https://example.com/careers",
"checked_at": "2026-11-10"
},
"second_signal": null,
"confidence": "high",
"usable_for_message": true
}
A lead with no usable signal gets usable_for_message: false and goes into a generic sequence or nowhere. An invented signal is worse than none: the prospect knows their own company. The signal types and how to detect them at scale are covered in the intent signals chapter.
Draft in the sender’s voice, then gate every message
The message stage is where most AI outbound fails, and it fails by sounding like everyone else. In our plugin, the agent learns the sender’s voice from their past conversations before writing anything. Keep the first message short: the signal, why it matters to them, one question. The voice approach is the same one I use for LinkedIn, described in the LinkedIn agent chapter.
A skeleton of the drafting instruction:
You draft a first LinkedIn message for {{sender_name}}.
Voice: follow the calibration file. Banned phrases: see list.
Use only the signal in the dossier. Never add a fact that is not in it.
Two sentences. No greeting formula, no pitch, end with one question.
If usable_for_message is false, return SKIP.
Every draft then passes two gates before a person sees it. The first is mechanical: a lint that rejects em dashes, banned words, competitor names and wrong prices. The second is a judge run in a blank context, with only the dossier and the draft, that answers whether the message is specific, true to the dossier and plausible from this sender. The agent that wrote the message never grades it. The quality check chapter shows how to set up both gates.
Push without breaking what is already running
The push stage looks trivial and is where real damage happens. If a lead is already in an active campaign, pushing them again can overwrite the custom fields that campaign is using, and a prospect receives a message built for someone else. So the agent runs a check before it writes:
| Check before push | If it fails |
|---|---|
| Lead already in an active campaign | Skip the lead, list it in the report |
| Required fields empty (first name, signal, message) | Skip, never push a blank variable |
| A/B variant assigned | Assign before push, log it |
| Opt-out or do-not-contact list | Remove, no exception |
| URLs in custom fields | Open each one after the push and check it resolves |
The sequence itself stays with a person. The agent recommends the structure (channel, number of steps, spacing, what happens after a reply) and the human builds it in the sending tool. I keep it that way because launching a campaign is the step you cannot take back.
Two legal points I do not delegate to an agent: whether you may contact these people by this channel, and whether the platform you collect from allows it. The CNIL’s page on commercial prospecting by email is a starting point in France, and the platform’s terms are yours to read. Check your setup with counsel.
Review replies weekly and feed the lessons back
Once a week, the agent reads the replies per campaign and classifies each as positive, negative or neutral, keeping the reply’s own words as the evidence. Then it crosses that with what was tested on each lead.
| Variant | Signal type | Sent | Positive | Negative | Neutral | Example quote kept |
|---|---|---|---|---|---|---|
| A | hiring | |||||
| B | hiring | |||||
| A | job change | |||||
| B | funding |
The table stays empty here on purpose: fill it with your own numbers, and do not read anything into a cell with a handful of sends. What the agent does with it is concrete: it updates the lessons file the message stage reads, proposes copy changes for a person to accept, and runs a lookalike search on the companies that replied positively, which feeds the next import. For Derrick’s own sign-ups and paying users, the sequences are now fully written by agents, in three tiers.
Your next step: write the ICP spec for one segment, run the import and enrichment on 20 leads, and read the 20 dossiers before you let the agent draft a single message.