How to send a welcome email after a Supabase sign-up
Supabase Auth sends the confirmation email, not a welcome. How to send one after sign-up, by hand or with Kicklace writing and sending it.
The short answer
Supabase Auth sends the emails sign-in needs, like the confirmation link and the password reset. A welcome email is not one of them, so it is yours to send. You need one moment, in your code or your database, where you know someone just signed up, and one call from there.
Supabase is not one of Kicklace's built-in connections (as of October 2026 those are Clerk and Kinde). You post the sign-up yourself, in a few lines, and Kicklace writes and sends the welcome.
The plain way
Supabase's Auth Hooks do not include one that runs after a user is created. "Before User Created" runs before, and "Send Email" only changes how Supabase's own auth emails go out. So you catch the sign-up in one of two places.
- Your own sign-up code. Call your email provider right after sign-up succeeds. If you ask people to confirm their address, do it in the route the confirmation link returns to, so you never welcome an address nobody confirmed.
- A Database Webhook. Supabase can call a URL when a row is inserted into a table. It sends through the pg_net extension, which Supabase describes as asynchronous, and the payload carries the type, the table, the schema and the new
record. This is the one to use when sign-ups come from a mobile app and you have no server code of your own. Put it on a table you own, like a profiles table, and make sure the email is in that row. Supabase's own docs warn that a failing trigger onauth.userscan block sign-ups.
From there you write the email, call your provider, and decide what a retry does so nobody gets two.
With Kicklace
- Run
npm install kicklace. Make a secret key under Connections → Your website → For your developers, and keep it inKICKLACE_SECRET_KEYon your server, never in browser code. - In the place you picked, post the sign-up:
import { Kicklace } from "kicklace";
const kl = new Kicklace(process.env.KICKLACE_SECRET_KEY!);
await kl.track("signup", { email: user.email, idempotencyKey: `signup:${user.id}` });
No Node? It is one HTTP request: POST https://www.kicklace.com/api/v1/events with the secret key as a bearer token and a body of type, email and idempotency_key. The sign-ups doc shows those lines for Supabase, Auth0 and Firebase.
- Open the Lifecycle map. Kicklace writes your first emails when you make the map. Open the one at Signed up, read it, and change what you like. An email with no words yet has Write it for me.
- Switch the sequence on. First Kicklace shows who would have got it over the last 30 days. Send yourself a test before you do.
- Sign up to your own app once and watch it arrive.
The idempotencyKey makes a retry land once. Each person gets each email once, and nothing is sent for something that happened before you switched it on, so your existing users do not get a welcome. Try it on your own site in the demo, with no sign-up.
What the email should say
Say who you are, what to do first, and how to reach you.
Subject: Welcome to [your app]
Hi {{first_name}},
Thanks for signing up. To see what [your app] does, start with [the first thing to do].
If you get stuck, reply to this email.
[Your name]
Someone Kicklace only knows by email is greeted as "there". Replies go to your own email address. More in a SaaS welcome email template, or the same job in Next.js.
FAQ
Does Supabase send a welcome email itself?
As of October 2026, its email templates cover sign-up confirmation, invitation, magic link, email change, password reset and reauthentication. A welcome email is not among them.
Do I need the Send Email hook?
No. That hook changes how Supabase's own auth emails are sent. A welcome email is a separate email, sent by Kicklace or by you.
What does it cost?
Kicklace is free up to 1,000 contacts, sending from its own address with your name on it. Your own domain is part of Starter, $25 a month. See pricing.
Free up to 1,000 contacts.