All posts Deliverability

The hidden cost of DIY transactional email

The real cost of running your own transactional email stack: deliverability drift, no delivery logs, on-call time spent on bounces and blocklists, and template changes that require a deploy. What DIY actually costs beyond infrastructure, and what a managed alternative replaces.

Erik Vlčák
Erik Vlčák
Customer Success Engineer
5 min read

Most products send their first transactional emails the cheap way: an SMTP server or a provider API wired straight into the app, with authentication, deliverability, logging, and templates all handled in-house. The sending itself stays cheap, but the work that grows up around it is where the real cost hides, and that cost almost never shows up on a budget. It surfaces instead as recurring engineering hours: chasing deliverability drift, debugging bounces, and shipping a deploy every time a template changes.

What it costs on day one

The obvious cost is infrastructure: a sending service, a couple of DNS records, and maybe a queue worker. In any modern framework the actual send is a handful of chained method calls, and it stays that small no matter how the product grows:

app/Notifications/WelcomeMail.php
use Lettr\Laravel\Facades\Lettr;

Lettr::to($user->email)
    ->template('welcome')
    ->with(['name' => $user->name])
    ->send();

That snippet never gets more complicated. Everything around it does: the authentication, sender reputation, delivery logging, and template maintenance that the application needs once it is sending real volume to real recipients, none of which a setup tutorial covers.

What it costs in the long run

That surrounding work shows up as unplanned engineering hours. None of it is hard in isolation, but it recurs, never makes the roadmap, and tends to land on whoever is on call. Four costs account for most of it:

  • Deliverability drift. Open rates fall as sender reputation erodes, and the decline goes unnoticed until a customer reports a missing email.
  • No visibility. A disputed password reset has no log to check and no way to prove whether it was sent or delivered.
  • On-call tax. Bounces, blocklists, and DNS misconfigurations turn into pages for engineers who should be shipping features.
  • Template sprawl. Every email lives in a different Blade file, so changing a footer requires a deploy.

Make email observable and maintainable

The durable fix is to give transactional email the same visibility and tooling as any other part of the application: a record of what happened to each message, alerts when something degrades, and templates that can change without a deploy. That generally matters more than hiring a dedicated email-ops engineer.

In practice that means delivery logs that are actually searchable, alerts when open rates drop before customers complain, and templates a marketing team can edit without filing a dev ticket. Authentication and warmup should be handled by the platform, not assembled by hand from a dozen Stack Overflow answers.

When DIY is the right call

Rolling your own is not always the wrong choice. At low and predictable volume, a handful of internal notifications a day where nobody outside the team ever waits on the message, the maintenance burden is small and a managed platform buys little. The same is true for throwaway prototypes that may never reach real users.

The calculation changes once an email becomes something a customer is actively waiting for: a password reset, a receipt, a login code. Silent spam placement on those messages costs support time and sometimes revenue, and diagnosing the cause without delivery logs quickly outweighs the price of the sending service itself.

FAQ

Isn't sending email yourself cheaper than a managed platform?
The infrastructure is cheaper; the engineering work around it usually is not. The send itself stays a handful of method calls, but authentication, reputation, delivery logging, and template maintenance turn into recurring hours that never make the roadmap. Those scattered hours are the real cost, and they rarely appear on a budget.
What actually breaks when you run transactional email in-house?
The common failures are deliverability drift, no delivery logs, on-call bounce and blocklist handling, and templates gated behind a deploy. None is hard alone, but each recurs and tends to land on whoever is on call. Deliverability drift is the quietest: open rates fall as reputation erodes, often unnoticed until a customer reports a missing email.
When is rolling your own transactional email the right call?
At low, predictable volume where nobody outside the team waits on the message, or for throwaway prototypes. The maintenance burden is small there and a managed platform buys little. The calculation changes once a customer is actively waiting on a password reset, receipt, or login code, where silent spam placement costs support time and revenue.
What does a managed platform actually replace?
The surrounding work: authentication and warm-up, searchable delivery logs, alerts when open rates drop, and templates that change without a deploy. The goal is visibility, being able to answer "did it arrive, and if not, why?" for every message, rather than assembling the answer by hand from a dozen Stack Overflow threads.

Bottom line

DIY transactional email usually persists as an unrevisited default, and the case for changing it rarely comes from a single dramatic failure. It comes from adding up the scattered hours already spent on it and asking whether that time is better spent elsewhere.

That is the problem we built Lettr's transactional email to solve: one platform for transactional and marketing email, with the deliverability work handled and a clear view of everything the application sends. See the pay-per-email pricing.