Email is still a core product channel, and it’s easy to ship broken messages if you don’t treat it like code. I keep templates in source control, render them with a simple templating engine, and send via nodemailer (or a provider SDK). I always include a text alternative and keep links absolute so they work across clients. Logging provider message ids is also clutch—support can trace delivery. I queue emails instead of sending inline in the request path because providers can be slow or rate-limited. The theme here is observability + reliability: retries, dead-letter handling, and boring templates beat cleverness.