Skip to content

Migrate from Resend to PostStack

The same developer experience on EU infrastructure. Paid plans start at €5, not $20.

Resend and PostStack are intentionally similar at the wire level — both expose a typed TypeScript SDK over a clean REST API, both authenticate with a `Bearer sk_…` token, and both use lowercased JSON keys (`from`, `to`, `subject`). The migration is mostly a search-and-replace, plus a DNS update so receiving MTAs can verify mail leaving the PostStack outbound IPs. Most teams complete the cutover in under an hour. The bigger gains come after: PostStack is up to 72% cheaper at common volumes, hosts IMAP mailboxes on the same domain, and runs entirely inside the European Union.

Why switch from Resend?

  • Paid plans start at €5/month. Resend has no paid tier below $20
  • Save up to 72% on your bill at the entry tier and 55–60% at high volumes
  • IMAP and POP3 mailboxes, DMARC aggregate reports, and a visual email builder, none of which Resend ships
  • EU data residency in Helsinki, Finland, not US data centers
  • API-compatible SDKs and migration guides that let most teams cut over in under an hour

Price Comparison

Competitor prices are public list prices (USD) verified May 2026; PostStack prices are in EUR. Figures are approximate after currency conversion — check each provider's pricing page for current rates.

VolumeResendPostStackSavings
3,000/moFree€0-
10,000/mo~$20/mo€5/mo~73%
50,000/mo~$20/mo€15/mo~19%
100,000/mo~$35/mo€30/mo~7%
500,000/mo~$350/mo€130/mo~60%
1,000,000/mo~$650/mo€255/mo~58%

Code Migration

Before (Resend)

typescript
import { Resend } from 'resend';
const resend = new Resend('re_...');

await resend.emails.send({
  from: 'hello@yourdomain.com',
  to: 'user@example.com',
  subject: 'Hello!',
  html: '<h1>Welcome!</h1>',
});

After (PostStack)

typescript
import PostStack from '@poststack/sdk';
const poststack = new PostStack('sk_live_...');

await poststack.emails.send({
  from: 'hello@yourdomain.com',
  to: 'user@example.com',
  subject: 'Hello!',
  html: '<h1>Welcome!</h1>',
});

Feature Comparison

FeatureResendPostStack
REST APIYesYes
TypeScript SDKYesYes
WebhooksYesYes
Email TemplatesYesYes
BroadcastsYesYes
Contact ManagementYesYes
Open/Click TrackingYesYes
SMTP RelayYesYes
Inbound Email + WebhooksLimitedYes
IMAP/POP3 MailboxesNoYes
Visual Email BuilderNoYes
DMARC Aggregate ReportsNoYes
Workflow AutomationNoYes
Embeddable Signup FormsNoYes
EU Data ResidencyNoYes
Dedicated IPEnterprise only€25/mo add-on (Pro+)

API Mapping

Side-by-side reference for the most common operations as you migrate.

ConceptResendPostStack
Send transactional emailresend.emails.send({ from, to, subject, html, ... })poststack.emails.send({ from, to, subject, html, ... })
Send with attachmentsattachments: [{ filename, content }]attachments: [{ filename, content }]
Send with React Emailreact: <WelcomeEmail name="Alice" />html: render(<WelcomeEmail name="Alice" />) — pre-render then pass html
Add a domainresend.domains.create({ name })poststack.domains.create({ name })
Manage contacts and audiencesresend.contacts.create({ audience_id, email })poststack.contacts.create({ email, audienceIds: ["aud_..."] })
Send a broadcastresend.broadcasts.send(id)poststack.broadcasts.send(id)
Webhook signature verificationSvix signature header (Resend uses Svix under the hood)X-PostStack-Signature header, HMAC-SHA256 of `timestamp.body`

Migration Gotchas

React Email needs to be pre-rendered

Resend accepts a raw `react: <Component />` prop and renders server-side internally. PostStack expects `html` to be a string, so call `@react-email/render`’s `render()` first and pass the result. Same component, one extra line.

API key prefix differs

Resend keys begin with `re_…`; PostStack keys with `sk_live_…` (production) or `sk_test_…` (sandbox). Keep them in distinct env vars so nothing crosses over during the cutover.

DNS records change, not domain verification status

Your domain’s SPF, DKIM, and DMARC records need to point at PostStack’s SPF include and our generated DKIM selectors. Keep Resend’s records live during the staged cutover — receiving MTAs will accept mail from whichever provider actually sent it as long as DKIM aligns.

Webhook payload shape

Both providers send a JSON event with `type` and `data`. The field names inside `data` differ. Run a quick adapter in your webhook handler during the transition, or subscribe to both providers in parallel for a day to confirm parity before cutting Resend webhooks off.

Migration Steps

  1. 1Sign up for PostStack and get your API key
  2. 2Install the PostStack SDK: npm install @poststack/sdk
  3. 3Add your domain and verify DNS records
  4. 4Replace the Resend SDK import with PostStack
  5. 5Update your API key to your PostStack key
  6. 6Test in development, then switch production traffic

Frequently asked questions

How long does the migration take?

Most teams finish in under an hour: sign up, verify a domain (DNS propagation aside, this is a few minutes), swap the SDK import, and deploy. The DNS propagation is the longest single step.

Can I run Resend and PostStack in parallel?

Yes — there is no exclusivity at the DNS or SMTP layer. Add PostStack as a second sending provider, route 10% of traffic to it, verify deliverability matches, then ramp to 100%. The dual-provider window also lets you compare webhook payloads side-by-side.

Do I need to re-verify my domain?

Yes — every email provider verifies domains independently via DNS records (SPF include, DKIM CNAMEs, DMARC). PostStack auto-generates the records when you add a domain, and you can keep Resend’s records in parallel during the cutover.

What about my existing suppression list?

Export it from Resend and import via the PostStack suppressions API. PostStack accepts bulk imports, dedupes by email, and starts enforcing the list on the next send.

Will my open and click tracking continue?

Yes. PostStack inserts the open pixel and rewrites click links the same way Resend does. The tracking pixel and link-redirect domain are PostStack-hosted, so links shift from `resend.com/c/…` to `poststack.dev/c/…` going forward.

What if I am using Resend Audiences and Broadcasts?

PostStack has matching APIs: `contacts`, `audiences`, `broadcasts`, `segments`, `subscriptionTopics`. Export your audience CSV from Resend, import into PostStack, and recreate any saved segments. The data model is similar enough that most teams find the migration straightforward.

More on Resend vs PostStack

Ready to switch?

Start free. Migrate in under an hour. Save up to 72% on your bill.