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.

Why Teams Migrate from SendGrid to SES

The primary driver is cost. At low volumes, the difference is modest. At scale, it is dramatic.

VolumeSendGrid EssentialsAWS SESMonthly 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 v3AWS SES EquivalentNotes
POST /v3/mail/sendSendEmail APICore send operation
personalizations[]Destinations[] (bulk) or individual callsSES SendBulkEmail for templated bulk sends
from, to, subject, contentMessage.Body, Destination, SourceSame fields, different structure
API key header authIAM credentials or SES SMTP credentialsIAM 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:

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 RangeDaily Volume Cap
Days 1–5200–500
Days 6–101,000–2,000
Days 11–205,000–10,000
Days 21–3025,000–50,000
Day 30+Full volume

During warming, continue sending from SendGrid for the remaining volume. Monitor your SES reputation dashboard and SNS bounce/complaint notifications daily.

Deliverability: Feedback Loops

SendGrid participates in ISP feedback loop (FBL) programs and surfaces complaint rates in its UI. SES receives complaint notifications from ISPs (primarily Gmail, Yahoo, AOL, Comcast) via its complaint processing pipeline and forwards them to SNS. The coverage is similar — both platforms receive the same underlying FBL data. The difference is in the UI: SendGrid surfaces aggregate complaint rates per campaign; SES exposes raw per-event SNS messages that you aggregate yourself.

Migration Steps

  1. Verify your sending domain in SES (add DKIM CNAME records and optional MAIL FROM MX record)
  2. Request SES production access (exits sandbox — requires AWS support case with estimated volume and use case)
  3. Create a Configuration Set with SNS event destinations for bounces, complaints, and deliveries
  4. Generate SES SMTP credentials or configure IAM access for your application
  5. Update application config to point at SES SMTP endpoint or update SDK calls to use SES SDK
  6. Export SendGrid suppression lists and import into SES account-level suppression list
  7. Implement bounce/complaint SNS handler (Lambda recommended)
  8. Begin IP warming on SES while maintaining SendGrid as fallback
  9. Gradually shift traffic to SES (10% → 25% → 50% → 100%) over 2–4 weeks
  10. Cancel SendGrid plan once SES is stable at full volume

Where SendGrid Still Wins

Be honest about the trade-offs before committing to the migration:

When SES is the Clear Choice

SES wins decisively when:

Get Help with Your Migration

FactualMinds is an AWS Select Tier Consulting Partner specializing in AWS messaging infrastructure. Our AWS SES consulting service covers domain verification, Configuration Set design, bounce/complaint handling architecture, IP warming strategy, and application-level migration support. Contact us to scope your SendGrid to SES migration.

Frequently Asked Questions

Is AWS SES better than SendGrid?

It depends on your requirements. AWS SES is significantly cheaper at volume — $0.10 per 1,000 emails versus SendGrid Essentials at roughly $0.40 per 1,000 at the 50K tier. SES wins on cost and AWS-native integration. SendGrid wins on out-of-the-box deliverability tooling, a richer template editor, and per-message engagement analytics. If you send more than 50,000 emails per month and are already on AWS, SES almost always makes economic sense. If deliverability debugging and template management are business-critical and your team lacks AWS expertise, SendGrid's higher price may be justified.

How long does it take to migrate from SendGrid to SES?

A straightforward migration — single domain, transactional email only, SMTP relay swap — can be completed in one to two days. A full migration including custom dedicated IPs, template conversion, suppression list import, SNS-based bounce handling, and IP warming takes two to four weeks. The warm-up period for a dedicated IP is typically 30 days of gradually increasing volume before you can send at full capacity. Plan for parallel sending during the warm-up to avoid deliverability regression.

Does AWS SES have email templates?

Yes, but with significant limitations compared to SendGrid. SES templates support simple variable substitution using {{variable}} syntax and basic conditional blocks, but lack the drag-and-drop editor, design components, and rich conditional logic of SendGrid Dynamic Templates. Most teams migrating from SendGrid move template rendering to application code — using libraries like MJML, React Email, or Handlebars — and send the pre-rendered HTML body to SES. This gives you more control and removes the dependency on the ESP template system entirely.

How do I handle bounces in AWS SES?

SES delivers bounce and complaint notifications through Amazon SNS. You configure a Configuration Set with an SNS event destination, then subscribe a Lambda function or HTTP endpoint to the SNS topic. Your handler receives JSON payloads for bounces (hard and soft), complaints, and deliveries. You are responsible for maintaining your own suppression logic — adding hard-bounce addresses and complaint addresses to a do-not-send list and never retrying them. SES also has an account-level suppression list that automatically blocks future sends to addresses that have hard-bounced or complained across any SES customer.

Is AWS SES cheaper than SendGrid?

Yes, substantially. At 50,000 emails per month, SendGrid Essentials costs $19.95 versus $5.00 on SES. At 100,000 emails per month, SendGrid Essentials costs $89.95 versus $10.00 on SES. At 1,000,000 emails per month, SendGrid Pro costs $449 versus $100 on SES. The savings compound quickly. The only cost scenarios where they converge are very low volumes (under 10,000 emails per month, where SendGrid Free tier applies) or if you need dedicated IPs on SES ($24.95 per IP per month) and SendGrid shared IPs serve your deliverability needs adequately.

Need Help Choosing the Right Cloud Platform?

Our AWS-certified architects help you evaluate cloud platforms based on your specific requirements, workloads, and business goals.