Skip to content

Sourav Ukil

All work
Acquired2026

unsent.dev

Transactional email infrastructure

Built in
14 months, solo
Runs on
Cloudflare Workers, Durable Objects
Ended
Acquired, February 2026

The problem

Transactional email is a solved problem that nobody had made small. The existing options were either a full marketing suite with a transactional endpoint bolted on, or an SMTP relay with no visibility into what happened after the handoff. Neither answered the only question a developer actually has at three in the morning: did this specific message reach this specific person, and if not, why not.

What I built

One endpoint to send, one stream to watch. The pitch was narrow on purpose: send the mail, tell me what happened to it, get out of the way. No templates, no campaigns, no audience management. Every feature request that would have widened it got turned down, which is most of why it stayed shippable by one person.

Send the mail, tell me what happened to it, get out of the way.

The interesting part

Delivery state is the hard part, not sending. A message can be accepted, deferred, bounced, complained about or silently dropped, and those events arrive out of order, sometimes days apart. Durable Objects gave each message its own consistent home to collect that history, which meant the status endpoint could stay a single read instead of a fan-out across a log.

What it does not do

Every request that would have widened the product got a polite no and a link to something that already did the job. Templates, scheduling, campaign views. Fourteen months of no. Each one lost me a specific person who had taken the trouble to write in, and I could read their email while I could not read the ten people who would have found the thing more confusing with the feature in it.

Outcome

Acquired in February 2026. The buyer wanted the delivery pipeline rather than the brand, so the narrowness turned out to be the asset rather than the marketing position. Every feature I had turned down was a piece of state I did not have to keep correct at three in the morning.

What I would do differently

I would build the status endpoint before the dashboard. I rebuilt the delivery timeline three times because it was the part I could see and therefore the part I could fiddle with, and nobody ever asked me for a nicer timeline. They asked for a straight answer about one message.