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
rualist.
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 ashtml.
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.
Keep exploring
Questions about moving from Postmark
Do I need separate message streams in getread?
Can I keep sending over SMTP?
smtp.postmarkapp.com for one HTTPS request to the transactional send API.Will my Postmark templates work as they are?
{{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?
Idempotency-Key, and retries never send twice.What happens to my Postmark suppressions?
Ready when you are.
Set up getread alongside Postmark, and switch whenever it feels right.
[TRIAL TERMS]