← All playbooks
Transactional email migration

Resend → Postmark

Move Resend sending to Postmark by verifying Sender Signatures or domains, creating Servers and Message Streams, and importing Resend’s team-wide suppressions into each stream. React Email can keep rendering HTML. Postmark Templates are optional. SMTP is available on Postmark if you need it.

Typical timeline8–18 business days24–50 hours active work
Statusneeds review
Source profileResend suppressions docs reviewed 2026-10-31
Destination profilePostmark migrate-from-Resend guide reviewed 2026-10-31
Documentation date
Review window
Evidence4 sources
This route needs review.Use it as a planning baseline, then verify the dated sources and test with representative data before production.
Before you migrate

Should you make this move?

Both platforms have a case. Compare what you gain with what you give up before scheduling the cutover.

Current platform

Resend

Reasons to stay
  • A simple API, React Email, and clear domain setup make transactional sending approachable for product teams
  • Audience, campaigns, automations, and reporting live in one publishing system
Reasons to leave
  • Message streams, native template languages, and long IP history from older providers do not transfer in
  • Automation logic, analytics history, and deliverability settings are not very portable
New platform

Postmark

What gets better
  • Focused transactional delivery, clear message streams, excellent diagnostics, and support simplify reliable sending
  • Audience, campaigns, automations, and reporting live in one publishing system
What gets worse
  • Marketing automation and broad multichannel features are intentionally outside its core scope
  • Automation logic, analytics history, and deliverability settings are not very portable
Best of the move

Postmark: Focused transactional delivery, clear message streams, excellent diagnostics, and support simplify reliable sending. This removes a major source-side concern: Message streams, native template languages, and long IP history from older providers do not transfer in.

Worst of the move

What you lose: A simple API, React Email, and clear domain setup make transactional sending approachable for product teams. What you inherit: Marketing automation and broad multichannel features are intentionally outside its core scope.

Jump to a section
01At a glance

Know the shape of the move.

Transfer outcome12 features audited
Transfer outcome distributionClean transfer: 0, Partial transfer: 5, Manual rebuild: 4, Not transferred: 3.
Clean0
Partial5
Manual4
Lost3
Mapping route8 of 9 fields have a destination path

This timeline assumes

  • You send through the Resend API today. If you also use Resend SMTP, test Postmark SMTP separately.
  • You can add Postmark DKIM and Return-Path records beside Resend DNS until cutover.
  • Resend stays able to send until Postmark completes one production cycle.
  • The site already documents Resend → SendGrid and Postmark → Resend as nearby routes.
  • You export Resend suppressions before the first Postmark production send.
02What transfers

What survives the move.

“Partial” and “manual” are not footnotes. They are work that must be scheduled and verified.

ItemOutcomeImpactWhat happensMitigation
Domains and From addressesmanualcriticalPostmark requires a Sender Signature per address or Domain Verification with DKIM. Resend domains do not transfer.Add signatures or verify the domain. Send a test from each From address.
Message StreamsmanualcriticalPostmark’s guide says transactional and broadcast traffic never mix, including IP ranges. Resend has no stream object. You must pick a stream on every send.Create transactional and broadcast streams. Set MessageStream on each request.
API field namesmanualcriticalPostmark uses X-Postmark-Server-Token and PascalCase. Resend uses Bearer auth and snake_case. Postmark To, Cc, and Bcc are comma-separated strings. Resend uses arrays.Rewrite the client. Do not post Resend JSON to Postmark.
Recipient and batch limitspartialhighPostmark’s guide says 50 recipients per message and 500 messages per batch. It says Resend allows 50 recipients and 100 batch messages. Postmark’s outbound size limit is 10 MB including attachments.Split batches that assumed Resend’s 100-message cap if you now pack 500, and watch the 10 MB cap.
TemplatespartialhighPostmark offers Mustachio templates. You can keep rendering HTML in the app, including React Email, and pass HtmlBody.Pick one: keep app-rendered HTML, or port templates into Postmark.
SuppressionspartialcriticalResend suppressions are team-wide across every domain. Postmark suppressions are per stream. A Resend bounce list is not a Postmark import.Download the Resend CSV. Load HardBounce, SpamComplaint, and ManualSuppression rows onto each stream that will send to those people.
SMTPpartialhighPostmark’s guide says Resend is API-only and that Postmark supports SMTP. Resend’s own Postmark migrate page documents SMTP. If you used Resend SMTP, confirm Postmark’s username-as-token rules and that port 465 is not supported on Postmark.Rehearse Postmark SMTP or move that path to the API.
Inbound emailmanualhighPostmark inbound can post the full body and base64 attachments on the webhook. If you used Resend receiving, the consumer changes.Point inbound MX at Postmark and test a full MIME message.
Idempotency keyslostmediumPostmark’s guide says it does not currently support idempotency keys. Resend does on send and batch.Make retries safe in your app. Do not assume Postmark will drop a duplicate POST.
Webhook event setpartialhighEvent names change. Postmark documents sent and delivery-delay gaps on its own side in Resend’s guide. Map what your consumer actually reads.Pilot Delivery, Bounce, Open, Click, and SpamComplaint.
Dedicated IPs and warm-uplostcriticalResend IP reputation does not become a Postmark IP. Postmark says dedicated IPs are optional and have eligibility rules.Warm the new stream. Do not jump to full volume on day one.
RetentionlostmediumResend’s migrate page lists 30 days of Resend data and 45 days of Postmark data. History still does not import.Export Resend email logs you still need.
03Field and feature mapping

