A Resend alternative that also runs your lifecycle email

People searching for a Resend alternative used to want one thing: a cheaper or better version of the same send endpoint. That search has changed. Resend shipped audiences, broadcasts and automations, so the question is now whether you want one vendor for the mail your code sends and the mail a person writes, and if so, which one.

4 min read

This is our page about our competitor, so read it with the appropriate suspicion. We have tried to make every claim on it checkable.

What Resend has

Resend's marketing side is real and it is not a token. Audiences hold contacts with segments and topics. Broadcasts send to those audiences. Automations are a step builder with delays, wait-for-event steps and conditions, which is genuinely the same category of feature as ours rather than a lesser version of it.

Their CLI can create an automation from a JSON file, which is the closest anybody else comes to the thing we care most about. Worth knowing before you read the next section and assume nobody else has thought about this.

What we do differently

The automation is the file, in both directions. Resend's documented CLI path creates an automation from a file. There is no documented pull, no export, and no idempotent re-apply, so it is a way to get a sequence into the system rather than a way to keep one under version control. Here GET /v1/automations/<id>.yaml returns the document, PUT on the same path replaces it, and a document you push back is stored as the exact bytes you sent rather than re-serialised. That last detail is what makes the loop work: if a push came back reformatted, the next pull would produce a diff nobody made, and after two weeks of that nobody would trust the file.

The canvas in the dashboard and the YAML are two views of one stored document. Every write is a version you can read and restore, and a run already in flight stays pinned to the version it started on, so merging a change does not move six thousand people into a different sequence halfway through.

Inbound mail. A reply to a message you sent is parsed, threaded against the message it answers, and posted to your webhook. Resend is built around the send path. If your product wants a conversation rather than a notification, this is the clearest difference between the two and it has nothing to do with marketing email.

Nine language clients. Node and TypeScript, Python, PHP, Ruby, Go, Rust, Java, .NET and Elixir, plus an SMTP relay drawing on the same quota.

Where Resend is ahead

They have years of production volume behind them and we do not. They have React Email, which is the nicest way to write HTML email if your stack is React, and we have no equivalent. Their community is larger by an order of magnitude, and there is an integration for them in nearly every framework starter.

If your decision criterion is "how many other companies are betting on this", the honest answer points at them.

What a migration costs

Less than you would expect, and this is the part people do not believe until they try it. Their Node client resolves its host from RESEND_BASE_URL before falling back to api.resend.com, and so do their PHP, Ruby, Go and Rust clients. We serve their exact wire format, errors included.

Shell
RESEND_BASE_URL=https://api.emails.sh/resend
RESEND_API_KEY=esh_live_yourkey

That is the whole change for a JavaScript codebase. The resend package stays in your package.json, the imports stay, and the send call returns the same object.

Two traps worth naming. Their Python client reads RESEND_API_URL, not RESEND_BASE_URL, which is exactly the kind of detail that leaves a migration quietly still pointing at Resend. And their Java client hardcodes its host with no override at all, so a Java codebase needs our client instead.

The marketing side does not migrate through the compatibility endpoint. Audiences, broadcasts and templates are not served there, because those are our own resources with our own field names. Export your contacts and import the CSV, which has a dry run that reports exactly what it would do before it writes anything.

Questions

Does emails.sh have automations?
Yes. A trigger, an optional filter, and a list of steps that each send, wait or branch. Seventeen triggers, eleven actions, three kinds of wait including waiting for an event with a timeout. The same automation is a YAML file you can keep in git.
Is the marketing side priced per contact?
Yes, in tiers starting at 5,000 contacts, billed on the highest contact count in the month. The transactional API is priced separately, per email sent, and counts no contacts at all. Neither plan requires the other, so a product with a large user base and a small announcement list pays for the small list.
Can I run both providers at once?
Yes, and during a migration you should. A domain can publish several DKIM selectors, so both providers can sign for it while you compare bounce and complaint rates on the same traffic. Split by percentage in your own code.
What does emails.sh not have that Resend does?
React Email, and scale. On the marketing side neither of us has A/B testing, and neither of us has a drag-and-drop builder.

Give your agent an address it can answer from.

Create an inbox