Add Postscale DNS records
Add Postscale verification, DKIM, return-path, and optional MX records while the old provider keeps sending.
Update API calls or SMTP settings, move templates and suppressions, and map inbound and delivery webhooks.
A direct map from Postmark concepts to the Postscale API and operational model.
| Postmark | Postscale | Migration note |
|---|---|---|
| Email API | POST /v1/send | Map From, To, Subject, HtmlBody, TextBody, Tag, and Metadata into Postscale fields. |
| Message Streams | Tags and domains | Tags can preserve a stream label; they do not reproduce Postmark Message Stream isolation. |
| Inbound webhook | Inbound Email API | Point MX at Postscale and keep reply routing identifiers in aliases or metadata. |
| Templates | Postscale templates | Use template slugs or UUIDs and pass variables in the send request. |
| Suppressions | Suppression API | Export suppressions per message stream and preserve stream context with scoped unsubscribe columns when needed. |
Add Postscale verification, DKIM, return-path, and optional MX records while the old provider keeps sending.
Swap API credentials and normalize the send payload. Keep the old provider path behind a feature flag for rollback.
Preview and import suppression exports, move template HTML, then configure delivery, bounce, complaint, and inbound webhooks.
Start at 10 percent, watch bounces and complaints by ISP, then increase volume as warming limits allow.
Compare the existing send request with its Postscale equivalent.
await fetch("https://api.postmarkapp.com/email", {
method: "POST",
headers: {
"X-Postmark-Server-Token": process.env.POSTMARK_TOKEN,
"Content-Type": "application/json",
},
body: JSON.stringify({
From: "Acme <alerts@example.com>",
To: "user@example.com",
Subject: "Welcome",
HtmlBody: "<p>Hello from Acme</p>",
Tag: "onboarding",
Metadata: { user_id: "usr_123" },
}),
});await fetch("https://api.postscale.io/v1/send", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.POSTSCALE_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
from: "Acme <alerts@example.com>",
to: ["user@example.com"],
subject: "Welcome",
html_body: "<p>Hello from Acme</p>",
tags: ["onboarding"],
metadata: { user_id: "usr_123" },
}),
});You can preserve stream names as tags, but tags do not reproduce Postmark Message Stream isolation. Review sending domains, routing, and reputation requirements before migrating.
Yes. Continue rendering HTML in your app and send html_body, or move reusable templates into Postscale when non-developers need to edit content.
No. Postscale parses inbound MIME and sends structured webhooks, so your application can keep focusing on routing and ticket logic.
Export the suppression dump for each message stream, keep stream names when unsubscribe scope matters, and preview the import before commit.