Posthawk
Migration Guide

Migrate from Postmark
to Posthawk

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

Step by Step

Migration steps

01

Export templates and data

Download your Postmark templates via their API. Export your suppression list and server settings for reference during setup.

Tip: Use GET /templates?count=100 to export all templates, then convert to Posthawk format.

02

Deploy Posthawk

Set up Posthawk with Docker Compose. The Postmark concept of "servers" maps to Posthawk "workspaces" — create one per environment.

03

Configure your domain

Add your domain in Posthawk and update DNS records. Posthawk uses BYODKIM (your own key pair) instead of Postmark's managed DKIM.

04

Migrate API calls

Replace Postmark API endpoints with Posthawk equivalents. The request/response shapes are similar with minor field name changes.

05

Validate delivery

Send test emails to major providers (Gmail, Outlook, Yahoo). Compare delivery rates and timing against your Postmark baseline.

Tip: AWS SES has excellent deliverability — most users see identical or better rates vs Postmark.

06

Cut over

Switch DNS and update production environment variables. Monitor the Posthawk dashboard for delivery metrics over the first 48 hours.

API Reference

API mapping

OperationMethodPostmark PathMethodPosthawk Path
Send emailPOST/emailPOST/api/v1/email/send
Send batchPOST/email/batchPOST/api/v1/email/batch
Send with templatePOST/email/withTemplatePOST/api/v1/email/send
Get delivery statsGET/deliverystatsGET/api/v1/email/stats
Get bouncesGET/bouncesGET/api/v1/email/logs?event=bounce
Code

Before & after

Send an email
Before (Postmark)javascript
const postmark = require('postmark');
const client = new postmark.ServerClient(process.env.POSTMARK_API_KEY);

await client.sendEmail({
  From: 'hello@yourapp.com',
  To: 'user@example.com',
  Subject: 'Welcome!',
  HtmlBody: '<h1>Hello!</h1>',
  MessageStream: 'outbound',
});
After (Posthawk Cloud)javascript
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: '<h1>Hello!</h1>',
  }),
});
Watch Out

Common gotchas

Message Streams → Workspaces

Postmark uses "Message Streams" to separate transactional and broadcast. In Posthawk, use separate workspaces or API keys for this.

Field names are lowercase

Postmark uses PascalCase (From, To, Subject). Posthawk uses camelCase (from, to, subject). Update your request bodies.

Inbound webhook format differs

Postmark inbound webhooks have a different JSON structure. Update your handler to parse Posthawk's inbound email format.

No built-in click/open tracking

Postmark includes optional click and open tracking. Posthawk focuses on transactional delivery — use a dedicated analytics tool if you need engagement tracking.

Other Providers

More migration guides

Migrate from SendGrid

Migrate from SendGrid to Posthawk in under an hour.

Read guide

Migrate from Resend

Switch from Resend to Posthawk while keeping the modern developer experience you love.

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