Email delivery
Memship sends transactional email for welcome messages, password resets, activity confirmations, waitlist promotions, payment receipts, and overdue reminders. Email is disabled until you configure a transport. Two options are supported.
Which transport?
| Transport | Best for | Notes |
|---|---|---|
| Resend | Most self-hosters who want reliable delivery | Managed API, good deliverability, minimal setup. |
| SMTP | Fully self-hosted mail, or an existing mail relay | Works with any SMTP server. |
If both are configured, Resend takes precedence.
Option A — Resend
Create a Resend account and verify your sending domain.
Create an API key.
Set in
.env:RESEND_API_KEY=re_your_key_here RESEND_FROM_EMAIL=noreply@yourdomain.orgRecreate the backend so it picks up the change:
docker compose up -d --force-recreate api
Option B — SMTP
Set in .env:
SMTP_HOST=smtp.yourprovider.com
SMTP_PORT=587
SMTP_USER=your-username
SMTP_PASSWORD=your-password
SMTP_FROM=noreply@yourdomain.org
SMTP_TLS=trueThen recreate the backend:
docker compose up -d --force-recreate apiVerify
Trigger a real send to confirm delivery — for example, request a password reset from the login page, or create a member and check the welcome email arrives. Emails are localized (ES/CA/EN) based on the recipient’s language.
Troubleshooting
- No email at all — confirm
RESEND_API_KEYorSMTP_HOSTis set; if neither is set, email is intentionally disabled. - Emails delayed — sending is asynchronous via Celery. Check the worker logs:
docker compose logs -f worker. - Links point to the wrong host — set
FRONTEND_URLto your public site URL (see the Configuration reference).