Separate the interface from the sending engine, so scheduled work keeps running whether or not a browser is open.
Emailify
Built & operated by meThe interface, the engine, and the follow-through.
A cold outreach platform I built and run: campaign management, a scheduled sending engine, threaded follow-ups and controlled reply handling.
- Project
- Emailify
- Context
- Personal platform, in use
- My role
- Platform development and operation
§ I The problem
Why this exists.
An outreach campaign has too many moving parts to run out of a spreadsheet: prospect data, sequences, mailbox connections, sending limits, follow-up timing, replies. I wanted the logic behind all of it to be mine.
§ II How it works
The workflow, step by step.
An unmatched reply has to pass a confidence and evidence check before a permitted template is even offered. Ambiguous ones come to me. Negative and unsubscribe replies get no automatic answer at all.
Import prospects, map campaign fields and write personalised multi-step sequences in the application.
Connect Gmail mailboxes through OAuth and tie sending accounts to campaigns.
A scheduled sender checks the campaign’s sending window, its limits and the queue priority before it processes anything.
Follow-ups keep the original mailbox and stay in the same Gmail conversation, so the thread reads as one conversation rather than four cold emails.
A reply stops the sequence. Deterministic rules run first, and approved templates can answer the requests they cover.
Campaigns, prospects, mailbox connections and activity all stay inspectable from the dashboard.
§ III Build decisions
What I chose, and why.
Put sending limits and queue priority in explicit per-campaign rules rather than in code, because the right answer changes per campaign.
Preserve sender and thread consistency across every follow-up step. A follow-up from a different address reads as a different sender.
Run deterministic reply rules before any model. AI classification of an unmatched reply has to pass a confidence and evidence check before a permitted template is even offered.
Route ambiguous and sensitive replies to me. Negative and unsubscribe replies get no automatic answer at all.
Keep auth and application data in Supabase, with the backend jobs running in Python on Modal.
§ IV What you can see
The evidence, and its limits.

§ V Built with
The stack underneath.
- React
- Vite
- Tailwind
- Python / FastAPI
- Modal
- Supabase
- Gmail API / OAuth
Bring the process.We’ll find the possibility.
Tell me what keeps landing on your team’s plate and we’ll talk through what could work better.