Use when migrating SendGrid email integration to Resend - detects @sendgrid/mail, sgMail, sendgrid-ruby, sendgrid-go, sendgrid-java, sendgrid-php, or SENDGRID_API_KEY patterns.
Resend is a modern email platform for developers. This skill covers migrating SendGrid integrations to Resend across all supported SDKs.
Automated tool: resend.com/migrate/sendgrid — paste SendGrid code and get Resend code instantly.
Code is SendGrid if it contains any of: @sendgrid/mail, sendgrid, SendGrid, SENDGRID, sgMail, sg.client, sendgrid-ruby, sendgrid-go, sendgrid-java, sendgrid-php
SENDGRID_API_KEY → RESEND_API_KEY| Aspect | SendGrid | Resend |
|---|---|---|
| API endpoint | https://api.sendgrid.com/v3/mail/send | https://api.resend.com/emails |
| Auth header | Authorization: Bearer $SENDGRID_API_KEY | Authorization: Bearer $RESEND_API_KEY |
| Batch send | sgMail.sendMultiple() | resend.batch.send() |
| Response | [response, body] | { data, error } |
| Idempotency | Not supported | Idempotency-Key header or SDK option |
| Rate limit info | Error only | IETF-standard response headers |
| Rust SDK | No official SDK | resend-rs available |
| Templates | Dynamic templates (templateId) | React Email components or html |
| Tracking | Per-email trackingSettings | Configured per-domain in dashboard |
| Unsubscribe groups | asm field | Resend Topics (topic_id) |
| IP pools | ipPoolName field | Account-level in dashboard |
| Reference | Use When |
|---|---|
| SDK Examples | Converting code for Node.js, Python, Ruby, Go, PHP, Java, .NET, Elixir, cURL |
| SMTP | Updating SMTP hostname, port, credentials |
| Webhooks | Mapping SendGrid event types to Resend event types |
| Feature Mapping | Templates, tracking, unsubscribe groups, idempotency |
| SendGrid | Resend |
|---|---|
| Sender Authentication | Domains page |
| Activity | Emails page |
| Dashboard (stats) | Metrics page |
| Event Webhook | Webhooks page |
| Mistake | Fix |
|---|---|
asm has "no equivalent" in Resend | It does — use topic_id field + Resend Topics. See Feature Mapping |
Webhook unsubscribe maps to email.unsubscribed | That event doesn't exist. Use contact.updated. See Webhooks |
sendAt: unixTimestamp copied over | Resend uses ISO 8601 string: scheduledAt: new Date(...).toISOString() |
Expecting [response, body] from resend.emails.send() | Resend returns { data, error } |
| Looking for a CLI migration tool | The tool is a web UI: resend.com/migrate/sendgrid — no CLI |
sgMail.sendMultiple() replaced by passing array to to field | Wrong — to array sends one email to multiple recipients. resend.batch.send() sends multiple different emails in one call |
dropped SendGrid event has no Resend equivalent | Monitor email.bounced and email.delivery_delayed instead. See Webhooks |
| Resend SMTP only supports ports 465 and 587 | Resend also supports 2465 (SMTPS) and 2587 (STARTTLS) as alternatives. See SMTP |
| Forgot to rename env var | SENDGRID_API_KEY → RESEND_API_KEY |