← All playbooks
Transactional email migration

SendGrid → Resend

Move SendGrid sending to Resend by verifying domains again, rewriting the API client, and importing suppressions. SendGrid templates and mail merge do not land as Resend templates. Use React Email or HTML you already render. Dedicated IPs and warm-up state stay behind.

Typical timeline8–18 business days24–50 hours active work
Statusneeds review
Source profileSendGrid bounce export and domain authentication docs reviewed 2026-10-31
Destination profileResend SendGrid migration guide and suppressions docs 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

SendGrid

Reasons to stay
  • High-volume email APIs, templates, marketing tools, dedicated IPs, and a broad ecosystem cover many sending models
  • Audience, campaigns, automations, and reporting live in one publishing system
Reasons to leave
  • Account reputation, subusers, suppression scopes, and product complexity require disciplined governance
  • Automation logic, analytics history, and deliverability settings are not very portable
New platform

Resend

What gets better
  • 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
What gets worse
  • 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
Best of the move

Resend: A simple API, React Email, and clear domain setup make transactional sending approachable for product teams. This removes a major source-side concern: Account reputation, subusers, suppression scopes, and product complexity require disciplined governance.

Worst of the move

What you lose: High-volume email APIs, templates, marketing tools, dedicated IPs, and a broad ecosystem cover many sending models. What you inherit: Message streams, native template languages, and long IP history from older providers do not transfer in.

Jump to a section
01At a glance

Know the shape of the move.

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

This timeline assumes

  • Transactional and broadcast traffic from a small set of authenticated domains, not a multi-subuser SendGrid estate.
  • You can add DNS records for a new Resend domain without removing SendGrid records until cutover.
  • SendGrid stays able to send until Resend has passed one production send cycle.
  • The site already documents SendGrid → Postmark if you want Postmark instead of Resend.
  • You export SendGrid bounces, spam reports, blocks, and unsubscribes before the first Resend 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
Sending domainsmanualcriticalResend verifies domains on its Domains page. SendGrid domain authentication and sender identities do not move.Add Resend DNS, wait for verification, and send a test from each From address.
SPF, DKIM, and DMARCmanualcriticalNew DKIM and SPF records must coexist with SendGrid during dual-send. Link branding CNAMEs that point at sendgrid.net will not brand Resend clicks.Publish Resend records first. Keep SendGrid records until Resend is the only sender.
API payloads and SDKsmanualcriticalResend uses Authorization: Bearer and snake_case JSON. SendGrid personalizations and template IDs are not Resend fields.Rewrite one send path, then the rest. Compare From, To, subject, html, and attachments.
Templates and mail mergepartialhighResend’s SendGrid guide says SendGrid has native mail merge and templates. Resend does that work with React Email, not imported SendGrid templates.Render HTML in the app or rebuild templates. Do not expect a template-ID swap.
SuppressionspartialcriticalSendGrid keeps separate bounce, spam-report, block, and unsubscribe lists. Resend keeps one team-wide list with bounce, complaint, or manual origins. Resend skips a suppressed address on every domain.Export each SendGrid list. Import the union into Resend with the Suppressions CSV or API before production sends.
Webhooks and eventsmanualcriticalEvent names and payloads change. Resend stores webhook delivery logs. SendGrid event webhooks do not replay into Resend.Map bounce, delivery, complaint, and open events. Point one staging consumer at Resend first.
Dedicated IPs and warm-uplostcriticalIP reputation does not transfer. A sudden volume spike on a new IP or shared pool can look like a new sender.Warm the new path. Keep SendGrid for leftover volume until inbox placement looks stable.
Inbound parse routesmanualhighSendGrid Inbound Parse MX and the posted MIME payload are not a Resend import.Rebuild inbound receiving if you still need it. Test the full MIME path.
Activity and API logslostmediumSendGrid Activity history stays in SendGrid. Resend’s guide says SendGrid returns an HTTP response and does not keep API request logs. Resend does keep API logs.Export required SendGrid evidence before you lose access.
Subusers and regional pinninglosthighSendGrid subusers, EU-pinned domains, and on-behalf-of keys have no Resend equivalent in the migrate guide.Flatten the sending map. Give each app its own Resend API key.
Link branding hostsmanualhighClick and open tracking hosts change. Old sendgrid.net wrappers will not match Resend.Update tracked-link expectations and DMARC alignment after the new tracking host is live.
Rate-limit behaviorpartialmediumResend documents IETF rate-limit headers. SendGrid documents an error without those details.Read Resend headers in the new client. Do not copy SendGrid retry code blindly.
03Field and feature mapping

Where each thing goes.

