Switching guide

Moving from Postmark to getread

Your Postmark servers keep sending while you set things up, so there’s no rush. Here’s what comes with you, and how to move it one step at a time.

What comes with you

  • Your domain. Authenticate it with getread alongside your Postmark records.
  • Your message streams. Transactional streams map to getread’s transactional API. Broadcast streams map to marketing email: campaigns, signup forms and automations, made in a friendly editor.
  • Your recipients and suppressions. Bring your newsletter list and each stream’s suppressions as CSV files.
  • Your templates and layouts. Combine them and paste the HTML into saved getread templates.
  • Your webhooks. Point getread’s delivery events at an endpoint in your app.

One thing to know before you start: getread sends over an HTTPS API, and there’s no SMTP relay. If your app sends through smtp.postmarkapp.com, you’ll swap that for one API request. There’s no SDK to install either, so any HTTP client works.

1. Verify your domain

Add your sending domain in getread. Domain setup walks you through DKIM, SPF and DMARC, shows the exact records for your domain and checks them for you.

  • Your Postmark DKIM record and Return-Path CNAME can stay where they are. getread’s DKIM keys live under their own names, so both providers can sign your email at the same time.
  • A domain only ever has one DMARC record. If you already have one, keep your policy and add getread’s reporting address to its rua list.

2. Bring your contacts

Postmark doesn’t keep a mailing list for you, so your recipients most likely live in your own app or database. For transactional email, there’s nothing to move: your app keeps sending to the people it already knows.

For newsletters, export the people who signed up as a CSV with email, name and tags, and we’ll help you import them. Campaigns only go to contacts with a recorded consent basis, which is how and when they agreed to hear from you, so bring that along if you have it.

Postmark keeps a separate suppression list for each message stream. Export each one (the Suppressions API can dump a stream’s full list) and send them along, so people who unsubscribed, bounced or complained stay that way.

3. Rebuild or paste your templates

Postmark templates use Mustachio and can share a layout. A getread template is one HTML document with simple variables like {{name}} or {{order.number}}, filled in from the attributes you send.

  • Combine each template with its layout, then paste the HTML into a saved getread template.
  • Plain and dotted variables, like {{name}} and {{order.number}}, carry over as they are.
  • Sections and loops (anything that starts with {{#) don’t. Work those parts out in your app and pass the finished values, or render the email yourself and send it as html.

4. Point your send call at getread

Create an API key in getread with permission to send. Instead of calling https://api.postmarkapp.com/email with an X-Postmark-Server-Token header, send one request to getread with your key as a Bearer token:

curl https://app.getread.com/api/v1/transactional/send \
  -H "Authorization: Bearer $GETREAD_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: password-reset-7f3a" \
  -d '{
    "from_email": "[email protected]",
    "from_name": "Your brand",
    "to": "[email protected]",
    "subject": "Reset your password",
    "html": "<p>Here is your reset link.</p>",
    "text": "Here is your reset link."
  }'

The Idempotency-Key makes retries safe. Send the same key with the same request, and we return the original message instead of sending it twice.

getread field names are lowercase snake_case, so HtmlBody becomes html. Here’s how the rest line up:

Postmark /email getread transactional/send
From from_email, from_name
To to, one recipient per request
Subject subject
HtmlBody, TextBody html, text
ReplyTo reply_to
Metadata tags
TrackOpens analytics (needs an HTML body)
TemplateId or TemplateAlias, TemplateModel template_id, attributes
MessageStream Not needed

When you send a template_id, include the subject too. It can use the same variables as the template.

5. Reconnect your webhooks

In Postmark, webhooks are set up for each message stream. In getread, add one webhook endpoint and choose the events you want. email.bounced, email.complained and email.opened cover what Postmark’s Bounce, Spam Complaint and Open webhooks told you. email.clicked is for campaigns: getread doesn’t track clicks in transactional email. Each endpoint gets its own signing secret, so your handler can check that an event really came from getread.

Every event also shows up in Mailroom, so you can see what happened to any message without digging through logs.

6. Run both side by side, then switch

Move one stream at a time. You might start with transactional email, watch it arrive in Mailroom, and bring newsletters over once that feels settled. Keep your Postmark servers until everything has moved and the last webhooks have come in, then remove their DNS records whenever you like.

Want a hand with any of this? Talk to us, and a real person will help you plan the move.

Questions about moving from Postmark

Do I need separate message streams in getread?
No. Transactional email goes through the API and newsletters go through campaigns. They share one monthly pool on every plan, so you never have to guess how to split it.
Can I keep sending over SMTP?
getread doesn’t have an SMTP relay, so you’ll swap smtp.postmarkapp.com for one HTTPS request to the transactional send API.
Will my Postmark templates work as they are?
Plain and dotted variables like {{name}} and {{order.number}} carry over. Combine each template with its layout first, and work out any sections or loops in your app.
Can I send to several people in one request?
Each request goes to one recipient, so send one request per person. Give each one its own Idempotency-Key, and retries never send twice.
What happens to my Postmark suppressions?
Export the suppression list for each message stream and send them along with your contacts, so people who unsubscribed, bounced or complained stay that way.

Ready when you are.

Set up getread alongside Postmark, and switch whenever it feels right.

[TRIAL TERMS]