Compare providers

Resend vs MailerSend

MailerSend is the transactional arm of the MailerLite family, and it inherits that lineage: a generous free tier, a template gallery with a drag-and-drop editor, and team-friendly features like domain-level permissions that appeal to mixed marketing-and-engineering orgs. Its API covers the full common surface — CC, BCC, reply-to, headers, attachments, tags, and scheduled sending — making it structurally one of the closest matches to Resend in the SDK's capability matrix; neither exposes per-message metadata. Resend differentiates on developer experience instead: React Email integration, a minimal API, and fast domain verification. Costs diverge with volume and features, so the practical decision is usually whether you want MailerSend's built-in template tooling or prefer owning templates in code with Resend and React Email.

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

Fallback compatibility

Resend and MailerSend 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 { resend } from "@opencoredev/email-sdk/resend";

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

const client = createEmailClient({
  adapters: [
    resend({ apiKey: process.env.RESEND_API_KEY! }),
    mailersend({ apiKey: process.env.MAILERSEND_API_KEY! }),
  ],
  defaultAdapter: "resend",
  fallback: ["mailersend"],
});

FAQ

Can I switch from Resend 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 Resend 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 Resend support that MailerSend doesn't?
MailerSend supports every message field that Resend supports, so nothing is lost moving a message from Resend to MailerSend.
Can I use MailerSend as a fallback for Resend?
Yes — Resend and MailerSend support the same message fields, so Email SDK can fail over between them in either direction without dropping data.

Adapter docs

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