SourceDestinationMethodNotes
Authenticated domainResend domainmanualVerify DNS before production From addresses.
Sender identityAny address on a verified Resend domaintransformConfirm the exact From string.
SENDGRID_API_KEYRESEND_API_KEY Bearer tokenmanualRotate. Do not reuse the SendGrid key.
Template ID and substitutionsReact Email or pre-rendered htmltransformNo template import.
Bounce CSVResend suppression origin bounce or manualtransformImport before the first live send.
Spam report and unsubscribe listsResend suppression origin complaint or manualtransformMerge lists. Resend is team-wide.
Event webhook URLResend webhook endpointmanualMap event types.
Inbound Parse hostnameResend receiving setup if you still need inboundmanualMX and payload shape change.
Dedicated IPNo destinationunsupportedReputation does not move. Warm the new path.
04Before you begin

Make the move recoverable.

Backup procedure

Create the source-of-truth backup

Keep SendGrid sending, DNS, and suppression evidence you can restore.

  1. Inventory domains, From addresses, template IDs, webhook URLs, inbound hosts, IPs, and apps.
  2. Export bounces, spam reports, blocks, and unsubscribes.
  3. Export or screenshot templates you still need.
  4. Record current SPF, DKIM, DMARC, and link-branding records.
  5. Keep a SendGrid API key that can still send until rollback closes.

Proof to capture: A dated manifest lists every domain, suppression file hash, and the SendGrid key owner.

Transformation · Resend SDK or POST https://api.resend.com/emails

Send client rewrite

Replace the SendGrid SDK call with Resend’s emails.send shape.

  1. Swap the auth header to Authorization: Bearer.
  2. Send from, to, subject, and html on one message.
  3. Render former template IDs in the app or with React Email.
  4. Add an Idempotency-Key on retries.

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

Transformation · Resend Suppressions CSV import or API

Suppression import

Stop Resend from mailing addresses SendGrid already rejected.

  1. Export each SendGrid suppression list.
  2. Dedupe by address.
  3. Import into Resend before production volume.
  4. Sample a known bounce and confirm Resend skips it.

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 send before suppressions land

criticalpossible likelihood

Resend accepts a send to an address that is on the SendGrid bounce list.

Consequence
You hit a known-bad mailbox and hurt the new domain.
Mitigation
Import suppressions and test a known bounce first.

Stop if: A production send goes to an address you already exported as bounced.

Cutover

Both providers send the same message

criticalpossible likelihood

A job still has the SendGrid key after the Resend key is live.

Consequence
Users get duplicates. Event consumers double-count.
Mitigation
One writer per message type. Disable the old key after the last queue drains.

Stop if: The same template is delivered twice to a canary inbox.

Configuration

DNS still points tracking at SendGrid

highpossible likelihood

Click or open hosts still use sendgrid.net after the API cutover.

Consequence
Clicks 404 or attribution breaks.
Mitigation
Check a live message’s rewritten links before you raise volume.

Stop if: A production click host is still SendGrid while Resend is sending.

06Precise timeline

Do the work in this order.

Estimate forA few authenticated domains, app-rendered or React Email templates, and exported SendGrid suppressions
Total elapsed8–18 business days
Active work24–50 hours
BufferAdd time for dedicated-IP warm-up, inbound parse, or a large template rewrite.
01
Days 1–3Inventory SendGrid2–3 days
02
Days 3–5Export lists and templates2 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 SendGrid

    6–10 hours active2–3 days elapsedOwner review waiting
    • List domains, From addresses, templates, webhooks, inbound, and IPs.
    • Decide which apps move first.

    Depends on: SendGrid and DNS admin access

    Stop / go checkpoint

    Export?

    Go when: Every send path has an owner.

    Stop when: A production From address is unknown.

  2. Days 3–5 · backup

    Export lists and templates

    4–8 hours active2 days elapsedCSV downloads waiting
    • Export every suppression list.
    • Archive templates and DNS.

    Depends on: inventory

    Stop / go checkpoint

    Build Resend?

    Go when: Suppression files hash and counts exist.

    Stop when: A list is missing.

  3. Days 5–12 · pilot

    Verify and rewrite

    10–22 hours active5–7 days elapsedDNS and inbox tests waiting
    • Verify the Resend domain.
    • Rewrite one send path.
    • Import suppressions on a staging team.
    • Watch webhook events.

    Depends on: backup

    Stop / go checkpoint

    Cut over?

    Go when: Canary inbox, skip-on-bounce, and events pass.

    Stop when: A required template still needs a SendGrid template ID.

  4. Days 12–16 · cutover

    Switch senders

    3–8 hours active1–3 days elapsedQueue drain waiting
    • Import production suppressions.
    • Point the app at Resend.
    • Drain SendGrid queues.
    • Raise volume in steps.

    Depends on: pilot

    Stop / go checkpoint

    Resend owns sending?

    Go when: No SendGrid 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, complaints, and latency.
    • Keep SendGrid ready.

    Depends on: cutover

    Stop / go checkpoint

    Close rollback?

    Go when: One full send cycle is clean.

    Stop when: Complaint or bounce rates jump.

