<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Twinkal</title>
    <description>The latest articles on DEV Community by Twinkal (@twinkalp10).</description>
    <link>https://dev.to/twinkalp10</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4034756%2F949e1d72-1590-4df5-a301-659aff709dd2.png</url>
      <title>DEV Community: Twinkal</title>
      <link>https://dev.to/twinkalp10</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/twinkalp10"/>
    <language>en</language>
    <item>
      <title>The Hidden Cost of Saving $1000/Month: Our AWS SES Migration Story</title>
      <dc:creator>Twinkal</dc:creator>
      <pubDate>Sat, 18 Jul 2026 06:02:03 +0000</pubDate>
      <link>https://dev.to/twinkalp10/the-hidden-cost-of-saving-1000month-our-aws-ses-migration-story-5fbn</link>
      <guid>https://dev.to/twinkalp10/the-hidden-cost-of-saving-1000month-our-aws-ses-migration-story-5fbn</guid>
      <description>&lt;p&gt;&lt;strong&gt;4:00 PM on a Friday&lt;/strong&gt;, a ticket came in from our highest-paying customer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"None of our staff are receiving your system alerts."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I opened the &lt;strong&gt;AWS SES&lt;/strong&gt; console expecting a quick answer.&lt;/p&gt;

&lt;p&gt;Instead: &lt;strong&gt;no dashboard, no way to search &lt;code&gt;admin@enterprise-client.com&lt;/code&gt;&lt;/strong&gt;, just a line graph showing &lt;strong&gt;14,000 emails sent, 200 bounced&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;No idea &lt;strong&gt;which 200&lt;/strong&gt;, or &lt;strong&gt;why&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The cause turned out to be an &lt;strong&gt;SPF record&lt;/strong&gt; that no longer matched our sending setup after a domain migration weeks earlier. Nothing alerted us—we found it by opening bounces one at a time and reading raw headers in the console.&lt;/p&gt;

&lt;p&gt;That afternoon is when it clicked:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;SES is a sending engine, not a platform.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The cheap price tag doesn't include visibility.&lt;/p&gt;

&lt;p&gt;You have to build that yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  What SES actually gave us
&lt;/h2&gt;

&lt;p&gt;SES did exactly what it's designed to do.&lt;/p&gt;

&lt;p&gt;It accepted mail, attempted delivery, and charged roughly &lt;strong&gt;$1 per 10,000 emails&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Against providers like &lt;strong&gt;SendGrid&lt;/strong&gt; or &lt;strong&gt;Resend&lt;/strong&gt;, that can easily look like &lt;strong&gt;hundreds of dollars per month saved&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;What it &lt;strong&gt;didn't&lt;/strong&gt; give us out of the box:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A way to look up one recipient and see what happened to their message.&lt;/li&gt;
&lt;li&gt;Bounce reasons in a form support could use without reading SMTP headers.&lt;/li&gt;
&lt;li&gt;Events we could act on without wiring AWS plumbing first.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bounce and complaint data exists in SES—but it shows up as notifications you route through &lt;strong&gt;SNS&lt;/strong&gt;, often into &lt;strong&gt;SQS&lt;/strong&gt;, then into a &lt;strong&gt;Lambda&lt;/strong&gt; (or similar) before you have anything resembling a searchable delivery log.&lt;/p&gt;

&lt;p&gt;Want support to answer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Did this email bounce?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You'll need to build an internal UI on top of that pipeline.&lt;/p&gt;

&lt;p&gt;That's real engineering time spent recreating a feature most email products ship by default.&lt;/p&gt;

&lt;p&gt;None of this makes SES a bad product.&lt;/p&gt;

&lt;p&gt;It makes it a &lt;strong&gt;different product&lt;/strong&gt; than the one we thought we were buying when we optimized for the invoice line.&lt;/p&gt;

&lt;h2&gt;
  
  
  The middle option isn't free either
&lt;/h2&gt;

&lt;p&gt;Managed providers like &lt;strong&gt;SendGrid&lt;/strong&gt;, &lt;strong&gt;Postmark&lt;/strong&gt;, &lt;strong&gt;Loops&lt;/strong&gt;, or &lt;strong&gt;Resend&lt;/strong&gt; solve the Friday afternoon problem.&lt;/p&gt;

&lt;p&gt;You can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Search a recipient&lt;/li&gt;
&lt;li&gt;Open a message&lt;/li&gt;
&lt;li&gt;See a bounce reason&lt;/li&gt;
&lt;li&gt;Subscribe to webhooks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;...without standing up an event bus inside your AWS account.&lt;/p&gt;

