Get Work Out of the Request
Decide what you would build from the brief alone. Everything below it is available, but the exercise stops working if you open it first.
Signup currently sends a welcome email inline. When the email provider is slow, signups are slow; when it is down, signups fail. Move it to a background job.
Enqueueing the job inside the transaction so it is "atomic with the signup". The broker is not a participant in your database transaction. The message becomes visible to workers immediately, a worker can pick it up and query for a user that has not committed yet — and if the transaction then rolls back, you have sent a welcome email to someone who does not have an account. The symptom is a rare, unreproducible "job ran for a missing record" error that gets retried away instead of understood.