Use case · Amazon SES
Amazon SES email templates, with an editor.
SES is a great sender with a bare template API: JSON in, no editor, one copy per region. Senlo is the editor and the template store on top. Build templates visually, call one endpoint, and the email still goes out through your SES account.
The editor SES doesn't have
Drag rows and blocks, add merge tags and conditions, preview with real data. Save, and the next send uses it.
No HTML inside JSON
Templates live in Senlo, not in SES: no escaped one-line HTML, no per-region copies, no 20,000-template ceiling, nothing to sync between accounts.
SES still sends
Senlo connects to your SES account and hands it the finished message. Domain, reputation, limits and the $0.10 per 1,000 rate stay yours.
Before and after
The same personalized email, created and sent the SES way and the Senlo way.
# template.json: HTML escaped into one line, no line breaks allowed
{ "Template": {
"TemplateName": "Welcome",
"SubjectPart": "Welcome, {{name}}",
"HtmlPart": "<h1>Hi {{name}}</h1><p><a href=\"https://app.example.com/start?id={{id}}\">Get started</a></p>",
"TextPart": "Hi {{name}},\nGet started: https://app.example.com/start"
} }
aws ses create-template --cli-input-json file://template.json
# data is an escaped JSON string inside JSON
aws sesv2 send-email --content '{"Template":{"TemplateName":"Welcome","TemplateData":"{\"name\":\"Ana\",\"id\":\"42\"}"}}' ...# the template lives in Senlo; SES delivers
curl -X POST https://senlo.io/api/triggered \
-H "Authorization: Bearer snl_..." \
-H "Content-Type: application/json" \
-d '{
"id": "welcome",
"to": "ana@example.com",
"data": { "name": "Ana", "id": "42" }
}'SES templates and Senlo, feature by feature
| Feature | Senlo | SES templates |
|---|---|---|
Visual editor SES templates are created and changed through the API or CLI. | ||
Preview with real data SES's TestRenderEmailTemplate returns the raw MIME message, at most once a second. | ||
Version history and rollback SES's UpdateEmailTemplate overwrites the template in place. Senlo has undo and redo while you edit; saved versions are on the roadmap. | ||
Merge values HTML-escaped SES does not escape HTML when it renders a template. | ||
Conditions and lists from your data SES supports a subset of Handlebars. | ||
Reusable rows across templates SES has inline partials inside one template part, nothing shared between templates. | ||
Same templates in every region and account SES stores templates per region, up to 20,000 each. | ||
Editable by people who don't write code | ||
Sequences: event triggers, waits and branches |
From the SES developer guide and quotas, checked 2026-11-02.
Connect SES in four steps
- 1
Verify your domain in SES
If it is not already: the domain identity and its DKIM records, in the region you send from.
- 2
Create SMTP credentials
In the SES console, under SMTP settings. Note the endpoint,
email-smtp.<region>.amazonaws.com, port 587. - 3
Add an SMTP provider in Senlo
Paste the endpoint, port, username and password on the Providers page and send a test email.
- 4
Build and send
Create the template in the editor, then call POST /api/triggered with its id, the recipient and the data.
What to know before you start
Works today
- Sending through SES's SMTP interface, from any region.
- Opens and clicks, tracked by Senlo itself.
- List-Unsubscribe headers and an unsubscribe page.
- Automations that send through SES like any other provider.
Not yet
- Bounces and complaints from SES in Senlo's dashboard: they stay in SES and your SNS topics for now.
- A native SES API connection; SMTP does the sending.
- Importing existing SES templates: rebuild them in the editor.
What it adds to your bill
Your SES bill does not change: SES keeps delivering at its own rate. Senlo is the only addition, and it is priced by emails sent, not by contacts.
Free
$0 / month
Up to 3,000 emails and 1,000 automation runs a month, one person.
Pro
$19 / month
Up to 50,000 emails and 10,000 automation runs a month, 5 people with roles and a 30-day audit log.
Team
$59 / month
Up to 250,000 emails and 100,000 automation runs a month, unlimited people with roles and a 90-day audit log.
Self-hosted
≈ $8 / month
The same code, AGPL-3.0, on a 4 GB VPS of your own, any volume. Plus your time on upgrades and backups.
Above 250,000 emails a month Senlo Cloud has no plan: self-host, or write to us. Details on the pricing page.
Developers on SES templates
Linked to the source.
“Unfortunately, email templates can't be created from the Amazon SES dashboard, so we'll use code to setup the template.”Waypoint blog, 2023
“AWS currently only allows CRUD actions on SES templates via the command line.”README of an open-source SES template manager, GitHub
“But the only drawback is that, AWS SES doesn't offer any template editors.”DEV Community, 2024
Questions
- Does my email still go through SES?
- Yes. Senlo renders the template and hands the finished message to your SES account through its SMTP interface. Your verified domain, sending limits, reputation and AWS bill stay exactly where they are.
- Do I keep calling SendTemplatedEmail?
- No. Your code calls Senlo's POST /api/triggered with the template id, the recipient and the data; Senlo renders and sends through SES. Templates stored in SES are no longer used, so you can delete them once everything has moved.
- What about bounces and complaints?
- Today they stay in SES: read them through your configuration set and SNS as you do now. Senlo tracks opens and clicks itself, and it reads bounces from Resend and Postmark webhooks; reading SES's events is on the roadmap.
- Does it work in the SES sandbox?
- Yes, with the sandbox's rules: until AWS moves you to production access, SES only delivers to addresses you have verified, whoever renders the email.
- Can I self-host it next to SES on AWS?
- Yes. Senlo is open source (AGPL-3.0) and runs with one docker compose up on any server, an EC2 instance included. You need Postgres and Redis, which the compose file brings.
- What does it cost on top of SES?
- Senlo Cloud is free for one person up to 3,000 emails a month, $19 a month for up to 50,000 with a team, and $59 for up to 250,000. Self-hosted, it costs a small server.