- Context
- Outbound for local B2B IT services needed structure without becoming a blast campaign. Research, contacts, drafts, and follow-ups had to stay auditable on a machine the operator controls. Scale is deliberate: enough daily sends to compound, not enough to look like spam. Constraint: secrets (SMTP, API keys) never leave the local environment; the agent must not own the send button.
- Intervention
-
Designed a human-in-the-loop outbound system with a single CSV as the source of truth and separate research vs draft agent roles.
Phase 1 — Data model & Today view
Defined CSV columns for status, contacts, drafts, and follow-ups. Wrote Python scripts that rebuild a local Today dashboard from the CSV (follow-ups due → today’s sends → top calls → waiting) so the queue is always file-backed, not trapped in a SaaS CRM.
Phase 2 — Research & draft agents
Separated research-agent and draft-agent specs. Research pulls Google Maps and public B2B data only; waves are logged as run logs. Draft agent writes personalized outreach into the CSV. Status snapshot scripts capture pipeline state for debugging.
Phase 3 — SMTP packs & pace
Built SMTP mail packs with deliverability rules (no blasting). Hard rule: human approves every send. Deliberate pace of 5–10 sends per working day. Secrets stay local—never shipped in a client surface.
- Risks & how they were handled
-
- Accidental mass send → agent never sends; human owns SMTP pack execution.
- Stale or wrong research → public-data-only scope + human review before send.
- Secret leakage → local-only credentials; no cloud CRM dependency for the pipeline.
- What I'd do differently
-
- Add a stronger “draft quality” eval set earlier (tone, localization, CTA clarity).
- Version the CSV schema more formally once the Today view stabilized.
- Outcome
- Before: ad-hoc research and drafting—roughly ~20–35 min per lead to skim Maps/public B2B data and write a first outreach draft by hand. After: one CSV is the single source of truth; separate research and draft agents fill it; a local Today view is rebuilt from that CSV; the human approves every send (the agent never sends), typically ~5–10 min of review/edit per send (est.); pace is deliberately capped at 5–10 sends per working day (~1–2 h of human review vs. ~2–6 h of manual research+drafting at that same pace, est.); secrets stay on the local machine.
System map
Public local business data
Maps / B2B
Research agent
public data only
Draft agent
separate role
CSV source of truth
statuses + drafts
Human send
SMTP pack
Fills a CSV tracker with drafts
Never sends without a person
Packages SMTP-ready mail packs
What shipped
- CSV lead tracker Statuses, contacts, drafts, and follow-ups as the source of truth.
- Split agent roles Separate research and draft specs — public-data-only research.
- Human-in-the-loop send SMTP packs with deliverability rules; the agent never sends alone.
Stack Python CSV Maps / B2B SMTP HITL