Tailkits product guide

Cloudflare Email Service

Beta email API for Cloudflare Workers: $5 plan with 3,000 sends, then $0.35/1k

FreemiumEmail
Pricing
Freemium
Categories
Email
Listed
Sep 2026
Updated
Oct 2026

Details about Cloudflare Email Service

Short verdict: Cloudflare Email Service sends transactional email from a Workers binding, a REST API or SMTP and receives mail for free through Email Routing; sending has been a public beta since 16 April 2026. The 3,000 included emails come with the $5 Workers Paid plan, not a free tier (Workers Free cannot send to customers), and 100,000 emails a month cost $38.95 on that plan. The trade-offs are lock-in and a short feature list: the domain must use Cloudflare DNS, there is no region choice, hosted templates or open tracking, and delivery events arrive in Cloudflare Queues instead of webhooks. It suits apps that already run on Workers and Cloudflare DNS; if you need EU hosting, marketing email or a mature sending dashboard, look elsewhere.

How we reviewed it: We did not create an account or send email through Cloudflare Email Service. On 21 October 2026 we read the 42 pages in the Email Service docs index, the Workers pricing page and the launch blog post, and went through the send-email quickstart step by step without running it. We also checked the SDKs on npm, PyPI and pkg.go.dev, the Wrangler 4.151.3 command help (no login needed) and 90 days of Cloudflare's status page. Deliverability, the dashboard and the starting daily quota could not be tested without an account.

What you get on the $5 Workers Paid plan

StatusEmail Sending in public beta since 16 April 2026; SMTP in beta since 8 June 2026. Wrangler marks every email command "open beta".
Free tierNone for sending to customers. Sends to your own verified addresses are free on any plan, and inbound Email Routing is free and unlimited.
PriceWorkers Paid, $5 a month minimum per account, includes 3,000 emails, then $0.35 per 1,000: $7.45 for 10,000, $38.95 for 100,000 and $353.95 for 1,000,000 emails a month.
Before the first sendWorkers Paid, a domain on Cloudflare DNS, and domain onboarding, which adds locked DNS records. A starting daily quota whose size Cloudflare does not publish. Transactional mail only.
RegionsNo region choice for sending
Ways to sendWorkers send_email binding, REST API, SMTP on port 465
SDKsNode (cloudflare 7.3.0), Python (5.9.0) and Go (v6.10.0). Each is the full Cloudflare API SDK, not a separate email package.
EventsSix delivery event types sent to a Cloudflare Queue; no HTTP webhooks
InboundEmail Routing: forward to verified addresses or process in a Worker

What we found in the docs and pricing

The 3,000 emails come with a $5 plan

Cloudflare's pricing table lists outbound email on Workers Free as "Not available". The only free sending is to verified destination addresses, meaning addresses in your own account that confirmed a verification email. Sending to anyone else needs Workers Paid, a $5 monthly minimum per account that also covers Workers usage. It includes 3,000 emails, then charges $0.35 per 1,000:

  • 10,000 emails: $5 + 7 × $0.35 = $7.45 a month

  • 100,000 emails: $5 + 97 × $0.35 = $38.95

  • 1,000,000 emails: $5 + 997 × $0.35 = $353.95

Cloudflare Email Service pricing table: outbound email not available on Workers Free, 3,000 included per month then $0.35 per 1,000 on Workers Paid, inbound unlimited on both
Sending exists only on Workers Paid; at 100,000 emails a month that is $5 + 97 × $0.35 = $38.95.

The fine print:

  • Hard bounces count toward the quota; sends blocked by the suppression list do not.

  • The docs don't say whether a message to three recipients counts once or three times. Our figures assume one recipient per message.

  • Delivery events go through Queues. They add about $0.80 a month at 1,000,000 emails and nothing at lower volumes.

  • New accounts start with an unpublished "conservative daily quota" that grows with reputation. 1,000,000 a month averages 33,333 a day, so request an increase before launch.

Setup starts with Cloudflare DNS

