Cloudflare Email Routing: setup and catches
Built 2026-09-22
Stack Cloudflare Email Routing · Gmail as destination · Cloudflare Registrar + DNS
Total cost $0 (free tier)
Affiliate networks want a contact address on your own domain. A Gmail address measurably hurts your approval odds. So I wanted hello@mossbysea.com. Cloudflare Email Routing gives you that for free — 200 custom addresses, 200 destination addresses, unlimited forwarding, about five minutes of setup.
The setup has one UI trap that nearly got me, and one limitation that bit me after. Both are below. If you haven’t deployed the site yet, the Astro → Cloudflare Pages walkthrough covers the hosting half first.
Step 1 — The destination-address trap
Email Routing’s Destination addresses tab has a single input with the placeholder user@example.com. The obvious read is that this is where you define your new address.
It isn’t. It’s where mail gets forwarded to — your existing inbox.
Destination address → your existing Gmail (this field)
Routing rule → hello@yourdomain.com (a separate tab)
Put hello@yourdomain.com in that box and you’ve built a forwarding loop to an address that doesn’t exist yet. I read the page three times and still had it backwards.
The order that works:
- Add your Gmail as a destination address.
- Click the verification link Cloudflare emails you. Until you do, nothing forwards.
- Go to Routing rules and create
hello@yourdomain.com→ your Gmail. - Add a catch-all rule, so mail to
contact@or a typo’d address doesn’t silently vanish.
Step 2 — Confirm it receives
Send yourself a test from another account. It should land in Gmail within a minute. If it doesn’t, the usual culprit is skipping step 2 — the unverified destination silently drops everything.
This part is free and works exactly as advertised. The catch is what comes next.
The limitation: it receives, it does not send
Email Routing is forwarding only. There is no sending. When you hit reply in Gmail, the message goes out as you@gmail.com, with your Gmail address visible to whoever you’re replying to.
For getting approved by an affiliate network this is fine — reviewers send a test message and check it arrives. For actually corresponding with brands it looks amateurish, because your reply carries a Gmail address.
If you want to send from your own domain, you need an SMTP relay behind Gmail’s “Send mail as”:
- Sign up for a relay — Brevo (300/day free) or Resend (3,000/month free).
- Gmail → Settings → Accounts and Import → Send mail as → enter the relay’s SMTP host, port, username, password.
- Add DKIM and DMARC records in Cloudflare DNS using the values the relay gives you. SPF is already there from Email Routing, so don’t duplicate it.
- Test at mail-tester.com. Under 8/10, fix what it flags.
Skip step 3 and your mail lands in spam.
Related: the DNS records it touches
Email Routing adds MX and SPF (TXT) records to your Cloudflare DNS. Those are the same records that the Error 1016 / www outage warning is about — when you’re in DNS deleting rows, these are exactly the ones you must not take down by accident. If email suddenly stops after a DNS change, check the MX and SPF rows first.
One more trap from the same setup: don’t use your soon-to-exist hello@ as the registrant contact when you buy the domain. That mailbox doesn’t exist yet, the ICANN verification email goes nowhere, and after 15 days the domain gets suspended. Use an address you can already receive at, and change it later.
What I’d tell myself
Destination first, click the verification link, then the routing rule, then a catch-all — and send a test before you trust it. Receiving is free and solid; sending needs the SMTP relay and the DKIM/DMARC records. The full list of Cloudflare setup gotchas, including this one, is in the eight things that broke write-up.