Migrate from Resend
Mailhuset and Resend are close cousins (same shape of API, same domain-auth model), so switching is quick.
1. Verify your sending domain
Add your domain under Domains and publish the SPF/DKIM records (same idea as Resend's domain verification). See Verify a sending domain. Run both providers in parallel while you cut over.
Sending through Resend's SMTP service rather than its API? Then you can skip step 2: point your app's SMTP settings at smtp.mailhuset.com (port 587 with STARTTLS) with an SMTP credential, and no code changes. SMTP is included on paid plans.
2. Swap the client
The request bodies are nearly identical. Differences to know:
| Resend | Mailhuset |
|---|---|
POST /emails, Authorization: Bearer re_… | POST /v1/email, Authorization: Bearer mh_… |
from, to, subject, html, text | same field names |
mh.emails.send({...}) (SDK) | mh.emails.send({...}), same shape |
import { Mailhuset } from "mailhuset";
const mh = new Mailhuset(process.env.MAILHUSET_API_KEY);
await mh.emails.send({
from: "Acme <hello@yourdomain.com>",
to: "a@example.com",
subject: "Hi",
html: "<p>Hello</p>",
});If you used Resend's SDK, our Node & Python SDKs expose the same emails.send / get / list surface, so most code changes are just the import and the key.
3. Templates, webhooks, audiences
- Re-create templates in Templates (guide).
- Re-add webhook endpoints and map events (guide).
- Re-create audiences as contact lists for broadcasts.
4. Cut over
Verify sends and events in Activity, then move traffic over: ramp gradually rather than switching all volume at once, to keep your domain reputation healthy (deliverability).
Need a hand? Email support@mailhuset.com.
Need help? Email support@mailhuset.com.