Michael Tromba
Michael Tromba

I spent a year building an email marketing platform

Full email marketing SaaS with a block-based editor, custom rendering engine, and distributed batch delivery system. 38K lines of TypeScript, pre-AI.

I spent a year building an email marketing platform

My mom is a career executive recruiter. The number one challenge in executive search is business development — landing a single new client can mean a $100K+ contract, and most of that business comes from relationships built over years. Even past candidates can become future clients, since they're all executives. The idea behind 52x Grow was simple: what if a recruiter could send something valuable to their entire network 52 times a year? Stay top-of-mind, nurture relationships, turn cold contacts into warm ones. The pitch was simple. The product was not.

I was building a full email marketing platform — essentially a purpose-built MailChimp for professional services consultants. Block-based email editor, subscriber management, analytics, custom domain support, billing, the works. Around 38,000 lines of TypeScript across 310 source files and 194 Vue components, all built solo over the course of about a year. This was 2022 — pre-ChatGPT, pre-Copilot, pre-everything. Every architectural decision, every migration, every bug was me, a whiteboard, and the docs.

The email editor was a WYSIWYG block system built on TipTap, supporting article, text, image, button, quote, divider, and footer blocks — each with its own typed schema, its own renderer, and its own set of trackable links. But the interesting engineering wasn't the editor. It was everything that happened after you hit send.

I built a custom HTML email rendering engine from scratch, replacing MJML entirely. Email rendering is a brutal problem — every client (Gmail, Outlook, Apple Mail, Yahoo) has different rendering quirks, and the only reliable approach is table-based layouts with fully inlined CSS and desktop media queries. I tested against dozens of client configurations through Litmus until everything rendered correctly everywhere.

Then there was the delivery system. You can't just blast 50,000 emails at once — you'll destroy your sender reputation and half of them will land in spam. I built a distributed batch delivery system that calculated optimal batch sizes based on subscriber count, capped sends at 5,000 per minute, and distributed batches across timed intervals through a message queue. The queue system itself went through three architectural iterations — I started with BullMQ and Redis, moved to Cloudflare Queues when that proved too heavy, hit their message rate limits, and eventually landed on QStash, which gave me serverless managed queuing with timed delays. Each iteration taught me something real about the tradeoffs between control, complexity, and reliability at scale.

On top of that, I built homebrew email analytics — custom open tracking via tracking pixels, click tracking via link transformation and redirect — because I wanted full ownership of the data instead of depending on Mailgun's. The whole backend ran on a custom worker system with idempotency keys, configurable retries, job tracking, and dead letter handling to make sure nothing got processed twice or dropped silently.

The content side had its own pipeline. An automated RSS system imported and enriched industry articles every five minutes using metascraper, with domain-based rate limiting and deduplication, so users always had a fresh library of curated content to pull into their newsletters.

About halfway through the build, the JavaScript codebase started breaking. Too many type errors in production, too hard to reason about at scale. I converted the entire project to TypeScript by hand in about a week — no AI assistance. That migration is what forced me to actually learn TypeScript deeply, and it's the reason I write everything in it now.

I launched publicly, ran LinkedIn outreach to thousands of recruiters and firms, and had real sales calls. What I found was that recruiters didn't actually see enough value in sending a weekly newsletter. It didn't matter how I framed it — the core behavior change was too large. I'd spent a year building a polished solution to a problem my target market didn't have.

I think about that year every time I start something new. But the engineering depth I built — every system designed by hand, every architectural tradeoff weighed without an AI to shortcut the thinking — made me the engineer I am. That kind of learning is nearly impossible to replicate in today's AI-assisted world. I'm genuinely glad I went through it when I did.