Mailroom
Product Design + Automation
Description
Mailroom is the outreach system we run PAAK on. Overnight it finds companies, finds the person worth writing to, checks they are real, drafts each email against our own writing doctrine, and has a board waiting by the time the laptop opens. Nothing sends until a human taps approve.
Client
PAAK — internal
Year
2026
Services
Product Design + Automation



Numbers
In the pipeline after one bug fix re-read every stuck company's live site — up from 133, without sourcing a single new lead.
First email, then day four and day ten. A reply kills the rest of the sequence automatically — nobody gets chased after they answer.
Including regression tests written the day a classification bug was found, so the same failure cannot come back quietly.
Every email waits on the board for a human tap. The automation writes and queues; it never decides to send.
The problem
The tools that do this cost real money every month, and they all want you to write one template and blast it. That is the opposite of what actually works — and it is the one part of outreach that should never be automated, because a stranger can tell instantly when a message was not written to them.
So the question was not "how do we send more", it was "how do we remove every job around the writing". Finding companies, finding the buyer, checking the address is real, tracking who replied, knowing whose follow-up is due today — all of it is mechanical, all of it is boring, and all of it is what actually stops the sending from happening.
What we did
IT RUNS WHILE THE LAPTOP IS SHUT
A chain wakes at 5:15am, sources, enriches, verifies and drafts, and the approval board is open on screen by 6:20. The schedule runs on launchd, not cron — cron silently drops any job it missed while a Mac was asleep, which is exactly how this ran for weeks doing nothing at all.
THE DRAFTING READS THE REAL SITE
Each email is written against the company's own live site, not the row in the database — because the row is often wrong. The drafter refuses to write at all when it finds a genuine mismatch, and writes the reason down instead: in-house team, prices below our floor, a competitor rather than a buyer.
A BOARD THAT CANNOT SEND AN EMPTY EMAIL
The board groups rows by what you have to DO — review, approved, skipped — rather than by internal status. A skipped row shows the refusal reason in place of the email and has no approve button at all. Before that fix you could approve a blank email into a stranger's inbox.
IT FAILS LOUDLY, NOT QUIETLY
The bugs that hurt here were all the same shape: a question that failed getting recorded as a factual no. A DNS lookup that timed out read as "no mail server" and killed 53 good leads. An empty crawl read as "doesn't sell websites" and stranded 123 more. Both now record "unknown" and say so.
Figures from the live pipeline as at 13 August 2026. Built in Python with a local approval board; scheduled through launchd. Sending is capped, paced, gated on the recipient's own working hours, and paused automatically on bounces.