&lt;p&gt;They also come with two trade-offs that mattered for us:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pricing that scales with volume—fine early, painful when send volume is part of the product.&lt;/li&gt;
&lt;li&gt;Your users' email data lives on someone else's servers—acceptable for many apps, but a real constraint in healthcare, finance, or anywhere with data-residency requirements.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We didn't want &lt;strong&gt;"cheaper SES."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We wanted the investigation experience of a managed provider &lt;strong&gt;on infrastructure we controlled.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's what &lt;strong&gt;Reloop&lt;/strong&gt; is built to be.&lt;/p&gt;

&lt;h2&gt;
  
  
  What that Friday actually taught us
&lt;/h2&gt;

&lt;p&gt;It's tempting to rewrite this story as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"If only we'd had better monitoring, the SPF drift would never have hurt a customer."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's not quite true.&lt;/p&gt;

&lt;p&gt;And it's not a claim we'll make about Reloop either.&lt;/p&gt;

&lt;p&gt;DNS changes are an operations problem.&lt;/p&gt;

&lt;p&gt;After a migration, someone has to re-check that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SPF&lt;/li&gt;
&lt;li&gt;DKIM&lt;/li&gt;
&lt;li&gt;DMARC&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;still match.&lt;/p&gt;

&lt;p&gt;No platform pages you the week that drifts on its own.&lt;/p&gt;

&lt;p&gt;The honest lesson from that Friday was narrower—and more useful.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;When delivery fails, you should find out why in a few clicks—not spend an hour digging through AWS consoles.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We needed to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Search a recipient&lt;/li&gt;
&lt;li&gt;Open the message&lt;/li&gt;
&lt;li&gt;Read a clear bounce reason&lt;/li&gt;
&lt;li&gt;Move on to the DNS fix&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;SES made the first half of that afternoon expensive.&lt;/p&gt;

&lt;p&gt;The SPF mismatch was the root cause.&lt;/p&gt;

&lt;p&gt;The missing platform layer is what turned it into a fire drill.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we built
&lt;/h2&gt;

&lt;p&gt;That gap is why we built &lt;strong&gt;&lt;a href="https://reloop.sh/" rel="noopener noreferrer"&gt;Reloop&lt;/a&gt;&lt;/strong&gt;—open-source email infrastructure you can self-host with Docker or Kubernetes, or run with us.&lt;/p&gt;

&lt;p&gt;For the SES pain specifically, Reloop gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Delivery logs you can actually use—open a message, see status, bounce classification, and headers without digging through AWS consoles.&lt;/li&gt;
&lt;li&gt;Recipient and contact activity—answer &lt;em&gt;"What happened for this address?"&lt;/em&gt; without writing a custom lookup service.&lt;/li&gt;
&lt;li&gt;HTTP webhooks for sent, delivered, bounced, delayed, and complained—one endpoint instead of SNS → SQS → Lambda.&lt;/li&gt;
&lt;li&gt;Domain DNS setup and verification for SPF, DKIM, and DMARC, so after a migration you can quickly re-check the records that broke us.&lt;/li&gt;
&lt;li&gt;Your data on &lt;strong&gt;your servers&lt;/strong&gt; when you self-host—the same product shape, without a third-party mailbox for transactional content.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We're not claiming Reloop would have magically prevented that customer's outage.&lt;/p&gt;

&lt;p&gt;We're claiming the investigation shouldn't have required &lt;strong&gt;raw header archaeology&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Owning the stack shouldn't mean rebuilding a dashboard from scratch.&lt;/p&gt;

&lt;h2&gt;
  
  
  The trade-off
&lt;/h2&gt;

&lt;p&gt;SES is cheap and opaque until you build the missing pieces.&lt;/p&gt;

&lt;p&gt;Managed providers are visible and convenient until volume pricing or data residency gets in the way.&lt;/p&gt;

&lt;p&gt;Self-hosting trades the per-email bill for operational ownership.&lt;/p&gt;

&lt;p&gt;You're on call for your own email infrastructure.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Queues&lt;/li&gt;
&lt;li&gt;DNS&lt;/li&gt;
&lt;li&gt;Deliverability&lt;/li&gt;
&lt;li&gt;Upgrades&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those become yours.&lt;/p&gt;

&lt;p&gt;If that trade fits your team, check out the &lt;strong&gt;&lt;a href="https://github.com/reloop-labs/reloop" rel="noopener noreferrer"&gt;Reloop GitHub repository&lt;/a&gt;&lt;/strong&gt; setup docs.&lt;/p&gt;

&lt;p&gt;If it doesn't, use a managed provider.&lt;/p&gt;

&lt;p&gt;The Friday ticket is still a useful warning either way.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Optimize for the invoice, and you may end up paying in engineering hours and customer trust instead.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Go on, send that email.
&lt;/h2&gt;

&lt;p&gt;→ &lt;strong&gt;&lt;a href="https://reloop.sh/" rel="noopener noreferrer"&gt;Try Reloop&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>devops</category>
      <category>infrastructure</category>
      <category>monitoring</category>
    </item>
  </channel>
</rss>
