Email like a gentleman.

Your mail.
Your Cloudflare.

GentleMail is webmail you deploy to your own Cloudflare account. One deployment receives and sends for every domain you own, keeps your mail in your own D1 and R2, and tells your agents the moment something arrives.

$5
a month, all in. It's Cloudflare's Workers plan, and you may already pay it.
∞
mailboxes on every domain you own: support@, sales@, you@.
1
deployment for all your domains and all your products.
0
API keys handed to anyone. It runs inside your own account.

Made for people with more than one domain

If you run more than one thing online, per-seat mail charges you again and again. GentleMail charges you once.

You build SaaS products

Every product needs support@, billing@ and a sender for its notifications. Connect each product's domain to the same GentleMail and answer all of them from one place.

  • support@invoicely.app
  • billing@invoicely.app
  • hello@trackr.io

You run several projects online

Side projects, a few websites, a company and a personal domain. Stop setting up and paying for mail once per domain: one deployment covers all of them.

  • you@yourname.dev
  • contact@side-project.com
  • team@startup.co

You run an agency

Give each client mailboxes on their own domain, and add their staff as users who only see their own mailboxes. Your team keeps one sidebar for every client.

  • info@client-bakery.com
  • orders@client-shop.fr
  • hello@client-studio.io

You offer mailboxes to your customers

Include professional email in what you sell, without a per-seat bill eating your margin. Your customers' domains just need to be in your Cloudflare account.

  • contact@customer-one.com
  • sales@customer-two.com
  • + as many as you sell

Stop paying for mail by the seat

Hosted mail charges you for every person, every month. GentleMail runs on Cloudflare's Workers Paid plan, a flat $5 a month for your whole account. Add people, mailboxes and domains, and the price stays the same.

Monthly cost as your team growsGentleMailGoogle WorkspaceMicrosoft 365Zoho
$0$50$100$1501510152025people who sign in$175 a month$25$5, always

One year for a team of ten

Before taxes, with GentleMail's sending inside the included 3,000 emails a month.

  • GentleMail$60
  • Google Workspace Business Starter$840
  • Microsoft 365 Business Basic$840
  • Zoho Mail Lite$120
GentleMailPer-seat hosted mail
Monthly price$5 flat, the Workers Paid planPer person, every month
MailboxesUnlimited, on every domainTied to paid seats
People who sign inUnlimitedOne paid seat each
A new teammateFreeAnother seat, every month
DomainsAll of them, from one deploymentAdded to the plan, still billed per person
Where your mail livesYour Cloudflare accountThe provider's servers
API and webhooksBuilt in, scoped keys and signed eventsThrough a separate developer platform

Rival prices are per person per month on annual billing, US list prices checked in November 2026. Some of them include aliases or shared mailboxes, so compare by the number of people who sign in. GentleMail's cost is Cloudflare's Workers Paid plan: $5 a month per account, with 3,000 sent emails included (then $0.35 per 1,000), unlimited incoming mail, and 10 GB of R2 storage free (then $0.015 per GB).

Sending is only half of email

Most developer email tools start with sending. But the moment you send, people answer: replies, questions, invoices, bounces. Those answers need somewhere to land. With GentleMail, every address you send from is also an inbox your team reads and a webhook your code listens to.

Receiving: people and programs, at the same time

Sending: from a real mailbox, not a no-reply address

One webhook, a hundred automations

The moment mail arrives, your code knows. Here's what teams do with that, each in a few lines of code you run wherever you like.

Finance

Invoices that pay themselves

Contractors and suppliers send their invoices to invoices@ at the end of the month. Your code gets each one with its PDF, reads the amount and queues the payment for approval. Nobody copies numbers by hand.

  1. 1Invoice lands in invoices@
  2. 2Webhook with the PDF link
  3. 3Your code reads the amount
  4. 4Payment queued for approval
See the code
Support

Support that answers in minutes

A customer writes to support@. Your team gets a message in Slack straight away, with the sender, the subject and the first lines, instead of the email waiting until someone opens the inbox.

  1. 1Customer writes to support@
  2. 2Webhook to your Worker
  3. 3Alert in your team chat
  4. 4Answered from GentleMail
See the code
Solo founders

Your inbox, in your pocket

You run everything alone and can't keep checking five inboxes. Every new message across your products arrives on Telegram as a short summary, and you open GentleMail only when one needs you.

  1. 1Mail to any of your domains
  2. 2Webhook to your Worker
  3. 3Summary sent to Telegram
  4. 4Reply when it matters
See the code
Teams

Out of office, handled

