Compare providers

SendGrid vs Brevo

SendGrid and Brevo (formerly Sendinblue) both bundle transactional and marketing email into one platform, and both support the entire unified message shape — CC, BCC, reply-to, headers, attachments, tags, metadata, and scheduled sending — so with the SDK they are drop-in replacements for each other at the API level. The differences are commercial and regional. Brevo is European, GDPR-native, and prices by messages sent rather than contacts stored, with a workable free tier that makes it popular with early-stage teams; it also folds in SMS, WhatsApp, and a CRM. SendGrid is the larger sender with deeper deliverability tooling, dedicated IP options, and Twilio's enterprise support behind it. For EU-heavy audiences Brevo's regional footing is a genuine advantage; for very high volume SendGrid's infrastructure usually wins.

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 fieldSendGridBrevo
CC recipients
BCC recipients
Reply-To address
Custom headers
Attachments
Tags
Metadata
Scheduled sending (sendAt)

Fallback compatibility

SendGrid and Brevo support identical message fields, so Email SDK can fail over between them in either direction without losing data.

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 { sendgrid } from "@opencoredev/email-sdk/sendgrid";

const client = createEmailClient({
  adapters: [sendgrid({ apiKey: process.env.SENDGRID_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 { sendgrid } from "@opencoredev/email-sdk/sendgrid";
import { brevo } from "@opencoredev/email-sdk/brevo";

const client = createEmailClient({
  adapters: [
    sendgrid({ apiKey: process.env.SENDGRID_API_KEY! }),
    brevo({ apiKey: process.env.BREVO_API_KEY! }),
  ],
  defaultAdapter: "sendgrid",
  fallback: ["brevo"],
});

FAQ

Can I switch from SendGrid to Brevo without rewriting my email code?
Yes. With Email SDK both providers share one typed send() call and one message shape, so switching from SendGrid to Brevo is a one-line adapter change plus an API key. The SDK fails fast if a message uses a field Brevo does not support, so nothing is silently dropped.
Which message fields does SendGrid support that Brevo doesn't?
Brevo supports every message field that SendGrid supports, so nothing is lost moving a message from SendGrid to Brevo.
Can I use Brevo as a fallback for SendGrid?
Yes — SendGrid and Brevo support the same message fields, so Email SDK can fail over between them in either direction without dropping data.

Adapter docs

Setup guides: SendGrid adapter and Brevo adapter. Sending from your own domain? Verify SPF, DKIM, and DMARC with the free email DNS checker.