comparisons
Resend is great. Here's when you'd self-host it instead.
June 26, 2026

Resend earned its reputation; the DX is genuinely best-in-class. This isn't a takedown. It's an honest map of the few places where owning the stack beats renting it.
Let's get the disclaimer out of the way, because we mean it: Resend is a very good product. The API is clean, the React Email integration is the nicest templating story in the space, the dashboard is polished, and you can go from zero to a delivered email in minutes without thinking about DKIM. If you want a managed transactional sender and you never want to touch deliverability plumbing, Resend is a defensible default and you should probably use it.
So why would anyone self-host an alternative? Because "managed" and "owned" are different trade-offs, and for some teams the second one wins. Let's be specific about which.
The one structural difference
Everything below flows from a single distinction:
- Resend runs on Resend's infrastructure. Your contacts, your sent mail, your engagement data, your audience: they all live in Resend's database. You access them through Resend's API, under Resend's pricing, subject to Resend's terms.
- Tinbox runs on your infrastructure: your Cloudflare account, your D1 database, your R2 bucket. The contacts and mail are rows in a SQLite database you can query directly. There's no Tinbox-hosted control plane in the path.
That's it. That's the whole disagreement. For most early-stage projects, where your data lives genuinely doesn't matter and the managed path is faster. The question is whether you've crossed into the territory where it does.
The comparison, honestly
| Resend | Tinbox (self-hosted) | |
|---|---|---|
| Setup time | Minutes, zero infra | One npx tinbox init + DNS; you manage a Worker |
| DX / API | Excellent; React Email, templates, polished docs | Clean send() API, runs in your Worker; rawer templating |
| Where data lives | Resend's database | Your Cloudflare account (D1 + R2) |
| Pricing model | Per-email tiers (free up to a cap, then per-thousand) | Cloudflare at-cost + one-time lifetime license |
| Marginal cost per email | Grows with volume | Effectively Cloudflare's metered cost |
| Deliverability | Managed IPs, warmup handled for you | You own domain reputation; Tinbox handles DKIM/SPF/bounces |
| Contact list / audience | Stored & metered by Resend | Yours, in your DB, no per-contact fee |
| Inbound / webmail | Not included | Included (a real inbox UI on the same data) |
| Newsletter / broadcasts | Resend Broadcasts (good, separate feature) | Included on the same contact list |
| AI agent over mail | Not included | Built in (Vercel AI SDK) |
| MCP server | Not included | Built in (OAuth + bearer) |
| Vendor lock-in | You depend on Resend continuing & pricing | You own the data; run your own copy |
| Best when | You want managed, fast, hands-off sending | Email is core, you're Cloudflare-native, volume is real |
Notice the bottom three rows. Resend is a sender. Tinbox is a sender plus a newsletter tool plus a webmail inbox plus an AI/MCP layer, because they all share one contact database. That's not Resend doing something wrong; it's a different product shape. Resend is deliberately focused, and focus is a feature. Tinbox is deliberately a stack.
When Resend is the right call
Use Resend (or stay on it) if:
- You send low volume. The free tier and managed deliverability are hard to beat when you're sending hundreds or low thousands of emails a month.
- You don't want to run infrastructure. Even a single Worker is more than zero. If "I never want to think about this" has value, Resend delivers it.
- You love React Email. It's genuinely the best template DX around, and it's first-class in Resend.
- Email is incidental to your product. If it's a password reset and a receipt, optimizing the email stack is a distraction. Use the managed thing.
We're not being polite for its own sake. These are real reasons, and for a lot of teams they're decisive.
When you'd self-host instead
Reach for Tinbox when one or more of these is true:
Email is core, and you don't want it in a third party's database
If your product is email-heavy (a CRM, a support tool, a newsletter business, anything where the mail and the audience are the asset), then having that asset sit in a vendor's database is a strategic risk. Self-hosting puts it in your account, queryable, exportable, yours.
Per-email or per-contact pricing has started to hurt
This is the most common trigger. Managed senders are cheap at small volume and expensive at large volume, and per-contact newsletter pricing punishes you precisely for the growth you wanted. We ran the numbers across 10k / 100k / 1M emails a month in transactional-email-cost, and the crossover where owning beats renting comes earlier than most people guess.
You're already Cloudflare-native
If your app already runs on Workers, your data's in D1, and your assets are in R2, then adding a managed email vendor means leaving the platform you've standardized on. Tinbox keeps email inside your Cloudflare account. One platform, one bill, one place to reason about. (And if you've ever tried to send mail straight from a Worker, you've hit the wall we cover in cloudflare-workers-send-email, where Tinbox is the fix that stays on-platform.)
You want the inbox and newsletter unified with the sender
With managed tools, your transactional history is in Resend, your campaign engagement is in Mailchimp, and your support thread is in Gmail: three databases, no join. Tinbox puts them on one contact record. The customer who got the receipt, opened the campaign, and emailed support is one row, and your AI agent can reason across all three.
You want vendor independence
Pricing changes. Companies get acquired. Free tiers shrink. When the stack runs on your own Cloudflare account with the data in your own database, none of that is an emergency. You're not betting your email on someone else's roadmap.
A fair summary
Resend optimizes for managed simplicity. Tinbox optimizes for ownership and unification. Neither is universally correct.
If you're shipping fast and email is a side concern, the managed path is the right default: use Resend and move on. If email is central, your volume is real, you're already on Cloudflare, or you want the inbox/newsletter/sender on one owned dataset, the self-hosted path pays off. The honest test is simple: would you rather rent this or own it? Most teams should rent until the answer flips, and Tinbox exists for the moment it does.
- cloudflare-workers-send-email: the technical reason you can't just send from a Worker, and how Tinbox closes the gap
- transactional-email-cost: the worked pricing math behind the "it started to hurt" trigger
- introducing-tinbox: what the full stack looks like once it's on your account
- 10 transactional email API alternatives worth comparing: where Resend sits among the broader field of managed senders
- 8 SendGrid alternatives for teams that outgrew it: if you're comparison-shopping senders more widely than just Resend
You self-host it on your own Cloudflare account, so your data and mail stay yours.
Frequently asked questions
Is Tinbox a drop-in Resend alternative?
API-shape-wise it's close: a send() call with to/from/subject/html is the same mental model. The difference is where it runs: Tinbox deploys onto your own Cloudflare account, so you own the data and the contact list, and there's no per-email pricing.
What does Resend do better?
Polish and zero-setup DX. Resend's dashboard, React Email integration, templates, and onboarding are excellent, and you don't manage any infrastructure. If you want a managed sender and never want to think about deliverability plumbing, Resend is a fine choice.
When should I self-host instead of using Resend?
When email is core to your product and you don't want it in a third party's database; when per-email or per-contact pricing starts to hurt at volume; when you're already Cloudflare-native; or when you want the inbox, newsletter, and sender unified on data you own.


