Posthawk
Migration Guide

Migrate from Resend
to Posthawk

Switch from Resend to Posthawk while keeping the modern developer experience you love. Same React Email support, now with full infrastructure control.

Step by Step

Migration steps

01

Export your templates

If you're using React Email components, you already have your templates in code. No export needed — they'll work with Posthawk's template system.

02

Deploy Posthawk

Use Docker Compose to spin up Posthawk in minutes. The architecture is similar: REST API for sending, dashboard for monitoring.

03

Configure your domain

Add your sending domain in the Posthawk dashboard. Posthawk uses BYODKIM for stronger authentication compared to Resend's shared DKIM.

Tip: Posthawk generates a unique DKIM key pair per domain — no shared signing infrastructure.

04

Update API calls

The Posthawk API is structured similarly to Resend's. Most changes are endpoint URLs and the auth header format.

05

Test delivery

Send test emails and verify DKIM alignment, delivery rates, and webhook events. Check the dashboard for real-time delivery monitoring.

06

Go live

Switch production traffic to Posthawk. Since both services use standard DKIM, the transition is seamless for recipients.

API Reference

API mapping

OperationMethodResend PathMethodPosthawk Path
Send emailPOST/emailsPOST/api/v1/email/send
Get emailGET/emails/:idGET/api/v1/email/logs/:id
List domainsGET/domainsGET/api/v1/domains
Send batchPOST/emails/batchPOST/api/v1/email/batch
Code

Before & after

Send an email
Before (Resend)javascript
import { Resend } from 'resend';
const resend = new Resend(process.env.RESEND_API_KEY);

await resend.emails.send({
  from: 'hello@yourapp.com',
  to: 'user@example.com',
  subject: 'Welcome!',
  react: <WelcomeEmail name="User" />,
});
After (Posthawk Cloud)javascript
import { render } from '@react-email/render';

const html = await render(<WelcomeEmail name="User" />);

const response = await fetch('https://api.posthawk.dev/api/v1/email/send', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'x-api-key': process.env.POSTHAWK_API_KEY,
  },
  body: JSON.stringify({
    to: 'user@example.com',
    from: 'hello@yourapp.com',
    subject: 'Welcome!',
    html,
  }),
});
Watch Out

Common gotchas

Pre-render React Email components

Resend renders React Email server-side automatically. With Posthawk, pre-render your components using @react-email/render before sending the HTML.

Auth header change

Resend uses Authorization: Bearer re_xxx. Posthawk uses x-api-key header. A simple find-and-replace in your codebase.

Inbound webhook format differs

Both Resend and Posthawk support inbound email, but webhook payload formats differ. Update your inbound handler to match Posthawk's JSON structure.

Data residency differences

Resend stores all data in the US regardless of sending region. Self-hosted Posthawk gives you full control over where your data lives.

Other Providers

More migration guides

Migrate from SendGrid

Migrate from SendGrid to Posthawk in under an hour.

Read guide

Migrate from Postmark

Move from Postmark to Posthawk and cut your email costs by up to 10x while maintaining the same delivery quality through AWS SES.

Read guide

Ready to migrate?

Deploy Posthawk and start sending in minutes. Free to self-host, no credit card required for cloud.

Cookie Preferences

We use analytics cookies to understand how you use our site and improve your experience. Privacy Policy