An AI outreach department that does the work of a research, audit and copy team
A trades-focused marketing agency had a scraped list of 4,058 local businesses with no emails, almost no websites and no review data. I built a 16-stage pipeline that turns that list into verified, audited, personally written outreach, with a second AI checking the first and a person approving every send.
The problem
The lead sheet had zero email addresses, 86% of leads had no domain, and 3,129 rows came from a directory scrape that captured almost no websites. The agency wanted outreach that a plumber or roofer would actually read: specific to their business, compliant with Canada's anti-spam law (CASL), and never claiming anything that can't be seen on their public website.
How it works
- Intake and cleaning. Fixes rows with two phone numbers in one field, bad city values and unmapped trades, then loads a Postgres state machine (new → enriched → scored → report_ready → approved → queued).
- Enrichment. Google Places finds the website, rating and reviews. The business's own site is scraped for a published email, then verified. Ranking the queue by measured yield per trade gave 29% more usable leads for the same spend.
- Website audit. A Playwright service loads each site in 5 viewports, runs accessibility scans, takes full-page screenshots and detects about 60 tools and vendors. No AI, no cost.
- Scoring and pitch. Claude Opus picks the strongest pitch (website, SEO, automation or social) from measured findings and bands leads A, B or C.
- Report and emails. A branded audit report per lead, then a 4-email sequence held to 7 hard checks: word counts, banned words, no links, one finding per email, no invented statistics.
- Chief Auditor. Claude Sonnet reviews every sequence. It is deliberately a different model from the writer and never sees the writer's brief.
- Human approval, then send. A daily digest and a dashboard for approve, edit or reject. Smartlead sends under a daily cap; a rules engine handles unsubscribes, bounces and replies.
Guardrails
Maker is never the checker
The auditor is a different model with a different brief. It reports findings; code turns them into approve, fix, reject or escalate. The model never states the verdict.
Compliance lives in the database
A trigger blocks any lead whose email was guessed from a pattern from entering a sending state. Suppressed contacts are blocked the same way.
Two deliberate acts to go live
Auto-approval needs a config change in the database and a live flag. Top-tier leads never auto-approve, and the daily send cap only changes on purpose.
No double spend
Every endpoint selects by status, so every run can resume. A second concurrent call gets a 409, so an n8n retry can never pay for the same batch twice.
What the AI auditor caught
A regex can check word counts. It cannot tell whether an email claims something the evidence doesn't support. In calibration, the auditor judged 81 hand-written sequences: 24 clean and 57 flagged for asserted outcomes. All 57 were fixed with exact edits before anything was sent. It also caught 4 unsupported claims about "visitor behaviour" in an email that had passed every mechanical check, which led to a prompt change that cut those to 1.
The test suite found real defects before prospects did: a false "no lead capture form" finding, font-foundry emails scraped out of CSS comments, a trailing backslash that would have hard-bounced, and a reply rule that would have unsubscribed someone who wrote "Yes please".
Results
- 3,657 leads imported; 1,348 archived as unworkable (reversibly) after enrichment.
- 640 audit reports generated, 640/640 passing layout checks; 106+ deployed live.
- 100% inbox placement in warm-up across two inboxes (391 sends, 0 in spam); 93 real sends with 0 bounces.
- About $26 in paid API and verification costs by mid-August; measured cost per lead of about $0.12 for writing and $0.09–0.20 for auditing.
- 1,191 plain-language checks, 40 auditor fixtures with negative controls, and browser tests on both dashboard themes.