Cloudflare email delivery

How demo email sending works on Cloudflare and how to debug missing messages.

Demo email path

The private demo uses Cloudflare Email Sending with From addresses such as SpeakerOps <noreply@speakerops.org>. EMAIL_PROVIDER and AUTH_EMAIL_PROVIDER are set to cloudflare. The Worker send_email binding named EMAIL is preferred over REST fallback tokens.

Magic links and comms are enqueued to outbox tables and drained by queue consumers and cron. The login HTTP request does not wait on provider round-trips.

Operator debug steps

Confirm domain email sending is enabled for speakerops.org. Confirm SPF/DKIM/DMARC records present from onboarding. Confirm Worker bindings and vars. Confirm queue consumers are deployed and not erroring. Ask recipients to check spam.

  1. Verify EMAIL_PROVIDER=cloudflare on the demo env.
  2. Confirm send_email binding EMAIL exists on the Worker.
  3. Request a single magic link and wait for drain (seconds to a minute under load).
  4. If nothing arrives, inspect worker logs for drain errors (redact secrets).
  5. Confirm the recipient email matches allowlist spelling exactly.

Local development

Local and CI often use sandbox provider behavior or AUTH_DEV_OUTBOX for Playwright. That path is intentional for tests and must not be confused with production Cloudflare delivery.