07The point of change

Cut over with a way back.

Go live

Cutover

Make Resend the only production sender after suppressions and DNS are in place.

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

  1. Import the final SendGrid suppression export into Resend.
  2. Switch the application key and disable new SendGrid sends.
  3. Drain remaining SendGrid jobs.
  4. Send canary messages and confirm events.
  5. Raise volume only after skip-on-suppression works.

Proof to capture: Resend sends production mail. SendGrid is idle. A known bounce is skipped.

Return to safety

Rollback

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

Deadline: Before you delete the SendGrid domain, IP, or API key.

  1. Stop Resend production sends.
  2. Restore the SendGrid key and DNS you kept.
  3. Export Resend suppressions added after cutover.
  4. Apply reviewed new suppressions to SendGrid.
  5. Send a canary through SendGrid.

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

Rollback immediately when
  • Suppressed address received mail
  • Duplicate send
  • Webhook consumer cannot parse events
  • Bounce or complaint spike
  • A required From address fails verification
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-01BlockingResend domain verifiedSend from each production From address.Resend accepts the message. DKIM aligns.Domain page and a received header.
V-02BlockingKnown bounce is skippedSend to an address from the SendGrid bounce export.Resend does not deliver. A suppression record exists.Suppression row and send log.
V-03BlockingMessage shapeCompare a canary with the old SendGrid payload.From, To, subject, html, and attachments match the approved map.Request log.
V-04BlockingNo leftover template IDsSearch the app for SendGrid template IDs.Production paths render HTML or React Email.Code search.
V-05BlockingEvent consumerTrigger delivery, bounce, and complaint on staging.One event each. No SendGrid schema left.Consumer log.
V-06BlockingSendGrid idleWatch SendGrid Activity after cutover.No new production sends.Activity screenshot.
V-07BlockingClick hostOpen a tracked link from a Resend message.The host is the approved Resend path, not sendgrid.net.Link inspect.
V-08BlockingSendGrid still sendsKeep a rollback key and send a staging message.SendGrid still accepts mail.Rollback send.
09Post-migration cleanup

Remove the scaffolding safely.

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

  1. Archive suppression CSVs and domain screenshots.
  2. Revoke the SendGrid production key.
  3. Remove SendGrid DNS after mail and tracking no longer use it.
  4. Keep SendGrid readable through the retention window.
  5. Document the Resend key rotation.
  6. Schedule the next suppression export review.
10Experiences from the field

When the plan met reality.

First-hand accounts are preferred. Vendor case studies are labeled, and every note below is an editorial paraphrase—follow the link for the full context.

First-person accountMichael Mikuš · Spotflow

Spotflow's journey towards better email deliverability, part 22024

Michael Mikuš describes leaving SendGrid after delayed verification emails. Spotflow compared Mailgun, Mailchimp, AWS SES, Resend, and Postmark, then ran GlockApps spam tests on Resend and Postmark. They put Resend in production. A later test on new seed addresses showed Resend at 94.4% inbox-plus-tabs versus SendGrid at 86.0%, with Resend delivering every message under one minute while seven SendGrid messages took more than five. Average delivery was 1.61 seconds on Resend and 73.83 seconds on SendGrid in that run. They still saw a Gmail delay above four minutes on an earlier Resend template and fixed it by changing the template, not by switching providers again.

What they recommend
  • Run the same spam and latency test on the old and new provider with fresh seed addresses before you cut over.
  • Treat a Gmail delay as a template and reputation problem. Their first Resend template still sat in Gmail for minutes.
Worth noticing
  • They chose Resend after measured inbox and latency tests, not after a dashboard tour.
  • A later template change cut the remaining Gmail delay. The provider swap was not the last fix.
Vendor case studyResend

How Raycast migrated to ResendUndated

Resend’s Raycast customer story, told in Raycast’s voice, says the team left SendGrid because broadcasts to large audiences felt cumbersome. They started with waitlist emails for iOS and Windows. That first path took about 30 minutes. They then expanded Resend to marketing mail and investor updates. The writeup is a vendor case study. It does not publish bounce rates, suppression counts, or a full API rewrite log.

What they recommend
  • Start with one low-risk send path, the way they used waitlist mail, before you move password resets.
  • Read this as a vendor page. Confirm domain verification and suppressions from the official docs, not from the 30-minute claim.
Worth noticing
  • Raycast describes a small SendGrid-to-Resend pilot, then a wider cutover, not a bulk template import.
  • The published win is developer workflow and confidence, not a measured deliverability table.
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. Resend: migrate from SendGridAccessed 2026-10-31
  2. SendGrid: download a bounce listAccessed 2026-10-31
  3. Resend: email suppressionsAccessed 2026-10-31
  4. SendGrid: domain authenticationAccessed 2026-10-31