Migrate from Brevo to Notify
Move transactional sends from Brevo to Notify — api-key header, htmlContent, smaller surface.
Brevo (formerly Sendinblue) bundles marketing and transactional email. Notify is the thin transactional layer: one send API, webhooks, and logs. If you only need password resets, receipts, and app notifications, you can drop the suite surface.
What changes
| Brevo | Notify | |
|---|---|---|
| Recommended client | @getbrevo/brevo (BrevoClient → sendTransacEmail) | One fetch — no SDK required |
| Auth | api-key header | x-api-key |
| Endpoint | POST https://api.brevo.com/v3/smtp/email | POST https://notify.cx/api/email/send |
| Body | sender, to[], htmlContent (or templateId) | Flat to, from, subject, message |
| Product surface | CRM, campaigns, automation + transactional | Send + webhooks + logs |
Before / after
Brevo (official @getbrevo/brevo SDK)
import { BrevoClient } from '@getbrevo/brevo';
const brevo = new BrevoClient({
apiKey: process.env.BREVO_API_KEY!
});
await brevo.transactionalEmails.sendTransacEmail({
sender: { name: 'Acme', email: 'noreply@acme.com' },
to: [{ email: 'user@example.com' }],
subject: 'Welcome',
htmlContent: '<h1>Welcome</h1>'
});
Notify (one fetch — no SDK required)
await fetch('https://notify.cx/api/email/send', {
method: 'POST',
headers: {
'x-api-key': process.env.NOTIFY_API_KEY!,
'Content-Type': 'application/json'
},
body: JSON.stringify({
from: 'Acme <noreply@acme.com>',
to: 'user@example.com',
subject: 'Welcome',
message: '<h1>Welcome</h1>'
})
});
Migration checklist
- Sign up and copy an API key from Credentials
- Verify your domain
- Replace
BREVO_API_KEYwithNOTIFY_API_KEY - Map
htmlContenttomessage(keep owning your HTML) - Point webhooks at Notify (docs) — Pro or Scale
- Confirm sends in logs