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 are sent by the authentication service through its own mail settings (on a server run from infra/server, the SMTP settings, pointed at Resend). Email is set up once for the whole deployment by whoever runs wrkflow. Without it, invite dialogs show links to share yourself instead of sending, survey emails aren’t sent, and, because email confirmation is required at sign-up, new accounts can’t be confirmed.
Set up
- In Resend, add your sending domain. A subdomain such as mail.your-domain keeps its reputation separate from your mailbox domain.
- 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.
- 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. For the authentication service’s emails (sign-up confirmation, password reset), set the same key as its SMTP password (SMTP_PASS on a server run from infra/server).
- Set UNSUBSCRIBE_SECRET, which signs the unsubscribe links in survey emails.
- 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.
- 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.