Skip to content

Email delivery with Resend

For whoever runs wrkflow: verify a sending domain, set the API key and the bounce webhook.

wrkflow sends its own email through Resend: survey invitations and reminders, invitations to join, alerts and expert notices. Sign-up confirmations and password resets come from the authentication service’s own mail settings. It is set up once for the whole deployment by whoever runs wrkflow. Without it, invite dialogs show links to share yourself instead of sending.

Set up

  1. In Resend, add your sending domain. A subdomain such as mail.your-domain keeps its reputation separate from your mailbox domain.
  2. Add the DNS records Resend shows and wait until it says Verified: DKIM, SPF on the send subdomain with the MX record for bounces, and, recommended, DMARC.
  3. Create an API key with sending access to that domain only, and set it as RESEND_API_KEY. Set EMAIL_FROM to an address on the verified domain.
  4. Set UNSUBSCRIBE_SECRET, which signs the unsubscribe links in survey emails.
  5. In Resend, add a webhook to https://<your-domain>/api/email/events for bounced, complained, delivered and delivery delayed events, and set its signing secret as RESEND_WEBHOOK_SECRET.
  6. Send a survey to bounced@resend.dev, Resend’s test address. Within a minute it shows under Contacts, Not emailed, as Bounced.

What leaves wrkflow

  • Each recipient’s address and the email itself, with their personal link for survey invitations.
  • On survey emails, tags with ids only: the kind of email, the organization, the send and the participant. Never a link token.

Hard bounces and spam complaints on survey emails put the address on your organization’s Not emailed list, and soft bounces are retried; see Unsubscribes, bounces and the Not emailed list. Survey emails carry a one-click unsubscribe, and member emails such as invitations to join and password resets don’t.

If something goes wrong

  • Invite dialogs say Email isn’t set up, so share these links yourself: email isn’t configured on this server. Set RESEND_API_KEY.
  • Bounced addresses keep being emailed: the bounce webhook isn’t set up. Set RESEND_WEBHOOK_SECRET.
  • Locally, email goes to the Supabase inbox over SMTP instead. Integrations then shows Resend as not configured, though mail still works.

See Integrations for the statuses and how to ask support.

Still stuck? Talk to us and we’ll help you sort it out.