Migration from Postmark

Move transactional sends from Postmark to Groundmail without changing your product’s email jobs — receipts, password resets, alerts, and invites still go out over POST /emails.


Why teams switch

  • HTTP API + npm SDK with a short path from API key to first send
  • Owned transactional mail infrastructure, not a thin layer on rented cloud email
  • Sandbox → Pool → Dedicated so you can test free, run production on a paid shared transactional network, then isolate on managed servers and IPs when you need allowlists

Quick mapping

Postmark Groundmail
Server API token gm_... API key (Authorization: Bearer)
https://api.postmarkapp.com https://api.groundmail.dev
POST /email POST /emails
Verified Sender Signature / domain Verified sending domain in Groundmail
Message Streams (Transactional) Transactional-only product (no cold/marketing mix)
Webhooks Webhooks + dashboard activity

Minimal send

curl -X POST https://api.groundmail.dev/emails \
  -H "Authorization: Bearer $GROUNDMAIL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "from": "you@yourdomain.com",
    "to": "user@example.com",
    "subject": "Hello",
    "html": "<p>It works.</p>"
  }'

Node:

npm install groundmail
import { Groundmail } from 'groundmail'

const client = new Groundmail(process.env.GROUNDMAIL_API_KEY)
await client.emails.send({
  from: 'you@yourdomain.com',
  to: 'user@example.com',
  subject: 'Hello',
  html: '<p>It works.</p>',
})

Migration checklist

  1. Create a Groundmail account and API key
  2. Add and verify your sending domain (Domains)
  3. Point your app’s send client at https://api.groundmail.dev with gm_...
  4. Map Postmark fields: From → from, To → to, Subject → subject, HtmlBody → html, TextBody → text, ReplyTo → reply_to
  5. Reconfigure webhooks to Groundmail endpoints (Webhooks)
  6. Send a canary through Sandbox or your verified domain, then cut over

HTTP aliases accepted today: htmlBody / html_body, textBody / text_body / plain_body, replyTo → reply_to. Postmark’s PascalCase HtmlBody is not accepted — map it to html (or htmlBody) in your client. New code should use canonical names (html, text, reply_to).


Domains and DNS

Production from addresses must use a domain verified in Groundmail. Cloudflare and GoDaddy apply flows can write records for you — see Domains.

Before DNS is ready, self-test with the shared sandbox sender on mail.groundmail.dev (recipients limited to your account email). Details: Quickstart.