Migration Guides — Switch Services Without Pain (2026)
Switching services? These guides cover the common migration paths — what changes, what breaks, and how long it takes.
Email Migrations
SendGrid → Resend
Why migrate: SendGrid trust declining post-Twilio, free tier removed March 2025, deliverability issues reported.
Difficulty: Low (1-2 hours)
What changes:
- Package:
@sendgrid/mail→resend - API key format:
SG_*→re_* - Send call:
sgMail.send({to, from, subject, html})→resend.emails.send({to, from, subject, html}) - Webhooks: Different payload format — update your webhook handler
What doesn’t change: DNS records (DKIM/SPF) work with any provider. Your sending domain stays the same.
Migration steps:
- Sign up at resend.com, get API key
npm uninstall @sendgrid/mail && npm install resend- Replace send calls (API is simpler — fewer lines of code)
- Update webhook endpoint to handle Resend’s payload format
- Test in staging (watch the 100/day free tier cap)
- Switch production, monitor deliverability for 48 hours
Risk: Low. Email APIs are stateless — you can run both in parallel during migration.
SendGrid → Postmark
Why migrate: Better deliverability, focused on transactional email.
Difficulty: Low-Medium (2-4 hours)
What changes:
- Package:
@sendgrid/mail→postmark - API:
sgMail.send()→client.sendEmail() - Must configure message streams (transactional vs broadcast)
- DKIM/SPF: Postmark requires its own DKIM record alongside your existing one
Migration steps:
- Sign up at postmarkapp.com, create a server
- Add Postmark’s DKIM record to your DNS (keep existing records)
npm uninstall @sendgrid/mail && npm install postmark- Replace send calls, set up message streams
- Test deliverability — Postmark publishes real-time stats
Auth Migrations
Auth0 → Clerk
Why migrate: Better DX, simpler pricing at low-to-mid scale, pre-built UI components.
Difficulty: Medium (1-2 days)
What changes:
- SDK:
@auth0/nextjs-auth0→@clerk/nextjs - Session management: Auth0 OIDC sessions → Clerk managed sessions
- UI: Auth0 Universal Login → Clerk’s
<SignIn />and<UserButton />components - User data: Must export from Auth0 and import to Clerk
What breaks:
- Password hashes: Auth0 uses bcrypt — Clerk can import bcrypt hashes, but the process requires Clerk support
- Custom claims/roles: Auth0 Actions → Clerk metadata (different API)
- Webhooks: Different payload format
Migration steps:
- Set up Clerk project, configure OAuth providers (Google, GitHub, etc.)
- Export users from Auth0 (Management API → GET /users)
- Import to Clerk via Backend API (batch user creation with password hashes)
- Replace SDK calls:
useUser()(Auth0) →useUser()(Clerk) — similar API - Replace UI components
- Run parallel auth for 1-2 weeks (accept tokens from both)
- Cut over, decommission Auth0
Risk: Medium. User migration is the hardest part. Test password hash import thoroughly.
Auth0 → Better Auth
Why migrate: Zero per-user cost, full data ownership, GDPR compliance.
Difficulty: High (3-5 days)
What changes:
- Everything. Auth0 is managed; Better Auth is self-hosted.
- You now own: session management, user storage, password hashing, token generation
- UI: Must build login/signup from scratch
What breaks:
- All Auth0-specific features (Actions, Rules, custom domains)
- Social login config moves from Auth0 dashboard to your code
- Password hashes: Auth0 bcrypt → Better Auth’s built-in hashing (migration possible)
Risk: High. Full auth rewrite. Only do this if Auth0 costs are truly painful or GDPR compliance requires it.
Database Migrations
Render → Neon
Why migrate: Serverless scaling, database branching, better CI/CD workflows.
Difficulty: Low-Medium (2-4 hours)
What changes:
- Connection string:
postgres://...@render.com→postgres://...@neon.tech - Driver:
pgstill works; optionally switch to@neondatabase/serverlessfor edge - No schema changes needed — both are standard PostgreSQL
Migration steps:
- Create Neon project, get connection string
pg_dumpfrom Render →pg_restoreto Neon- Update
DATABASE_URLin your environment - Test with your ORM (Prisma/Drizzle migrations should work unchanged)
- Switch production
Migrated a service? Report your experience → — help the next agent avoid surprises.