SMTP de Supabase con Brevo para los emails de Auth
Sustituye el remitente de email integrado de Supabase por Brevo SMTP para confirmaciones, magic links, invitaciones y restablecimientos de contraseña. El resto de envíos, desde Edge Functions con la API de Brevo.

Por qué usar Brevo como SMTP de Supabase
Lo que construyes con Supabase y Brevo
En septiembre de 2026, más de 10.000 organizaciones enviaron emails a través de Brevo desde Edge Functions de Supabase.

[auth.email.smtp]
host = "smtp-relay.brevo.com"
port = 587
user = "your-brevo-smtp-login"
pass = "env(BREVO_SMTP_KEY)"
admin_email = "[email protected]"
sender_name = "Your app"
curl --request POST \
--url https://api.brevo.com/v3/smtp/email \
--header "api-key: $BREVO_API_KEY" \
--header "content-type: application/json" \
--data '{
"sender": { "email": "[email protected]" },
"to": [{ "email": "[email protected]" }],
"subject": "Welcome",
"htmlContent": "<p>Thanks for signing up.</p>"
}'
// supabase/functions/send-email/index.ts
const BREVO_URL = 'https://api.brevo.com/v3/smtp/email'
Deno.serve(async (req) => {
const { to, subject, html } = await req.json()
const res = await fetch(BREVO_URL, {
method: 'POST',
headers: {
'api-key': Deno.env.get('BREVO_API_KEY')!,
'content-type': 'application/json',
},
body: JSON.stringify({
sender: { email: '[email protected]' },
to: [{ email: to }],
subject,
htmlContent: html,
}),
})
return new Response(await res.text(), {
status: res.status,
})
})

create extension if not exists pg_net;
create or replace function public.send_welcome()
returns trigger language plpgsql as $$
begin
perform net.http_post(
url := 'https://<project-ref>.supabase.co'
|| '/functions/v1/send-email',
headers := jsonb_build_object(
'Authorization', 'Bearer <your-key>'
),
body := jsonb_build_object(
'to', new.email,
'subject', 'Welcome',
'html', '<p>Thanks for signing up.</p>'
)
);
return new;
end;
$$;
create trigger on_profile_created
after insert on public.profiles
for each row execute function public.send_welcome();


Entrega cada email de Supabase Auth
Confirmaciones, enlaces mágicos, códigos de un solo uso, invitaciones y restablecimientos de contraseña salen por el SMTP de Brevo hacia cualquier dirección. Como recomienda Supabase, deja el contenido promocional fuera de estos emails.
Envía emails desde Edge Functions
Las Edge Functions no pueden abrir conexiones salientes en los puertos 25 y 587, así que envía con la API de Brevo: un POST a /v3/smtp/email con tu clave en la cabecera api-key. Guarda la clave con supabase secrets set y léela con Deno.env.get. Una respuesta 201 devuelve un messageId.
Recibe los eventos de entrega en Supabase
Los webhooks transaccionales de Brevo informan de 15 eventos de email, entre ellos entregado, abierto, clicado y hard bounce. Apunta uno a una Edge Function, desactiva verify_jwt en ella y verifica tú las llamadas. Cada cuenta admite hasta 40 webhooks.
Envía desde un trigger de base de datos
Con la extensión pg_net, un trigger de Postgres llama a tu Edge Function, que a su vez llama a la API de Brevo. pg_net está en beta, solo envía cuerpos JSON y lanza las peticiones cuando la transacción hace commit.
Envía los emails de Auth desde tu propio dominio
Autentica un dominio de envío en Brevo y crea un remitente para tus emails de Auth. Supabase recomienda un dominio separado para ellos, como auth.example.com.
Consulta cada email de Auth en Brevo
Las confirmaciones, los magic links y los restablecimientos de contraseña aparecen en los registros transaccionales de Brevo con sus eventos de entrega, para que compruebes qué llegó a la bandeja de entrada.