Products · Developer platform

Email Service

Send transactional emails at scale with Cloudflare Email Service

Pricing and limits

Pricing

as of Nov 3, 2026

As of Nov 3, 2026, from Cloudflare's docs, last updated there Jun 9, 2026. Licensed CC BY 4.0; navigation removed.

Cloudflare Email Service pricing is based on your Cloudflare plan and email usage.

Plan pricing

Email Routing is available on both the Workers Free and Workers Paid plans. Sending to arbitrary recipients requires the Workers Paid plan. Sending to verified destination addresses in your account is free on all plans, including when only Email Routing is configured.

Workers Free Workers Paid
Outbound emails (Email Sending) Not available 3,000 included per month, then $0.35 per 1,000 emails
Inbound emails (Email Routing) Unlimited Unlimited

The 3,000 included emails apply per account, per month, aligned with your Cloudflare subscription billing cycle. Emails that hard-bounce or are otherwise accepted by Email Service count toward the quota. Emails rejected at the API boundary, including sends blocked by the suppression list, do not count toward the quota.

Sends to verified destination addresses are free and do not count toward the included quota.

Email Routing Workers is billed according to Workers pricing.

Limits

as of Nov 3, 2026

As of Nov 3, 2026, from Cloudflare's docs, last updated there Oct 30, 2026. Licensed CC BY 4.0; navigation removed.

Email sending quotas, rate limits, and how to request higher limits for production use

Cloudflare Email Service has the following limits to ensure optimal performance and prevent abuse. These limits apply to emails sent via the REST API, the Workers binding, and SMTP unless noted otherwise.

Daily sending limits

New accounts start with a conservative daily quota and scale up over time based on your sending behavior, deliverability rates, and account standing. Limits are applied per account and may be adjusted automatically as your reputation improves.

If you need higher sending limits sooner than automatic adjustment provides, refer to "Need a higher limit?" at the bottom of this page to request an increase.

Verified destination addresses

Before you onboard a sending domain, you can send emails only to verified destination addresses in your account. After you onboard a sending domain, you can send to any recipient immediately.

Sends to verified destination addresses are always free: they do not count toward your monthly quota or your daily sending limits, on any plan, including when only Email Routing is configured. You can only send from your routing domains.

Email content limits

Component Limit Notes
Recipients (to, cc, bcc) 50 per email Combined across all recipient fields
Subject line 998 characters RFC 5322 compliant
Total message size 25 MiB Including attachments
Header size 16 KB All custom headers combined

Suppression list limits

The following limits apply to the Email Sending suppression list API:

Limit Value Notes
Active entries 1 per address and scope One account suppression and one per sending domain
Results per page 1,000 Maximum per_page value with a default of 100
Items per bulk import 1,000 Split larger imports across several requests
Bulk import requests 10 per minute Applies per account and returns 429 when exceeded
Note length 1,000 characters The optional note field on an entry

The suppression list has no total-count field. Refer to the list suppressions API reference for pagination details.

Zone limits

Limit Value Notes
Domains per zone 30 Combined total of domains configured for Email Routing or Email Sending in a zone, including the apex domain

Email Routing limits

The following limits apply to inbound email handled by Email Routing.

Limit Value Notes
Routing rules per domain 200 Each rule maps an email pattern to a destination
Destination addresses per account 200 Verified destination addresses are shared across all domains in the account
Inbound message size 25 MiB Messages larger than this are rejected
Reply References entries 100 If the incoming email has more than 100 References entries, message.reply() throws. Reduces reply loops.

Each routing rule maps one email pattern to one destination address or one Worker. To forward a single email pattern to multiple destinations, use a Worker that calls forward() once per destination. All destinations must be verified beforehand.

Routing to Workers on the Workers Free plan

Workers that handle incoming emails count toward the standard Workers CPU and memory limits. On the Workers Free plan, complex handlers may exceed these limits and fail to process a message. Failed invocations appear in Workers logs with the EXCEEDED_CPU error. Upgrade to the Workers Paid plan for higher CPU and memory limits.

Emails sent from Workers

Emails sent from a Worker using the send_email binding appear in the Email Routing summary as dropped, even when they were delivered successfully. To track outbound send success, use Email sending metrics and logs instead.

Compliance

All email sending must follow applicable anti-spam laws and regulations to maintain good standing and deliverability.

  • CAN-SPAM Act (United States)
  • GDPR (European Union)
  • CASL (Canada)
  • Include proper unsubscribe mechanisms
  • Honor opt-out requests promptly

