What Resend is great at
Resend's pitch is straightforward: a transactional email API with a great developer experience, React Email components for templates, audit logs, webhooks, and a flat $20/month for 50,000 emails with no per-message fees inside the plan. For a team that just wants to send transactional mail from noreply@app.com and never think about it, Resend is the right default.
The cost, as with any hosted provider, is that your message data lives in Resend's Postgres database. Your delivery logs, your bounce lists, your suppression rules, your open / click telemetry — all of it is in someone else's account. For most teams that is fine; for teams with a data-residency clause or a build-vs-buy reflex, it is not.
What "self-hosted on Cloudflare" actually means
Flowmails provisions a Cloudflare Worker into your account that sits on top of Email Routing for inbound and Email Services for outbound. The Worker writes every received message into your D1 database; every attachment goes into your R2 bucket; outbound messages are signed by Email Services using the DKIM keys Cloudflare manages on your zone. There is no Flowmails database that holds your mail — the data path is yours end to end.
What you trade is operational control for hosted convenience: you can read your own D1 with wrangler d1 execute, you can drop an index, you can write a SQL query to backfill a route change — but you are also the one who has to think about D1 row counts and Worker CPU budgets.
The delivery path, side by side
With Resend, you call resend.emails.send from your service, the API stores the row, signs the message with Resend's DKIM keys, and ships it via their SMTP provider. The sender reputation lives on Resend's sending IPs; you share an IP pool with other Resend customers by default, with a dedicated-IP add-on available on the Pro plan above 150,000 messages per month.
With Flowmails, your service calls POST https://api.flowmails.net/v1/messages or the equivalent Worker endpoint, the Worker hands the payload to Email Services, and Email Services signs and sends on your zone. The sender reputation lives on your Cloudflare zone, in your account. There is no shared IP pool because Email Services ships from Cloudflare's own outbound infrastructure — you inherit whatever warming posture your zone already has.
What you get for the inboxes
Resend is a send API. It does not store inbound mail, render an inbox UI, or expose a chat-style reading pane. If you want to receive support mail at support@yourdomain.com and have your team reply from the same address, you bolt on something else — often a separate customer-support platform with its own data store.
Flowmails's receive path is the same primitive used for send: the Worker writes inbound mail into D1, the dashboard lists it by mailbox and folder, and the emailbox page renders a chat-style reading pane with reply, forward, and tag actions. The whole loop — receive, index, read, reply — runs on the same D1 tables and the same Worker, so there is one source of truth for both the API and the UI.
Pricing, in concrete numbers
Resend Free: 100 emails/day, 3,000/month. Pro: $20/month for 50,000 emails. Scale: $90/month for 100,000 with dedicated IP add-on. Above that, you pay per-message.
Flowmails pricing mirrors the underlying Cloudflare costs: Base is free up to the Cloudflare Workers free tier (100k requests / day), Pro is $19/month with a higher per-day limit and D1 / R2 headroom, and Enterprise unlocks the per-account dedicated worker with custom retention. The full breakdown is on the pricing page; the short version is that you stop paying a SaaS margin on top of Cloudflare's own usage costs.
When to pick which
Resend is the right choice if you only send, you don't care which database holds the logs, and you want React Email components today. Flowmails is the right choice if you also need an inbox, you want your mail data in your own D1, and you are happy to pay for that with the operational work of owning a Worker. The full comparison matrix walks through every row; the Resend alternative page is the short version if you are still deciding.