Saying goodbye to Sendgrid

Published: Sep 9, 2025 by Isaac Johnson

It is indeed a sad day for me. Sendgrid, which was an amazing email tool that always had a free tier since it pretty much started in 2009 lasted until 2019 when Twilio bought them.

It seemed like it would be left alone but now this week they finally sunset the free tier I had used for ages to handle build notifications and alerts; basically anything low volume and light duty.

They announced in May they would do away with the free plan and now it has come to pass.

/content/images/2025/09/sendgrid-01.png

In this post we will look at AWS’s Simple Email Service (SES) as a viable alternative, testing both CLI and SMTP uses. We will revisit Resend and talk about next steps.

Let’s get into AWS first…

AWS SES

My “other” solution has always been AWS Simple Email Service (SES) which has generous free tier.

The first thing we need to sort out is our destination server. We can look up the SMTP Endpoints

/content/images/2025/09/sendgrid-02.png

I’ll now hop in to the AWS Console and go to the Simple Email Service page (SES). We can see we have some spending limits which I would want (since I’m not a spammer)

/content/images/2025/09/sendgrid-03.png

If this is your first time through, you will likely need to create identities to send from (or as). This is how AWS makes sure you are not spoofing someone else

/content/images/2025/09/sendgrid-04.png

Our next step is to head to the “SMTP settings” where we will see our actual endpoint and from there can manage credentials

/content/images/2025/09/sendgrid-05.png

I have an IAM user already setup here we can use. (You can follow my original guide here to do that) What is important to apply are the predefined SES Sending Access permission policy

/content/images/2025/09/sendgrid-06.png

You’ll also need a credential (you can only have two which is why mine is greyed out)

/content/images/2025/09/sendgrid-07.png

AWS CLI

Let’s test our credentials, first with the AWS CLI. I’ll need a destination JSON and message JSON to use

builder@DESKTOP-QADGF36:~/Workspaces/sgtoses$ cat ./destination.json
{
   "ToAddresses": ["isaac.johnson@gmail.com"],
   "CcAddresses": [],
   "BccAddresses": []
}
builder@DESKTOP-QADGF36:~/Workspaces/sgtoses$ cat ./message.json
{
   "Subject": {
       "Data": "My test email sent using SES",
       "Charset": "UTF-8"
   },
   "Body": {
       "Text": {
           "Data": "You are getting this from AWS CLI ses",
           "Charset": "UTF-8"
       },
       "Html": {
           "Data": "<H1>You are getting this from AWS CLI ses</H1><p>confirm</p>",
           "Charset": "UTF-8"
       }
   }
}

I want to make sure I am definitely using the Access Key and Secret (and not just with whatever I last logged into AWS locally) so I’ll pass those in to the command:

$ AWS_ACCESS_KEY_ID=AKIAXXXXXXXXXXXXXXXQ AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXXXXXX aws ses send-email --from isaac@freshbrewed.science --destination file://destination.json --message file://message.json
{
    "MessageId": "010001992e2d1b4a-64684ac7-a0dc-4943-88f2-8ed3dac65986-000000"
}

I can confirm reciept

/content/images/2025/09/sendgrid-08.png

SMTP

I now need a service that used Sendgrid to try swapping out. One of those is Beszel for monitoring

We can see my active Beszel uses Sendgrid presently

/content/images/2025/09/sendgrid-09.png

I was a bit thrown by the username/password so I created a fresh credential to verify that indeed the username is the Access Key and the password is the Access Secret

/content/images/2025/09/sendgrid-10.png

I’ll update those settings

/content/images/2025/09/sendgrid-11.png

then send a test message

/content/images/2025/09/sendgrid-12.png

which worked fine (when I used the newer credential)

/content/images/2025/09/sendgrid-13.png

Paying for Sendgrid

Here is where I think Sendgrid is being a bit unfair.

They went from a free tier that many small developers and teams used to a minimum spend of US$20/mo - for emails.

/content/images/2025/09/sendgrid-14.png

Resend

It is worth bringing up Resend which does not provide SMTP support, but does have programmatic support for sending emails.

We covered it back in 2023.

We can create (or use existing) API keys

/content/images/2025/09/sendgrid-15.png

Which I can then use as a Bearer token in an a curl call

$ curl -X POST 'https://api.resend.com/emails' \
> -H 'Authorization: Bearer re_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Content-Type: application/json' \
  -d $'{
    "from": "onboarding@resend.dev",
    "to": "isaac.johnson@gmail.com",
    "subject": "Hello World",
    "html": "Trying Resend again"
  }'
{"id":"b17c22d5-2dcd-40ff-a803-3b892dec6707"}

Which sent just fine

/content/images/2025/09/sendgrid-16.png

Resend, I can confirm, still has a reasonable free tier

/content/images/2025/09/sendgrid-17.png

And similar paid options to Sendgrid

/content/images/2025/09/sendgrid-18.png

Summary

There are actually quite a few options out there. Others we could explore include Mailgun and Brevo (I would have included Postmark, but they did away with their free tier as well).

There is an obvious solution as well - just use your actual email account. For Google’s GMail, you just need to create an app password which can then be used to send via smtp.gmail.com on 587

/content/images/2025/09/sendgrid-19.png

I did this last year with Zulip.

In the end, I’ll miss Sendgrid - it was a great service. And perhaps if you are already in the full Twilio ecosystem, paying for it makes sense. But for me, I’ll just move my workloads to SES, Resend and Gmail SMTP.

sendgrid emails resend aws ses smtp

Have something to add? Feedback? You can use the feedback form

Isaac Johnson

Isaac Johnson

Cloud Solutions Architect

Isaac is a CSA and DevOps engineer who focuses on cloud migrations and devops processes. He also is a dad to three wonderful daughters (hence the references to Princess King sprinkled throughout the blog).

Theme built by C.S. Rhymes