Need a higher limit?

To request an adjustment to a limit, complete the Limit Increase Request Form ↗︎. If the limit can be increased, Cloudflare will contact you with next steps.

Timeline

11 entries since February 2024.

September 2026

  • Suppress recipients for one sending domain

    Email Sending suppressions now have a scope: account: The suppression applies to every sending domain and subdomain in your account. This is the default. sending_domain: The suppression applies to one sending domain only. A suppression for mail.myappexample.com does not block mail from myappexample.com. Most importantly, Email Sending now automatically creates bounce and complaint suppressions at…

  • Manage Email Routing rules with Wrangler

    You can now manage Email Routing rules that route emails to Workers from your Wrangler configuration. Add literal addresses or a catch-all address to the top-level addresses field: { "$schema": "./node_modules/wrangler/config-schema.json", "name": "invoice-handler", "main": "src/index.ts", // Set this to today's date "compatibility_date": "2026-10-30", "addresses": [ "invoice@yourdomain.com" ] }…

July 2026

  • Preview sent emails in the Activity log

    You can now preview the content of sent emails directly from the Email Service Activity log. Expand a sent email and open the new Preview section to inspect the message as it was sent, across tabs for the rendered HTML body, the Text body, the Headers, the Attachments, and the full Raw RFC 5322 ↗︎ source. Previously, the Activity log surfaced delivery and authentication metadata but not the messa…

  • Subscribe to Email Sending events with Queues

    You can now subscribe to Email Sending events through Queues event subscriptions and receive outbound transactional email lifecycle events on a queue. Each subscription is scoped to one sending domain — either the zone apex, such as example.com, or a verified sending subdomain, such as send.example.com. Six event types are published: message.delivered, message.deferred, message.bounced, message.f…

June 2026

  • Authenticated SMTP submission now available in beta

    You can now send emails through Cloudflare Email Service using authenticated SMTP submission on smtp.mx.cloudflare.net:465. SMTP joins the REST API and the Workers binding as a third way to send transactional email — useful for existing applications that already speak SMTP and language-native SMTP libraries (Nodemailer, smtplib, PHPMailer, JavaMail). Setting Value Host smtp.mx.cloudflare.net Port…

May 2026

  • Send emails with named recipient addresses

    You can now send emails with display names on recipient addresses in addition to the existing from support. Pass an object with email and an optional name field for to, cc, bcc, replyTo, or from: src/index.jsjsexport default { async fetch(request, env) { const response = await env.EMAIL.send({ from: { email: "support@example.com", name: "Support Team" }, to: { email: "jane@example.com", name: "Ja…

April 2026

  • Email Sending now in public beta

    Email Sending is now in public beta. Send transactional emails directly from Workers (env.EMAIL.send()) or the REST API, with support for HTML, plain text, attachments, inline images, and custom headers. Email Sending joins Email Routing ↗︎ under the new Cloudflare Email Service — a single service for sending and receiving email on the Cloudflare developer platform. Send an email from a Worker in…

July 2025

  • Subaddressing support in Email Routing

    Subaddressing, as defined in RFC 5233 ↗︎, also known as plus addressing, is now supported in Email Routing. This enables using the "+" separator to augment your custom addresses with arbitrary detail information. Now you can send an email to user+detail@example.com and it will be captured by the user@example.com custom address. The +detail part is ignored by Email Routing, but it can be captured…

June 2025

  • Mail authentication requirements for Email Routing

    The Email Routing platform supports SPF ↗︎ records and DKIM (DomainKeys Identified Mail) ↗︎ signatures and honors these protocols when the sending domain has them configured. However, if the sending domain doesn't implement them, we still forward the emails to upstream mailbox providers. Starting on July 3, 2025, we will require all emails to be authenticated using at least one of the protocols,…

April 2025

  • Local development support for Email Workers

    Email Workers enables developers to programmatically take action on anything that hits their email inbox. If you're building with Email Workers, you can now test the behavior of an Email Worker script, receiving, replying and sending emails in your local environment using wrangler dev. Below is an example that shows you how you can receive messages using the email() handler and parse them using p…

March 2025

  • Threaded replies now possible in Email Workers

    We’re removing some of the restrictions in Email Routing so that AI Agents and task automation can better handle email workflows, including how Workers can reply to incoming emails. It's now possible to keep a threaded email conversation with an Email Worker script as long as: The incoming email has to have valid DMARC ↗︎. The email can only be replied to once in the same EmailMessage event. The…