← All case studies
Marketing agency · internal systemLive, human-gated

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.

Results, plainly: the engineering is the story here. Sending is capped at 20 a day and no positive replies are recorded yet, so this page shows how the system works, not a reply rate. To keep costs at zero before the agency had revenue, the paid AI writing steps have mostly run in manual mode since August; the validators and the AI auditor still check every email.
3,657
leads imported and cleaned
640
branded audit reports, all passing layout QA
391 / 0
warm-up sends / landed in spam
57 / 57
auditor-flagged emails fixed before sending

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

  1. 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).
  2. 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.
  3. 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.
  4. Scoring and pitch. Claude Opus picks the strongest pitch (website, SEO, automation or social) from measured findings and bands leads A, B or C.
  5. 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.
  6. Chief Auditor. Claude Sonnet reviews every sequence. It is deliberately a different model from the writer and never sees the writer's brief.
  7. 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.
CodeAIHumanData
Execution replay of the design, not live data

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.

Need an agent that can be trusted with real customers?

Message me on Upwork