Mirror DNS
Add Postscale verification, DKIM, return-path, and optional MX records while the old provider keeps sending.
Postscale covers the SendGrid pieces most product teams depend on: REST sending, SMTP relay, event webhooks, inbound parse, templates, suppressions, and domain authentication.
A direct map from SendGrid concepts to the Postscale API and operational model.
| SendGrid | Postscale | Migration note |
|---|---|---|
| Mail Send API | POST /v1/send | Normalize personalizations into to, cc, bcc arrays and move custom_args into metadata. |
| Event Webhook | Postscale webhooks | Subscribe to received, delivered, bounced, deferred, and complained events per endpoint. |
| Inbound Parse | Inbound Email API | Point MX at Postscale and receive parsed JSON with headers, body, and attachments. |
| Dynamic Templates | Postscale templates | Import HTML and Handlebars variables, then send by template slug or ID. |
| Suppressions | Suppression API | Export bounces, spam reports, unsubscribes, blocks, and invalids separately, then preview the CSV before commit. |
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.
Keep the application contract familiar while moving transport and credentials to Postscale.
import sgMail from "@sendgrid/mail";
sgMail.setApiKey(process.env.SENDGRID_API_KEY);
await sgMail.send({
from: "Acme <alerts@example.com>",
to: "user@example.com",
subject: "Welcome",
html: "<p>Hello from Acme</p>",
categories: ["onboarding"],
customArgs: { 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" },
}),
});Yes. Publish both DKIM selectors, keep SendGrid active, and split traffic in your application until Postscale delivery metrics are stable.
Postscale inbound email webhooks receive parsed message metadata, bodies, headers, and attachments after you point MX records at Postscale.
No. Keep rendering HTML in your app or import template HTML and variables into Postscale templates.
Export bounces, spam reports, global unsubscribes, group unsubscribes, blocks, and invalids, then preview and commit them in /dashboard/suppressions before sending through Postscale.