Saltar al contenido principal

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?

TransportBest forNotes
ResendMost self-hosters who want reliable deliveryManaged API, good deliverability, minimal setup.
SMTPFully self-hosted mail, or an existing mail relayWorks with any SMTP server.

If both are configured, Resend takes precedence.

Option A — Resend

  1. Create a Resend account and verify your sending domain.

  2. Create an API key.

  3. Set in .env:

    RESEND_API_KEY=re_your_key_here
    RESEND_FROM_EMAIL=noreply@yourdomain.org
  4. Recreate 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=true

Then recreate the backend:

docker compose up -d --force-recreate api

Verify

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_KEY or SMTP_HOST is 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_URL to your public site URL (see the Configuration reference).