"You must be using Cloudflare DNS to use Email Service," reads the quickstart's first note. Onboarding is then four steps in the dashboard. Cloudflare adds MX, SPF and DKIM records on a cf-bounce subdomain and a DMARC record, and the docs expect them to take effect within 5 to 15 minutes. These records stay locked while the domain sends.

Check the DMARC policy afterwards. The domain page shows p=reject, while the authentication page says to start with p=none.

Cloudflare Email Service quickstart: a note that Cloudflare DNS is required, then four steps to onboard a domain, which add MX, SPF and DKIM records on the cf-bounce subdomain and a DMARC record
The quickstart's first requirement is Cloudflare DNS; onboarding then writes the sending records for you.

Until a domain is onboarded, sending is limited to verified addresses: a free test mode.

Three ways to send, with shared limits

The Workers binding keeps API keys out of your code. Declare send_email in the Wrangler config, then call env.EMAIL.send() with sender, recipients, subject, HTML and text; it returns a message ID.

The REST API takes a POST with an API token. The Node, Python and Go SDKs wrap it as send and sendRaw.

SMTP runs on port 465 with implicit TLS only. Port 587 with STARTTLS is not offered, so check your mail library's settings.

All three paths share the same limits: 50 recipients per message, 5 MiB including attachments, and at most 32 attachments. The docs describe no batch endpoint for many different messages, no scheduled sending and no idempotency key.

The quickstart has gaps

The Worker path is five steps, and its sample sets remote: true, so local development sends real email; without it, a simulator only logs the message. We found five gaps in the quickstart and related pages:

  • The quickstart never mentions Workers Paid.

  • The REST section does not name the token permission; the SMTP page does ("Email Sending: Edit").

  • The send bindings page says an unrestricted binding can send only "to any verified destination address". The limits page says any recipient once a domain is onboarded.

  • The launch blog shows wrangler email send, which does not exist in Wrangler 4.151.3. The command is wrangler email sending send.

  • The FAQ says transactional only, while the deliverability page suggests a subdomain "for marketing and promotional emails".

Events go to Queues, not webhooks

Since 15 July 2026, Email Sending publishes six event types to a Cloudflare Queue: delivered, deferred, bounced, failed, rejected and complained. To reach a backend outside Cloudflare, you write a consumer Worker that forwards them.

Suppressions are automatic:

  • complaints, and hard bounces from mailboxes that don't exist, never expire

  • other hard bounces last 7 days

  • soft bounces last 24 hours

"Drop suppressed recipients" is off by default, so a single suppressed address fails the whole send. Email Service does not process unsubscribe links; you add unsubscribes to the suppression list yourself.

The docs describe no hosted templates, open or click tracking, contact lists or dedicated IPs. Logs cover 30 days.

Inbound mail and agents in the same account

Email Routing is free and unlimited on both Workers plans. It forwards mail to verified addresses or passes it to a Worker that can forward, reply or reject, with messages up to 25 MiB. On Workers Free, a complex handler can run out of CPU time.

The Agents SDK adds onEmail() and replyToEmail(). For AI tools there is no email-specific MCP server, despite the changelog's wording; Cloudflare's general API MCP server can call the email endpoints.

Reliability and developer experience

Cloudflare's status page shows no uptime percentage, only incident days per service.

In the 90 days to 21 October 2026, Email Sending had one: a minor "Email Delivery Delays" incident of 55 minutes on 24 July 2026. Its text mentions Cloudflare's own password-reset and MFA emails, but it was filed against Email Sending. Email Routing had none.

The services your sends depend on had more: 5 incident days for the Cloudflare API, which REST sends use, and 14 for Workers, which binding sends use. We found no SLA for Email Sending.