Where each thing goes.

SourceDestinationMethodNotes
Resend domainPostmark Sender Signature or verified domainmanualDKIM required for domain verification.
RESEND_API_KEYServer API token in X-Postmark-Server-TokenmanualRotate.
html / text / to arrayHtmlBody / TextBody / To stringtransformPascalCase.
React Email HTMLHtmlBody, or a Postmark TemplatetransformHTML still works.
Team suppression CSVPer-stream suppression listtransformLoad every stream that will send.
Resend webhookPostmark webhookmanualMap event names.
Broadcast sendBroadcast Message StreammanualSet MessageStream.
Transactional sendTransactional Message StreammanualDo not mix streams.
Idempotency-KeyNo destinationunsupportedHandle duplicates in the app.
04Before you begin

Make the move recoverable.

Backup procedure

Create the source-of-truth backup

Keep Resend keys, suppressions, and DNS so you can send again.

  1. List domains, From addresses, templates, webhooks, and inbound.
  2. Download the Resend suppressions CSV.
  3. Archive React Email or template source.
  4. Record current Resend DNS.
  5. Keep a Resend key that can still send.

Proof to capture: A manifest lists domains, the CSV hash, and the Resend key owner.

Transformation · Postmark Server API

Postmark client

Send PascalCase messages with a stream ID.

  1. Set X-Postmark-Server-Token.
  2. Map html to HtmlBody and join to addresses with commas.
  3. Set MessageStream on every call.
  4. Remove Idempotency-Key or replace it with your own dedupe.

Proof to capture: Save the input, output, command or tool settings, warnings, and final item counts.

Transformation · Resend Download CSV plus Postmark Suppressions API

Suppression fan-out

Copy the Resend team list onto each Postmark stream.

  1. Export Resend suppressions.
  2. Map origin bounce to HardBounce, complaint to SpamComplaint, manual to ManualSuppression.
  3. Apply the list to transactional and broadcast streams.
  4. Test a known bounce on each stream.

Proof to capture: Save the input, output, command or tool settings, warnings, and final item counts.

05Handle with care

The things most likely to hurt.

These are operating limits. Treat every “Stop if” condition as a blocked migration, not a suggestion.

Cutover

You omit MessageStream

criticalpossible likelihood

A send fails or lands on the wrong stream.

Consequence
Transactional mail shares broadcast reputation, or the API rejects the message.
Mitigation
Set the stream in one shared client. Fail closed if it is missing.

Stop if: A production send has no approved stream.

Import

Suppressions land on only one stream

criticalpossible likelihood

Broadcast imported the CSV. Transactional did not.

Consequence
Password resets go to addresses Resend already suppressed.
Mitigation
Test a known bounce on every stream.

Stop if: Any stream accepts a suppressed address.

API

Retries double-send

highpossible likelihood

The app still retries like Resend idempotency is present.

Consequence
Users get the same message twice.
Mitigation
Dedupe in the app. Watch canary inboxes during the first retry storm.

Stop if: A canary receives two copies from one logical send.

06Precise timeline

Do the work in this order.