Someone on your team is away. A small automation answers people who write to them once, says when they're back and who to contact, and leaves the original in their inbox for later.

  1. 1Mail to sam@ while away
  2. 2Webhook to your Worker
  3. 3Reply sent from sam@
  4. 4Original waits in the inbox
See the code

Every product you run, one inbox

Building several products? Don't set up mail once per domain. Connect them all to the same GentleMail and create support@, sales@ and you@ on each one, as many as you need. Your team switches between them from one sidebar, and your agents hear about every message.

kariboo.appsoftwaiz.comyourproduct.ioside-project.devGentleMailone Worker, $5 a monthOne sidebar, every mailboxsupport@kariboo.appsales@softwaiz.comyou@yourproduct.iohello@side-project.devYour agents and appsmessage.received, signed

How a message reaches you

There's no mail server to run and no API key to hand to anyone. Cloudflare receives the mail, a Worker in your account files it, and it stays in your account the whole way.

  1. 1

    Cloudflare screens it

    Email Routing checks SPF, DKIM and DMARC, and refuses known bad senders before anything reaches you.

  2. 2

    Your Worker takes it

    The catch-all hands each message to GentleMail. Unknown or turned-off addresses are refused on the spot.

  3. 3

    Your storage keeps it

    The message and its conversation go to D1. The original .eml and its attachments go to R2. Both live in your account.

  4. 4

    People and programs see it

    Your team finds it in the inbox, and every webhook listening on that mailbox gets a signed event straight away.

For the people reading mail

  • Conversations grouped the way you'd expect, with search across the mailbox
  • Reply, reply all and forward, with attachments up to 25 MB
  • One sidebar for every mailbox you can open, across all your domains
  • Archive, spam and trash, with unread counts on each folder

For the person running it

  • Add a domain and get the exact setup commands, with a live DNS check
  • Create any address on any of your domains, and choose who shares it
  • Turn a domain or a mailbox off and its mail is refused straight away
  • One deployment serves every domain, so there's one thing to keep up to date

For the programs around it

  • API keys limited to one mailbox, and to sending, reading or both
  • Send HTML and attachments, or answer inside an existing thread
  • Webhooks for received and sent mail, signed with HMAC-SHA256
  • Failed deliveries retried for about a day, with a delivery log

Set up a webhook once. It works forever.

Point a webhook at invoices@ and your invoice agent hears about each new message right away, with the sender, the text and a link to every attachment. It downloads the PDF with its own key, does the work, and answers in the same thread through the API.

Keys only reach the mailboxes and permissions you choose. Every event is signed, so your agent can prove it came from your GentleMail, and spam never reaches it.

Your agent receives
POST https://agents.yourco.com/mail
X-GentleMail-Event: message.received
X-GentleMail-Signature: v1=5f2c…

{
  "id": "6f1c2e4a-…",
  "event": "message.received",
  "data": {
    "mailbox": { "address": "invoices@yourco.com" },
    "from": { "name": "Acme Billing", "address": "billing@acme.com" },
    "subject": "Invoice INV-2041",
    "text": "Please find the November invoice attached.",
    "attachments": [{ "filename": "invoice-2041.pdf", "url": "…" }]
  }
}
And sends through your GentleMail
curl https://mail.yourco.com/api/v1/send \
  -H "Authorization: Bearer $GENTLEMAIL_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "from": "invoices@yourco.com",
        "reply_to_message_id": "…",
        "text": "Thanks, invoice INV-2041 is booked." }'

A hostile email stays harmless

Anyone can send you HTML. GentleMail treats every message as untrusted, and each of these three layers would stop a script on its own.

Cleaned before display

Scripts, event handlers, javascript: links, frames, forms and meta redirects are removed with Cloudflare's HTML parser.

Locked down by policy

A content security policy forbids scripts, form posts and remote loads. Tracking pixels stay blocked until you choose to show images.

Sealed in a sandbox

Each message renders in a sandboxed frame with scripts disabled, and the same sandbox applies if its address is opened directly.

Sessions live in HttpOnly cookies that no script can read. Risky attachments such as HTML and SVG are always downloaded, never opened in the page. Cloudflare refuses mail that fails authentication, senders you mark as spam go straight to spam next time, and spam is deleted after 30 days.

The inbox, the API and no server

Sending APIs give your code an outbox. Mail servers give your team an inbox, and a server to babysit. GentleMail gives you both, on infrastructure you already trust.