Cloudflare status page, Email group: Email Routing with 90 days without incidents and Email Sending with one yellow incident day at the start of the 90-day window
Ninety days to 21 October 2026: one incident day for Email Sending (24 July), none for Email Routing.
What we checkedResult
Node SDKcloudflare 7.3.0, published to npm on 3 October 2026; email sending since 6.0.0 (30 April 2026)
Size and dependencies71.2 MB unpacked, 0 dependencies, TypeScript types included
Downloads3,766,696 in the week of 28 September to 4 October 2026, for the whole SDK
Python and Gocloudflare 5.9.0 on PyPI, cloudflare-go v6.10.0
CLIWrangler 4.151.3: email sending send, send-raw, enable, dns, all marked open beta
Docs42 pages in the index; every page also available as Markdown

The SDK's 71.2 MB covers every Cloudflare product; where bundle size matters, calling the REST endpoint with fetch avoids it.

What you still have to set up

  • DNS and domain. Move DNS to Cloudflare if needed, onboard the domain and review the DMARC policy.

  • Sending limits. Request a higher daily quota before launch traffic.

  • Bounces and complaints. A Queue subscription and a consumer Worker that updates your records.

  • Unsubscribes. Add them as manual suppressions, and decide on "Drop suppressed recipients".

  • Templates. Build HTML and text yourself, for example with React Email or Maizzle.

  • Marketing email. Newsletters need another provider.

Pros and cons

Pros

  • 100,000 emails for $38.95 a month, or $33.95 on top of an existing Workers Paid plan.

  • Free, unlimited inbound routing with processing in a Worker.

  • The binding needs no API key, and SPF, DKIM and DMARC are written for you.

  • Three sending paths, with SDKs for Node, Python and Go.

Cons

  • A public beta since April 2026, with an unpublished starting daily quota.

  • Requires Cloudflare DNS, with no region choice.

  • No webhooks, hosted templates, open tracking or dedicated IPs; transactional only.

  • No uptime figure or SLA.

  • Docs that contradict each other on recipients, marketing use and DMARC.

How Cloudflare Email Service compares

At 100,000 emails a month:

  • Amazon SES costs $16.38 on its default Essentials plan, with 29 regions (5 in the EU) and inbound in 22. Production access is a manual review per region ("initial response within 96 hours"), and you build events and webhooks yourself. Choose it for the lowest price or EU hosting.

  • Mailgun costs $75 on Foundation 100k. You pick US or EU hosting per domain, and it has templates, webhooks and inbound routes. Custom domains need SMS verification and a card. Choose it when data must stay in the EU.

  • Postmark costs $115 for its 125,000 tier ($125.50 with inbound) and has no EU hosting. It offers templates, webhooks and a free 100-email monthly tier that never expires, after a manual usage review. Choose it for a mature transactional product.

See all email tools.

Who should use Cloudflare Email Service

Use it if your app already runs on Workers with Cloudflare DNS, you send only transactional mail and want inbound handling in the same account, and a beta label is acceptable. Look elsewhere if your DNS stays elsewhere or you need EU data residency, marketing email, webhooks, hosted templates or a published uptime figure.

FAQ

Is Cloudflare Email Service free?

Not for sending to customers. The 3,000 emails a month come with the Workers Paid plan, which costs at least $5 a month, and sending then costs $0.35 per 1,000. On Workers Free you can only send to your own verified addresses; inbound Email Routing is free on both plans.

Is Cloudflare Email Service still in beta?

Yes. Email Sending has been in public beta since 16 April 2026 and SMTP since 8 June 2026, and Wrangler marks the email commands as open beta. New accounts also start with a daily sending quota whose size Cloudflare does not publish.

Do I need Cloudflare DNS to use Cloudflare Email Service?

Yes. The docs say you must use Cloudflare DNS, and onboarding a domain adds MX, SPF, DKIM and DMARC records that stay locked while the domain is set up for sending.

Can I send email without writing a Cloudflare Worker?

Yes, through the REST API, with official Node, Python and Go SDKs, or through SMTP on port 465. Your account still needs the Workers Paid plan.

Does Cloudflare Email Service have webhooks and templates?

No. Delivery events go to a Cloudflare Queue, so reaching your own backend takes a consumer Worker that forwards them, and there are no hosted templates. Build the HTML yourself, for example with React Email or Maizzle.