sently handbook
Channel-delivery for email, SMS, WhatsApp, and push — one sender shape as channels grow.
sently is the channel-delivery layer for the order confirmation email, the OTP SMS, and the device push that follow. Apps call a channel sender; providers live in transports you can swap without rewriting send sites.
The one rule
Use createMailer, createSmsSender, createWhatsAppSender, or createPushSender in app code — never a vendor SDK as your application API.
Quick start
bun add sentlyimport { createMailer } from "sently/mailer";
import { ResendTransport } from "sently/transports/resend";
const mailer = await createMailer({
transport: new ResendTransport({
apiKey: process.env.RESEND_API_KEY!,
}),
});
const result = await mailer.send({
from: "hello@example.com",
to: "person@example.com",
subject: "Welcome",
text: "Thanks for joining.",
});
console.log(result.messageId);Channels
| Channel | Sender | Start here |
|---|---|---|
createMailer / createSMTPMailer | ||
| SMS | createSmsSender | SMS |
createWhatsAppSender | ||
| Push | createPushSender | Push |
Email factories are asynchronous. SMS, WhatsApp, and push factories return the sender synchronously; every send is async.
Where next
| Path | When |
|---|---|
| Get started | Install, entrypoints, runtimes, migrate from Nodemailer |
| Channels | Full sender docs + lifecycle hooks |
| Transports | Provider list by channel |
| Failover | Retry inside a provider, then fail over |
| Support matrix | Supported vs Available for production |
| Compare | vs vendor SDKs, Nodemailer, Novu / Knock / Courier |
| Stability | What is frozen at 1.x |
Troubleshooting
No. It is the delivery layer. Preference centers, digests, workflows, and in-app inboxes sit on top — custom code or those tools. See Compare.
Start with Email or Installation, then open the channel page for SMS, WhatsApp, or push when you add that channel.