GentleMailWebmail and an email API, in your Cloudflare accountSending APIsSuch as ResendSelf-hosted mail serversSuch as mailcow
Inbox for peopleA real inbox your team signs in to, with shared mailboxesBuilt for programs, not a mailbox your team reads and answers fromYes, plus IMAP for phone and desktop apps
Incoming mail for programsWebhooks carry the sender, the text and links to each attachmentWebhooks carry metadata; the body is a second API callThrough plugins and scripts you set up
SendingFrom any of your mailboxes, and the copy lands in SentYes, that's their coreYes, from your own IP, so its reputation is on you
Server to runNone. It runs on Cloudflare WorkersNone, it's hostedA server you keep patched, with port 25 open
Price$5 a month flat, 3,000 sent emails includedPriced by volume. Received emails count toward the quotaFree software, plus the server

Resend: per its pricing page in November 2026, the free plan includes 3,000 emails a month (100 a day, 3 domains) and Pro starts at $20 a month for 50,000. Its receiving webhooks include metadata only. mailcow is a mature open-source mail server: if you need IMAP, calendars today, or full control of your own server, it's a good choice.

Missing something? Fork it.

GentleMail is open source. It fits a lot of teams as it is, but your product is yours: if it needs a mailbox for every customer, forwarding to their real inbox, or new mail pushed straight to Telegram, you don't wait for us. You fork it and add it.

It's a plain TypeScript app on Cloudflare Workers, built with RedwoodSDK. Mail comes in through one file and goes out through another, so most changes are a few dozen lines, deployed to your own account.

  • A mailboxes API for your product

    Create, rename and delete addresses from your own app, one per customer or per account.

    src/app/api.ts
  • Wildcard addresses

    Accept anything@in.yourapp.com and route each message to the right customer by its address.

    src/lib/inbound.ts
  • Forward to real inboxes

    Relay mail to each customer's own address, sent from your mailbox with their sender as the reply-to.

    src/lib/outbound.ts
  • Deliver to Telegram, Slack or anything

    Push new mail straight to a chat or a queue from GentleMail itself, with no webhook server in between.

    src/lib/webhooks.ts
  • Your own spam rules

    Add the checks your traffic needs: allow lists, keywords, a model that scores each message.

    src/lib/spam.ts
  • Your brand

    Set APP_NAME, change the colours and the fonts, and it's your product on your domain.

    src/app/styles.css

What we're building next

Everything above works today. This is what's coming next.

  • Calendar

    Invitations you can accept from the message, and a shared calendar per mailbox.

  • Smarter spam filtering

    Content-based scoring on top of Cloudflare's checks and your block lists.

  • Domain-wide block lists

    Block a sender once for a whole domain, or for every mailbox you run.

  • Auto-replies

    Out-of-office and acknowledgement replies, per mailbox, with a schedule.

  • Contacts

    Address suggestions while you type, built from the people you write to.

  • Install on your phone

    Add GentleMail to your home screen and get a notification when mail arrives.

Questions

Do I give GentleMail my Cloudflare API token?

No. GentleMail is code you deploy to your own account. It talks to Cloudflare through the bindings of your own Worker, so there's no token to hand over and no third party in the middle.

How many mailboxes and users can I create?

As many as you want. GentleMail doesn't count seats or mailboxes. Your bill is Cloudflare's Workers Paid plan, plus usage beyond what it includes.

What does a busy month cost?

Incoming mail is unlimited. The first 3,000 sent emails each month are included, then it's $0.35 per 1,000. Attachments beyond 10 GB cost $0.015 per GB a month. A team of ten sending 5,000 emails a month pays about $5.70.

Can I run several products from one deployment?

Yes, that's what it's built for. Connect every domain to the same GentleMail, give each product its own mailboxes, and switch between them from one sidebar.

Can I block mail I don't want?

Yes. Turn a mailbox off and its mail is refused. Mark a message as spam and its sender is blocked for that mailbox: their next messages go to spam and never reach your webhooks. In Cloudflare, an Email Routing rule can also drop mail for an address before it ever reaches GentleMail.

Is there an inbox for people, or only an API?

Both. Your team reads and answers mail in the web app, with folders, search, conversations and pages of 50. Your programs use the API and webhooks on the same mailboxes.

It doesn't do what my product needs. Can I change it?

Yes, that's the point of it being open source. The deploy button already gives you your own copy in your GitHub account: add what you need (a mailboxes API, forwarding, a Telegram delivery, your own spam rules) and push, and it deploys.

How is spam handled today?

Cloudflare refuses mail that fails SPF and DKIM, fails the sender's DMARC policy, or comes from blocklisted servers. In GentleMail, marking a sender as spam blocks it for that mailbox, and marking it as not spam trusts it. Content-based filtering is next on the roadmap.

Every new teammate costs $84 a year. Or nothing.

On per-seat mail, each person you add costs about $84 a year. On GentleMail, they cost nothing, and neither does the next mailbox or the next domain. Deploy it once, in about fifteen minutes.