Brevo vs MailerSend
Brevo and MailerSend are both European-rooted platforms that pair transactional APIs with approachable marketing tooling, which makes them a common shortlist for teams that want one vendor for both jobs. Brevo is the broader suite: campaigns, automation, SMS, WhatsApp, and a CRM alongside its SMTP and API sending, priced by send volume with a usable free tier. MailerSend is narrower and more developer-focused within the MailerLite family, with a clean REST API, template editor, and inbound routing. In the unified message shape they differ on exactly one field: Brevo supports per-message metadata while MailerSend does not — both handle CC, BCC, reply-to, headers, attachments, tags, and scheduled sending — so failing over from Brevo to MailerSend only needs care when messages carry metadata.
Message field support
Field support as encoded in Email SDK's own adapter capability matrix — the same data the SDK uses to reject sends that would silently drop fields.
| Message field | Brevo | MailerSend |
|---|---|---|
| CC recipients | ✓ | ✓ |
| BCC recipients | ✓ | ✓ |
| Reply-To address | ✓ | ✓ |
| Custom headers | ✓ | ✓ |
| Attachments | ✓ | ✓ |
| Tags | ✓ | ✓ |
| Metadata | ✓ | — |
| Scheduled sending (sendAt) | ✓ | ✓ |
Fallback compatibility
Failing over from Brevo to MailerSend loses: metadata. Email SDK rejects the fallback send for messages that use these fields instead of dropping them silently.
Same code, either provider
With Email SDK the send call is identical for both providers — only the adapter import changes:
import { createEmailClient } from "@opencoredev/email-sdk";
import { brevo } from "@opencoredev/email-sdk/brevo";
const client = createEmailClient({
adapters: [brevo({ apiKey: process.env.BREVO_API_KEY! })],
});
await client.send({
from: "hello@yourdomain.com",
to: "user@example.com",
subject: "Welcome!",
html: "<p>It works.</p>",
});Or run both, with automatic fallback:
import { createEmailClient } from "@opencoredev/email-sdk";
import { brevo } from "@opencoredev/email-sdk/brevo";
import { mailersend } from "@opencoredev/email-sdk/mailersend";
const client = createEmailClient({
adapters: [
brevo({ apiKey: process.env.BREVO_API_KEY! }),
mailersend({ apiKey: process.env.MAILERSEND_API_KEY! }),
],
defaultAdapter: "brevo",
fallback: ["mailersend"],
});FAQ
- Can I switch from Brevo to MailerSend without rewriting my email code?
- Yes. With Email SDK both providers share one typed send() call and one message shape, so switching from Brevo to MailerSend is a one-line adapter change plus an API key. The SDK fails fast if a message uses a field MailerSend does not support, so nothing is silently dropped.
- Which message fields does Brevo support that MailerSend doesn't?
- Brevo supports metadata in the unified message shape, which MailerSend does not.
- Can I use MailerSend as a fallback for Brevo?
- Partially. Email SDK checks field support before every send: a fallback from Brevo to MailerSend is rejected for messages using metadata. Messages that avoid those fields fail over cleanly.
Adapter docs
Setup guides: Brevo adapter and MailerSend adapter. Sending from your own domain? Verify SPF, DKIM, and DMARC with the free email DNS checker.