SendGrid to AWS SES Migration
Migrating from SendGrid to AWS SES: Complete Guide
Step-by-step guide for engineers migrating from SendGrid to AWS SES — including the pricing math, API mapping, unsubscribe handling, and reputation warming strategy you need before you flip the switch.
SendGrid is the default choice for teams that need email infrastructure fast. AWS SES is what teams move to when the SendGrid bill becomes hard to justify — especially once they are already running workloads on AWS. This guide covers everything an engineer or DevOps lead needs to execute the migration successfully.
## Related Comparisons
Explore other technical comparisons:
- [Mailgun to AWS SES](/compare/mailgun-to-aws-ses)
- [Postmark to AWS SES](/compare/postmark-to-aws-ses)
## Why Teams Migrate from SendGrid to SES
The primary driver is cost. At low volumes, the difference is modest. At scale, it is dramatic.
| Volume | SendGrid Essentials | AWS SES | Monthly Savings |
| ---------------- | ------------------- | ------------- | --------------- |
| 50,000 emails | $19.95/month | $5.00/month | $14.95 |
| 100,000 emails | $89.95/month | $10.00/month | $79.95 |
| 500,000 emails | $249/month (Pro) | $50.00/month | $199.00 |
| 1,000,000 emails | $449/month (Pro) | $100.00/month | $349.00 |
SES charges $0.10 per 1,000 emails. There is no monthly minimum, no plan tier, and no overage. If you are already on AWS, outbound email sent from EC2 or Lambda is free for the first 62,000 emails per month.
The secondary drivers are consolidation (fewer vendors, unified AWS billing) and tighter IAM-based access control.
## API Migration: SendGrid v3 → AWS SES
SendGrid's v3 API and AWS SES use different request models, but the conceptual mapping is direct.
| SendGrid v3 | AWS SES Equivalent | Notes |
| ------------------------------------ | ----------------------------------------------------- | -------------------------------------------- |
| `POST /v3/mail/send` | `SendEmail` API | Core send operation |
| `personalizations[]` | `Destinations[]` (bulk) or individual calls | SES `SendBulkEmail` for templated bulk sends |
| `from`, `to`, `subject`, `content` | `Message.Body`, `Destination`, `Source` | Same fields, different structure |
| API key header auth | IAM credentials or SES SMTP credentials | IAM is preferred for AWS-native apps |
| SMTP relay (host: smtp.sendgrid.net) | SMTP relay (host: email-smtp.us-east-1.amazonaws.com) | Port 587 (STARTTLS) or 465 (SSL) |
If your application uses SMTP rather than the REST API, the migration is a three-line config change: update the host, port, username, and password. SES SMTP credentials are generated in the SES console under SMTP Settings.
## Dynamic Templates vs SES Templates
This is the most significant feature gap. SendGrid Dynamic Templates offer a visual editor, Handlebars syntax with conditionals and loops, and per-template version history.
SES email templates support `{{variable}}` substitution and limited conditional blocks. There is no visual editor.
**Recommended migration approach:** move template rendering to your application code.
Libraries that work well:
- **MJML** — responsive email markup that compiles to HTML
- **React Email** — component-based email templates with JSX
- **Handlebars / Nunjucks** — logic-capable server-side templating
Render the HTML body in your application, then call `SES.sendEmail()` with the rendered content. This decouples template logic from your email provider, making future migrations trivial.
## Unsubscribe and Suppression List Migration
SendGrid manages suppression lists (unsubscribes, bounces, spam reports, invalid emails) automatically. SES requires you to build or integrate this logic.
**Steps:**
1. Export your SendGrid suppression lists (Global Unsubscribes, Bounces, Spam Reports, Invalid Emails) via the SendGrid UI or API
2. Upload hard bounces and spam reports to the SES account-level suppression list via the SES console or `PutSuppressedDestination` API
3. Configure an SNS topic as the event destination in a SES Configuration Set
4. Write a Lambda handler that receives bounce/complaint events and writes addresses to your suppression store (DynamoDB or RDS) and optionally to the SES account-level suppression list
SES's account-level suppression list handles hard bounces and complaints automatically across all sends once populated, but it does not provide a UI for end-user unsubscribe management. You need to implement that in your application if you send marketing or newsletter email.
## IP Warming Strategy
Both SendGrid and SES require IP warming when moving to a dedicated IP. If you are migrating to SES shared IP pools, warming is less critical but still advisable.
**SES dedicated IPs cost $24.95 per IP per month.** For most transactional senders under 500,000 emails/month, the shared IP pool is sufficient.
Warming schedule for a dedicated IP (approximate):
| Day Range | Daily Volume Cap | Rationale |
| ---------- | ------------------- | --------------------------------------------------------------- |
| Days 1–3 | 200 emails/day | Mailbox providers observe sender behavior; start conservatively |
| Days 4–6 | 500 emails/day | Gradual increase; mailbox providers building reputation profile |
| Days 7–9 | 1,000 emails/day | Consistent sending establishes trust |
| Days 10–12 | 2,000 emails/day | Continue gradual ramp |
| Days 13–15 | 5,000 emails/day | Halfway through warming period |
| Days 16–18 | 10,000 emails/day | Reputation is building; can accelerate |
| Days 19–21 | 20,000 emails/day | Final ramping phase |
| Days 22–24 | 50,000 emails/day | Approaching full volume |
| Days 25–27 | 100,000 emails/day | Nearly at target |
| Days 28–30 | Full sending volume | Reputation established; send at full capacity |
**Critical metrics during warming:** Monitor bounce rate (keep below 2%) and complaint rate (keep below 0.1%). One complaint per 1,000 emails is typical; higher signals list quality issues.
## Why Choose FactualMinds for Your Email Migration
FactualMinds is an **AWS Select Tier Consulting Partner** specializing in email infrastructure migration. We have executed SendGrid, Mailgun, Postmark, and SparkPost to AWS SES migrations and know exactly where teams get stuck.
- **Email migration experts** — we handle domain verification, DKIM, bounce architecture, IP warming
- **Assessment-first approach** — we map your current state before writing a line of infrastructure code
- **Zero-downtime cutover planning included** — no failed deliveries during migration
- **AWS Select Tier Partner** — [verified on AWS Partner Network](https://partners.amazonaws.com/partners/001aq000008su2EAAQ/Factual%20Minds)
---SendGrid is the default choice for teams that need email infrastructure fast. AWS SES is what teams move to when the SendGrid bill becomes hard to justify — especially once they are already running workloads on AWS. This guide covers everything an engineer or DevOps lead needs to execute the migration successfully.
Related Comparisons
Explore other technical comparisons:
Why Teams Migrate from SendGrid to SES
The primary driver is cost. At low volumes, the difference is modest. At scale, it is dramatic.
| Volume | SendGrid Essentials | AWS SES | Monthly Savings |
|---|---|---|---|
| 50,000 emails | $19.95/month | $5.00/month | $14.95 |
| 100,000 emails | $89.95/month | $10.00/month | $79.95 |
| 500,000 emails | $249/month (Pro) | $50.00/month | $199.00 |
| 1,000,000 emails | $449/month (Pro) | $100.00/month | $349.00 |
SES charges $0.10 per 1,000 emails. There is no monthly minimum, no plan tier, and no overage. If you are already on AWS, outbound email sent from EC2 or Lambda is free for the first 62,000 emails per month.
The secondary drivers are consolidation (fewer vendors, unified AWS billing) and tighter IAM-based access control.
API Migration: SendGrid v3 → AWS SES
SendGrid’s v3 API and AWS SES use different request models, but the conceptual mapping is direct.
| SendGrid v3 | AWS SES Equivalent | Notes |
|---|---|---|
POST /v3/mail/send | SendEmail API | Core send operation |
personalizations[] | Destinations[] (bulk) or individual calls | SES SendBulkEmail for templated bulk sends |
from, to, subject, content | Message.Body, Destination, Source | Same fields, different structure |
| API key header auth | IAM credentials or SES SMTP credentials | IAM is preferred for AWS-native apps |
| SMTP relay (host: smtp.sendgrid.net) | SMTP relay (host: email-smtp.us-east-1.amazonaws.com) | Port 587 (STARTTLS) or 465 (SSL) |
If your application uses SMTP rather than the REST API, the migration is a three-line config change: update the host, port, username, and password. SES SMTP credentials are generated in the SES console under SMTP Settings.
Dynamic Templates vs SES Templates
This is the most significant feature gap. SendGrid Dynamic Templates offer a visual editor, Handlebars syntax with conditionals and loops, and per-template version history.
SES email templates support {{variable}} substitution and limited conditional blocks. There is no visual editor.
Recommended migration approach: move template rendering to your application code.
Libraries that work well:
- MJML — responsive email markup that compiles to HTML
- React Email — component-based email templates with JSX
- Handlebars / Nunjucks — logic-capable server-side templating
Render the HTML body in your application, then call SES.sendEmail() with the rendered content. This decouples template logic from your email provider, making future migrations trivial.
Unsubscribe and Suppression List Migration
SendGrid manages suppression lists (unsubscribes, bounces, spam reports, invalid emails) automatically. SES requires you to build or integrate this logic.
Steps:
- Export your SendGrid suppression lists (Global Unsubscribes, Bounces, Spam Reports, Invalid Emails) via the SendGrid UI or API
- Upload hard bounces and spam reports to the SES account-level suppression list via the SES console or
PutSuppressedDestinationAPI - Configure an SNS topic as the event destination in a SES Configuration Set
- Write a Lambda handler that receives bounce/complaint events and writes addresses to your suppression store (DynamoDB or RDS) and optionally to the SES account-level suppression list
SES’s account-level suppression list handles hard bounces and complaints automatically across all sends once populated, but it does not provide a UI for end-user unsubscribe management. You need to implement that in your application if you send marketing or newsletter email.
IP Warming Strategy
Both SendGrid and SES require IP warming when moving to a dedicated IP. If you are migrating to SES shared IP pools, warming is less critical but still advisable.
SES dedicated IPs cost $24.95 per IP per month. For most transactional senders under 500,000 emails/month, the shared IP pool is sufficient.
Warming schedule for a dedicated IP (approximate):
| Day Range | Daily Volume Cap | Rationale |
|---|---|---|
| Days 1–3 | 200 emails/day | Mailbox providers observe sender behavior; start conservatively |
| Days 4–6 | 500 emails/day | Gradual increase; mailbox providers building reputation profile |
| Days 7–9 | 1,000 emails/day | Consistent sending establishes trust |
| Days 10–12 | 2,000 emails/day | Continue gradual ramp |
| Days 13–15 | 5,000 emails/day | Halfway through warming period |
| Days 16–18 | 10,000 emails/day | Reputation is building; can accelerate |
| Days 19–21 | 20,000 emails/day | Final ramping phase |
| Days 22–24 | 50,000 emails/day | Approaching full volume |
| Days 25–27 | 100,000 emails/day | Nearly at target |
| Days 28–30 | Full sending volume | Reputation established; send at full capacity |
Critical metrics during warming: Monitor bounce rate (keep below 2%) and complaint rate (keep below 0.1%). One complaint per 1,000 emails is typical; higher signals list quality issues.
Why Choose FactualMinds for Your Email Migration
FactualMinds is an AWS Select Tier Consulting Partner specializing in email infrastructure migration. We have executed SendGrid, Mailgun, Postmark, and SparkPost to AWS SES migrations and know exactly where teams get stuck.
- Email migration experts — we handle domain verification, DKIM, bounce architecture, IP warming
- Assessment-first approach — we map your current state before writing a line of infrastructure code
- Zero-downtime cutover planning included — no failed deliveries during migration
- AWS Select Tier Partner — verified on AWS Partner Network
Frequently Asked Questions
Is AWS SES better than SendGrid?
How long does it take to migrate from SendGrid to SES?
Does AWS SES have email templates?
How do I handle bounces in AWS SES?
Is AWS SES cheaper than SendGrid?
Need Help Migrating to AWS SES?
FactualMinds is an AWS Select Tier Partner specializing in email infrastructure migration. We handle domain verification, Configuration Set architecture, bounce handling, IP warming, and cutover.
