// Overview
A platform for sending email to a lot of people at once, without the parts that usually go wrong. Contacts are imported and segmented, campaigns are built from reusable templates, sending is queued and rate-controlled, and what came back — opens, clicks, bounces, unsubscribes — lands against the contact it belongs to.
// The problem
Bulk email is easy to send badly. A naive implementation loops over a list in one request, times out halfway, and nobody knows which half was delivered — so it gets run again and part of the list is mailed twice. Meanwhile bounces and unsubscribes pile up unhandled, and every campaign to those dead addresses drags the sending domain further down until legitimate mail starts landing in spam.
// What I built
A full-stack SaaS platform. A Next.js dashboard handles contact lists, segment rules, the template editor and campaign reporting; a Node.js API owns campaign logic and talks to the email provider. PostgreSQL stores contacts, campaigns and one row per recipient per send, which is what makes the reporting exact rather than approximate.
Sending is the part worth describing. A campaign is never sent in a single request — it is expanded into per-recipient jobs on a Redis queue and drained by background workers at a controlled rate. That one decision buys three things at once: the send respects the provider’s throughput limits, it survives a process restart, and a failure retries one message instead of re-mailing the whole list. Each job is keyed by campaign and recipient, so a retry that runs twice still only sends once.
Deliverability gets the same treatment. Bounces and complaints come back over provider webhooks and are written to the contact; hard bounces and complaints suppress the address permanently, and the suppression list is checked at send time rather than at import time — so someone who unsubscribes after a campaign is queued still never receives it.




