The case for SES, in numbers
SES pricing in 2026 is $0.10 per 1,000 outgoing messages from an EC2 / Lambda / ECS compute source, or $0.12 per 1,000 from the public SMTP endpoint. Dedicated IPs run $24.95 per IP per month regardless of volume. Inbox placement on the SES shared pool is good; on a dedicated IP after the standard warm-up, it's effectively as good as any other tier-1 sender.
The reason teams look elsewhere is rarely price. It is the AWS account itself: IAM policies, the sandbox-mode production access request, the configuration sets, the suppression list inside the SES console that has to be reconciled with SNS, CloudWatch, and the eventual S3 export. The SES API is excellent; everything around it is the AWS API.
The Cloudflare-native shape
Flowmails provisions a Worker in your Cloudflare account that uses Email Services for outbound. Email Services ships from Cloudflare's own infrastructure with the same per-zone reputation model SES uses — except the zone already lives in Cloudflare, the bindings already exist, and the worker runtime is the same one your other services use.
The data path is yours end to end: every send is logged to your D1; every attachment is in your R2; every webhook delivery has a row you can query. There is no SES sandbox to graduate out of, no SNS topic to wire up for bounce notifications, and no S3 export job to schedule. The self-hosted D1 post has the data-residency reasoning; the runtime tour has the per-message mechanics.
API shape, AWS dialect to Cloudflare dialect
SES's SendEmail and SendRawEmail SDK calls translate to POST /api/v1/messages with a flatter JSON body — the message data, the From, To, Cc, Bcc, Reply-To, Subject, Text, and Html fields are all top-level. Attachments are an array of R2 keys instead of SES's MIME-encoded inline structure.
Configuration sets become webhook subscriptions. SNS topics become outbound webhook URLs with the same delivery semantics. The suppression list is a D1 table; the bounce handler runs inside the Worker and writes to it. The per-region selection SES exposes (us-east-1, eu-west-1, etc) becomes a per-zone deployment — Cloudflare zones are inherently global, so there is no region choice to make.
Dedicated IP, the SES-shaped question
SES dedicated IPs are $24.95 per IP per month plus a warm-up window. Cloudflare's equivalent is the Email Services dedicated sending IP, which is available on Business and Enterprise zones. The pricing model is different (included in the zone plan vs per-IP), but the operational shape — one IP per sender, warm it up over 30 days, monitor reputation, then let it carry production traffic — is the same.
Most teams don't need a dedicated IP until they cross 100k messages / month from a single sender, and on the Workers free tier the Cloudflare-native version is the cheapest reliable send in the same volume band.
When to stay on SES
If your service already runs on EC2 / Lambda / ECS and your team already has IAM figured out, the per-message economics are unbeatable. If your compliance regime requires per-region data residency with explicit regional selection (us-east-1 vs eu-west-1), SES gives you that toggle in a way Cloudflare's global zone model does not. The full comparison is on the Flowmails vs Amazon SES matrix; the short version is on the Amazon SES alternative page.
When the Cloudflare-native version wins
If you don't want an AWS account at all, if your domain is already on Cloudflare, if you want your message data in your own D1 with no SNS / S3 / CloudWatch wiring, and if your team is comfortable owning a Worker — the Cloudflare-native SES alternative is the better fit in 2026. The pricing breakdown against SES is on the pricing page.