Migrate from Resend when you need more than sending
Postscale keeps the modern developer experience and adds SMTP relay, full inbound routing rules, masked addresses, DMARC reporting, and migration-safe webhooks.
Migration scope
- Convert Resend emails.send payloads to POST /v1/send.
- Use SMTP relay for systems that cannot call a REST API.
- Move receiving flows to inbound aliases and signed webhooks.
- Preserve tags, headers, reply-to, and metadata in the send payload.
What changes when you move
| Resend | Postscale | Migration note |
|---|---|---|
| emails.send | POST /v1/send | Map html/text to html_body/text_body and keep tags as Postscale tags. |
| emails.batch | POST /v1/send/batch | Batch sends remain independent per message with per-item results. |
| Receiving | Inbound Email API | Postscale delivers parsed inbound email via signed webhooks and stores messages for retrieval. |
| Templates | Postscale templates | Use template slugs or keep rendering React Email HTML in your app. |
| Webhooks | Postscale webhooks | Subscribe endpoint by endpoint and verify HMAC signatures. |
Cut over in controlled steps
Mirror DNS
Add Postscale verification, DKIM, return-path, and optional MX records while the old provider keeps sending.
Convert code
Swap API credentials and normalize the send payload. Keep the old provider path behind a feature flag for rollback.
Move state
Import suppressions and template HTML, then configure delivery, bounce, complaint, and inbound webhooks.
Ramp traffic
Start at 10 percent, watch bounces and complaints by ISP, then increase volume as warming limits allow.
Send call conversion
import { Resend } from "resend";
const resend = new Resend(process.env.RESEND_API_KEY);
await resend.emails.send({
from: "Acme <alerts@example.com>",
to: ["user@example.com"],
subject: "Welcome",
html: "<p>Hello from Acme</p>",
tags: [{ name: "flow", value: "onboarding" }],
});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"],
}),
});Production checklist
Frequently asked questions
Why migrate from Resend if the send API is simple?
Teams usually move when they need SMTP relay, richer inbound routing, masked addresses, DMARC reporting, or EU/EEA-hosted primary service data in the same platform.
Do Resend receiving webhooks map directly?
The flow maps directly, but Postscale can route through aliases and inbound rules before dispatching a signed webhook.
Can I keep my current template system?
Yes. Render HTML in your app exactly as before, or move templates into Postscale when you want template preview and API-managed reuse.