Documentation
Send Supabase Auth emails through Mailtruss.
Hand every auth email to your own Edge Function and send it with Mailtruss.
Before you start
You need a verified sending domain (see Domains) and an API key (under API keys in the dashboard; it is shown once). Keep the key in an environment variable on your server, never in code that runs in a browser or an app.
How it works
Supabase can hand every auth email (sign-up confirmation, password reset, magic link) to your own endpoint through the Send Email hook. This Edge Function follows Supabase's documented payload and signing: it verifies the hook, builds the confirmation link the way their docs show, and sends it. Click tracking is switched off, so auth links are never rewritten.
Secrets
Create the hook secret in the Supabase dashboard (Authentication, Hooks), and set MAILTRUSS_API_KEY, SEND_EMAIL_HOOK_SECRET and SUPABASE_PROJECT_REF as function secrets.
The Edge Function
The code is tested with the documented payload. Deploy it to a test project and confirm one sign-up before relying on it.
Try it without sending real mail
Send to delivered@mailtruss.test first. It works before any domain is verified and reaches no real mailbox, so you can check your code and see the recorded timeline. Then try bounced@mailtruss.test to see what a bounce looks like. All the test addresses are listed under Sending.
See what happened
Open the message under Emails in the dashboard: it shows the recorded timeline, what each event proves, and a diagnosis if something went wrong. Or fetch it with GET /api/v1/emails/:id/events. To be told as it happens, add a webhook.
If it fails
API requests answer with an error name and message. The common ones:
403 invalid_api_keyor401 missing_api_key: the key is wrong, revoked or not sent. Send it asAuthorization: Bearer ms_live_….403 domain_not_verified: the from address is on a domain that is not verified. Publish the DNS records and re-check.422 validation_error: fix the field the message names. Nothing was sent and no quota was used.429 rate_limit_exceeded: back off for theRetry-Afterheader. See rate limits.
Problems that happen after a message is accepted (bounces, complaints) are explained under delivery errors.