Estimate forOne Resend team, a few domains, and app-rendered HTML moving onto Postmark streams
Total elapsed8–18 business days
Active work24–50 hours
BufferAdd time for inbound rebuild or a Mustachio port.
01
Days 1–3Inventory Resend2–3 days
02
Days 3–5Export suppressions1–2 days
03
Days 5–12Verify and rewrite5–7 days
04
Days 12–16Switch senders1–3 days
05
Days 16–18Watch deliverability3–5 days
  1. Days 1–3 · inventory

    Inventory Resend

    5–9 hours active2–3 days elapsedOwner review waiting
    • List domains, send paths, and inbound.
    • Decide stream layout.

    Depends on: Resend and Postmark admin access

    Stop / go checkpoint

    Export?

    Go when: Every send path has a stream.

    Stop when: A production From address is unknown.

  2. Days 3–5 · backup

    Export suppressions

    3–6 hours active1–2 days elapsedCSV download waiting
    • Download the Resend CSV.
    • Archive templates and DNS.

    Depends on: inventory

    Stop / go checkpoint

    Build Postmark?

    Go when: The CSV hashes.

    Stop when: The export is empty and you know you have bounces.

  3. Days 5–12 · pilot

    Verify and rewrite

    10–22 hours active5–7 days elapsedDNS and inbox tests waiting
    • Verify Postmark domains.
    • Rewrite the client.
    • Load suppressions on staging streams.
    • Pilot inbound if needed.

    Depends on: backup

    Stop / go checkpoint

    Cut over?

    Go when: Canary, stream routing, and skip-on-suppression pass.

    Stop when: A required send path still posts Resend JSON.

  4. Days 12–16 · cutover

    Switch senders

    3–8 hours active1–3 days elapsedQueue drain waiting
    • Load production suppressions on each stream.
    • Point the app at Postmark.
    • Drain Resend jobs.

    Depends on: pilot

    Stop / go checkpoint

    Postmark owns sending?

    Go when: No Resend production send remains.

    Stop when: A duplicate or a suppressed send appears.

  5. Days 16–18 · observe

    Watch deliverability

    3–6 hours active3–5 days elapsedInbox signals waiting
    • Watch bounces and complaints.
    • Keep Resend ready.

    Depends on: cutover

    Stop / go checkpoint

    Close rollback?

    Go when: One send cycle is clean.

    Stop when: Rates jump.

07The point of change

Cut over with a way back.

Go live

Cutover

Make Postmark the only production sender after suppressions exist on every live stream.

Recommended window: A low-volume weekday with DNS and app owners on call.

  1. Import the Resend CSV onto each production stream.
  2. Switch the application to the Postmark token.
  3. Drain Resend queues.
  4. Send transactional and broadcast canaries.
  5. Confirm a known bounce is skipped on each stream.

Proof to capture: Postmark sends production mail. Resend is idle. Known suppressions are skipped.

Return to safety

Rollback

Return sending to Resend without losing Postmark-era suppressions you still need.

Deadline: Before you delete the Resend domain or API key.

  1. Stop Postmark production sends.
  2. Restore the Resend key and DNS.
  3. Export new Postmark suppressions.
  4. Import reviewed rows into Resend.
  5. Send a canary through Resend.

Proof to capture: Resend is the only production sender again.

Rollback immediately when
  • Suppressed address received mail
  • Missing MessageStream
  • Duplicate send
  • Inbound parse failure
  • Bounce or complaint spike
08Verification report

Prove the migration worked.

Every blocking check must pass. Capture the evidence before cleanup begins.

0%
Interactive report preview0 / 8 checks passed
PassIDCheckMethodExpected resultEvidence
V-01BlockingPostmark domain or signatureSend from each production From address.Postmark accepts the message.Signature page and received header.
V-02BlockingMessageStream setInspect production requests.Transactional and broadcast use the approved IDs.Request log.
V-03BlockingEach stream skips a known bounceSend the same suppressed address on every live stream.Every stream refuses delivery.Suppression dump.
V-04BlockingField namesInspect a canary.PascalCase body. Token header, not Bearer.Request log.
V-05BlockingEvent consumerTrigger Delivery and Bounce.One mapped event each.Consumer log.
V-06BlockingNo duplicate canaryRetry a send the way production does.One delivered message.Inbox and message ID.
V-07BlockingResend idleWatch Resend Emails after cutover.No new production sends.Emails screenshot.
V-08BlockingResend still sendsKeep a rollback key and send a staging message.Resend still accepts mail.Rollback send.
09Post-migration cleanup

Remove the scaffolding safely.

Safe after: One full send cycle, stable rates, and seven days without a rollback trigger.

  1. Archive the Resend CSV and Postmark stream dumps.
  2. Revoke the Resend production key.
  3. Remove Resend DNS after mail no longer uses it.
  4. Keep Resend readable through the retention window.
  5. Document stream IDs and token rotation.
  6. Schedule the next suppression review.
Sources and evidence

Verify against the primary material.

Platform behavior changes. Check these sources and the review dates above before executing a production migration.

  1. Postmark: migrate from ResendAccessed 2026-10-31
  2. Resend: email suppressionsAccessed 2026-10-31
  3. Postmark: getting started and domain verificationAccessed 2026-10-31
  4. Postmark: Suppressions APIAccessed 2026-10-31