email-routing-rule.read · email-routing-rule.write
Email Routing Rules: Read, Write
This is the inbound half, and without it you cannot attach a domain at all. The connect step installs a single catch-all matcher that forwards every address on the zone to rec_{domain_id}@flowmails.net, the per-domain address on Flowmails’ own mail domain. Cloudflare does the transport handoff; the shared worker does the rest.
Editing a route table does not call this scope. Which local parts a domain accepts lives in the shared worker’s key-value namespace, keyed route_rules:{domain_id}, and is checked on every inbound message. Adding or removing an address is a single write against that namespace — it never reaches Cloudflare’s API. The scope is used at three points only: zone setup, domain teardown, and the health check that inspects the rules already on a zone instead of blindly overwriting them. Read is included alongside Write for that check.
email-routing-address.read · email-routing-address.write
Email Routing Addresses: Read, Write
Cloudflare requires a destination address to beverified before it will route to it. Since the forwarding target is rec_{domain_id}@flowmails.net — a per-domain address on Flowmails’ domain — the platform has to create and verify that address on your account. These scopes cover that: /accounts/{id}/email/routing/addresses is account-scoped rather than zone-scoped, and the write is what creates the verified destination.
This scope did not exist under the old topology, because the old flow routed to a worker inside your own account and never needed a destination address on someone else’s domain. It is the cost of moving to one shared worker, and it is the reason a domain id has to be treated as a secret: anyone who learns your routing address can inject mail into your inbox.
email-sending.read · email-sending.write
Email Sending: Read, Write
Cloudflare treats inbound and outbound as two separate products. Email Routing (above) decides who receives mail; Email Sending decides who may send from your domain, and it has its own onboarding. A domain that was never onboarded onto Email Sending cannot send a single message — the send fails at Cloudflare’s edge with E_SENDER_NOT_VERIFIED.
The connect step calls POST /zones/{id}/email/sending/subdomains to onboard the domain, then reads GET /zones/{id}/email/sending/subdomains/{tag}/dns/status to learn whether the SPF, DKIM and DMARC records Cloudflare publishes are actually in place. The domain health check reads the same endpoint, and its one-click repair calls POST /zones/{id}/email/sending/subdomains/{tag}/dns, which re-applies the missing records. Read is included alongside Write because the check inspects before it overwrites, and because a zone whose DNS records were edited by hand has to be diagnosed before anything is rewritten.
One caveat worth knowing: Email Sending is Beta, and sending to recipients outside your account’s verified addresses needs a Workers Paid plan. The connect step never blocks on that — inbound keeps working either way, and the sending step is where the verdict is surfaced.