Skip to content

Latest commit

 

History

687 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

saasmail

Tests E2E CodeQL Latest release License: Apache 2.0 Cloudflare Workers

The centralized inbox for SaaS teams. One unified timeline per customer — marketing, notifications, and support emails collapsed into a single view, per person.

Every interaction with a customer matters, and context compounds. saasmail pulls the promo blast, the billing receipt, and the support thread into the same conversation, so anyone on your team can respond with the full history already in hand.

Self-hosted on Cloudflare Workers. Receive with Cloudflare Email Workers. Send with Cloudflare Email Sending, Resend, Bavimail, or Postmark.

saasmail-new

Who this is for

SaaS teams that want a self-hosted email stack on Cloudflare Workers — one shared, per-customer inbox for marketing, transactional, and support mail — without renting a VM or operating a traditional mail server. If you have a domain, a Cloudflare account, and want to own your customer email data for ~$5/month, this is for you.

Quickstart

Prerequisites: a domain on Cloudflare with Email Routing available, the Workers Paid plan, and Node.js v18+.

The fastest path is the Claude Code onboarding skill — it provisions every Cloudflare resource, fills out your config, runs migrations, and deploys for you:

git clone https://github.com/choyiny/saasmail.git
cd saasmail
claude   # then run /saasmail-onboarding

First successful result: your worker is live at your domain, and visiting it prompts you to create the first admin account. Name an inbox, send yourself a test email, and watch it land on a customer timeline.

Prefer to wire it up by hand? See Setup (~8 steps).

Documentation

Full docs live in docs/.

Deploy and operate: Setup · Email providers · Configuration · Updating · Architecture · Local development

Features: Inboxes and timelines · Email templates · Sequences · Suppressions and unsubscribe · Users and API keys · MCP server · WebMCP · Webhooks

Architecture at a glance

Inbound customer email arrives through Cloudflare Email Routing into a single saasmail Worker, which keeps mail and contacts in D1, attachments in R2, and scheduled sequence steps in a Queue; replies leave through one outbound provider - Cloudflare Email Sending, Resend, Bavimail, or Postmark - and land back with the customer.

Everything runs inside a single Cloudflare Worker — no separate mail server to operate. See Architecture for the full diagram and the component-by-component breakdown.

Sponsors

givefeedback.dev GiveFeedback.dev uses AI to turn client screen recordings into actionable tasks and prevent scope creep.

Demo Video

One person's mail across four inboxes, collapsed into a single timeline — filter by inbox and reply inline.

saasmail-demo.1.mp4

Screenshots

One timeline per customer — every inbox a person has emailed collapses into a single conversation, with per-inbox tabs and a chat-style composer.

Unified customer timeline

Agent Plan (WebMCP) — connect a browser AI agent and watch it work the inbox: it reads a playbook, lays out a live plan, and ticks steps off while a bottom-right feed groups each tool call as it runs.

Agent Plan with live plan and activity feed

Table overview — stat tiles plus a sortable people table spanning every inbox, with unread and attachment indicators.

Table overview

Templates & sequences — reusable {{variable}} email templates and multi-step drip campaigns you enroll contacts into.

Email templates

Drip sequences

Features

  • One timeline per customer — marketing, transactional, and support mail from a person, collapsed into one conversation.
  • Multi-inbox with team permissions — many inbound addresses on one deployment; members see only the inboxes they're assigned.
  • Thread or chat, per inbox — formal threading for marketing@, iMessage-style bubbles for support@.
  • Per-inbox forwarding — re-send inbound mail to any address through your own provider, sidestepping the IP blocks that break Email Routing forwards.
  • Email templates — reusable HTML with {{variable}} interpolation, sections, and a validated send contract.
  • Sequences — multi-step drip campaigns with delay overrides and auto-cancel on reply.
  • Suppressions and unsubscribe — RFC 8058 one-click unsubscribe, a suppression list enforced on every send path, and a transactional bypass.
  • Users and API keys — invite-only onboarding, passkeys, and scoped sk_… keys.
  • MCP server — connect Claude or any MCP client to your inbox over OAuth 2.1, scoped to that user's inboxes.
  • WebMCP — 20 in-page tools so a browser AI agent can work the inbox as the signed-in user. Reads and drafts; never sends or deletes.
  • Webhooks — HMAC-signed message.received callbacks for help-desk automation.

Provider Matrix

Cloudflare Resend Bavimail Postmark
Sending
Receiving

Pick one outbound provider at deploy time — see Email providers for the per-provider config and the runtime selection order.

How much does it cost?

$5/month for the Cloudflare Workers Paid plan, which includes 3,000 emails per month of Cloudflare Email Sending at no extra cost. That's it.

No VM to rent. No sprawling cloud console to learn. Just a domain, a Cloudflare account, and the Workers Paid plan.

Roadmap

  • Agentic email steering — AI-driven conversation flows that intelligently gather information from contacts through multi-turn email exchanges

Contributing

See CONTRIBUTING.md. All participants are expected to follow the Code of Conduct. Security issues: see SECURITY.md.

This repo ships a CLAUDE.md at the project root with a few notes the maintainer uses when pairing with Claude Code. It's harmless to ignore if you're not using Claude Code.

License

Apache License 2.0

The name "saasmail" and the saasmail logo are used by the original project to identify it. You are free to fork and redistribute the source under the Apache 2.0 license, but please rename your fork (and replace public/saasmail-logo.png) if you run it as a branded product, so users aren't confused about which project they're installing.

About

Self-hosted email server for SaaS teams on Cloudflare Workers with WebMCP support

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

250 stars

Watchers

4 watching

Forks

Releases

Sponsor this project

Used by

Contributors

Languages