The template engine for Resend, Postmark and Amazon SES
Rough idea in, clean template out.
SwiftMail writes the email-client-safe HTML for every transactional email and publishes it to the Resend, Postmark or Amazon SES account you already use.
Already have templates? Import them from Resend, Postmark, Amazon SES or raw HTML.
Resend variables: {{{SM_FIRST_NAME}}}
Watch one sentence become a template.
This is the SwiftMail editor. Prompt in, finished email out, checked and published in the same place.
Password reset email
Published · v1
Subject Reset your Plotline password
Reset your password
Hi first_name, we got a request to reset your Plotline password.
This link expires in 15 minutes. If you did not ask for it, ignore this email.
Plotline Analytics, 400 Market St, San Francisco CA
Email preferences
Ask for a change to the whole email…
Published to Postmark
alias: password-reset
Transactional email is still built by hand.
Every app needs a welcome, a reset and a receipt. They are rarely anyone’s project, so they ship late and look unfinished. SwiftMail turns each one into a sentence.
The usual way
- Nested HTML tables and inline styles, written by hand
- Checking Outlook, Gmail and dark mode after you ship
- Pasting HTML into a provider dashboard
- Learning each provider’s variable syntax
- A pull request and a deploy to fix one typo
With SwiftMail
- A sentence becomes a validated block tree, rendered with React Email
- Contrast, alt text, links, fallbacks and Gmail clipping checked before publish
- One click publishes a hosted template to Resend, Postmark or Amazon SES
- Variables mapped per provider, each with a sample and a fallback
- Edit, republish, done. Your app keeps sending the same alias
From a sentence or an old template to a live one.
Three steps, no HTML, and nothing to copy between tabs.
Start
Describe it, or bring what you have.
Write one sentence, or import a template from your Resend, Postmark or Amazon SES account, or paste its HTML. SwiftMail drafts or rebuilds it with the layout, copy, subject and variables in place.
Receipt for Fernhouse, a plant shop. Line items, shipping, tax and a total.
Brand kit, applied to every draft
- Logo
- Fernhouse
- Colour
- #166534
- Font
- Georgia
- Footer
- 19 Alder Ave, Portland OR
Refine
Point at a block and ask.
Click any text to type in place, or select a block and ask AI to change only that part. Every save becomes a version you can restore.
FernhouseThanks for your order, first_name
TextOrder order_id is confirmed and will ship within two days.
Monstera deliciosa$48.00Terracotta pot, 8 in, x2$36.00Shipping$6.00Tax$7.20TotaltotalView orderFernhouse, 19 Alder Ave, Portland OR
Email preferencesMention free shipping over $75
Apply to selectionPublish
Send it to your provider.
Publish to Resend, Postmark or Amazon SES as a hosted template, with variables renamed to the provider’s syntax. Copy the snippet into your app and ship.
Publish template
Creates or updates a hosted template in your account.
ResendPostmarkAmazon SESVariables
- first_name→FIRST_NAME
- order_id→ORDER_ID
- total→TOTAL
Receipt for Fernhouse, a plant shop. Line items, shipping, tax and a total.
Brand kit, applied to every draft
- Logo
- Fernhouse
- Colour
- #166534
- Font
- Georgia
- Footer
- 19 Alder Ave, Portland OR
Use cases
Every email your app ends up needing.
Twelve starting points across the lifecycle. Pick one, change the details, and it becomes a template your app sends by alias.
Kelp <hello@kelp.example>
Welcome to Kelp, first_name
Welcome to Kelp, first_name
You are three small steps away from saving on autopilot.
- 1Link your bank account
- 2Set your first savings goal
- 3Turn on round-ups
Kelp Financial, 88 Harbor St, Oakland CA
Email preferences
Illustrative brands. Your drafts use your own brand kit.
Everything between the prompt and the inbox.
The editor handles the parts that usually cost an afternoon each.
Hi Maya, we got a request to reset your Plotline password.
This link will expire in a short amount of time. If you did not request a password reset, please disregard this message.
Choose a new password
Edit with AI, only where you point
Select a block and describe the change. The edit stays inside your selection, and the rest of the email is left exactly as it was.
- Contrast on text and buttons
- Alt text on images
- Only https, mailto and tel links
- Fallbacks for every variable
- HTML under Gmail’s clip limit
Checks before anything ships
The same checks run in the editor and before every publish, so a broken link or unreadable button never reaches a customer.
Desktop, mobile and dark previews
See the email the way recipients do before you publish. Then test-send it to yourself.
- 1v1 Generated
- 2v2 AI edit
- 3v3 ManualRestore
- 4v4 Test send
- 5v5 Published
Every save is a version
Generations, AI edits, manual changes, test sends and publishes each leave a checkpoint. Restore any of them in one click.
Three subject lines to choose from
Ask for options and pick the one that fits, with a matching preheader.
Test-send to your own inbox
Send a real copy to your verified address, marked [Test], before anything goes live.
Logo
Colour
#166534
Font
Georgia
Footer
19 Alder Ave, Portland
Your brand kit on every draft
Set your logo, colour, font and footer address once. Every generation starts from them.
One template engine. The infra you already have.
Keep every template in SwiftMail and keep sending through Resend, Postmark or Amazon SES. Nothing changes in how your app sends.
One version, any provider
Publish the same saved version to Resend, Postmark and Amazon SES. Each gets its own variable names and template syntax, while the email itself lives in one place.
Hosted templates, not HTML files
Templates live in your Resend, Postmark or Amazon SES account. Your app sends by alias, so a copy change never needs a deploy.
Variables your provider understands
Each variable gets a sample and a fallback, and is renamed to fit the provider: FIRST_NAME for Resend, first_name for Postmark and Amazon SES.
Your keys, used narrowly
Provider keys are envelope-encrypted. SwiftMail only touches templates it created and never sends mail with your key.
One tree, two outputs
Every email is a validated JSON block tree rendered with React Email into HTML and plain text. The preview is the published output.
// Set RESEND_API_KEY in your environment.
const response = await fetch('https://api.resend.com/emails', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${process.env.RESEND_API_KEY}`,
},
body: JSON.stringify({
from: 'Plotline <account@plotline.example>',
to: [user.email],
template: {
id: 'password-reset',
variables: { FIRST_NAME: user.firstName, RESET_URL: resetUrl },
},
}),
})
if (!response.ok) throw new Error(`Send failed (HTTP ${response.status})`)SwiftMail writes this for each template when you publish, for every provider, in Node.js, Python and cURL.
A note from the founder
Transactional email is the part of a product everyone ships last and then lives with for years. I built SwiftMail so a password reset, a receipt or an invite takes one sentence instead of an afternoon of table layouts.
While we are in beta, three things hold: your templates live in your provider account, we never send mail with your key, and if you leave, everything you published keeps working.
Pricing
Free while in beta. Pro when you need more.
No card to start. Every feature is in both plans; Pro raises the limits.
Beta
Freeduring the private beta
Everything in SwiftMail, with room for a real app’s email set.
- 50 AI generations a month
- 200 AI edits and subject lines a month
- 20 test sends a day
- Publish to Resend, Postmark and Amazon SES
- Brand kit, versions and checks
Pro
Most room$19a month, or $149 a year
For teams iterating on email every week.
- 500 AI generations a month
- 2,000 AI edits and subject lines a month
- 100 test sends a day
- Publish to Resend, Postmark and Amazon SES
- Priority help from the founder
Upgrade from Settings whenever you need more.
Questions developers ask first.
Who is SwiftMail for?
Developers and small teams who send with Resend, Postmark or Amazon SES and want their transactional emails to look finished, without hand-coding HTML tables.
Do I need a Resend, Postmark or Amazon SES account?
Only to publish. You can generate, edit, version and test-send templates to yourself without connecting a provider.
How does my app send a SwiftMail template?
The same way it sends any hosted template: call your provider’s API with the template alias and variables. SwiftMail gives you the snippet in Node.js, Python and cURL when you publish.
Can I bring in the templates I already have?
Yes. Pick a template from your connected Resend, Postmark or Amazon SES account, or paste any email’s HTML. SwiftMail rebuilds it as an editable template, keeps its copy, links and colours, and turns placeholders like {{{FIRST_NAME}}} into variables. An import uses one generation.
Will it touch templates I already have?
No. SwiftMail only creates and updates templates it made, which are named “SwiftMail: …” in Resend and Postmark. Amazon SES templates are named by the alias you pick, and SwiftMail refuses to overwrite one it did not create. Everything else is left alone.
What does SwiftMail need from Amazon SES?
An IAM user’s access key and the region you send from, with permission to list, read, create and update email templates. Listing verified identities is optional and lets SwiftMail check your sender address before publishing.
What happens to my templates if I stop using SwiftMail?
They keep working. Published templates are ordinary templates in your Resend, Postmark or Amazon SES account, and your app keeps sending them.
How are my API keys stored?
Provider keys are envelope-encrypted and used only to create and update your templates. Test sends go out from SwiftMail’s own sending account, only to your verified address.
Will the emails work in Gmail, Outlook and Apple Mail?
Templates are rendered with React Email components, built for the major clients, with a plain-text part. Checks catch low contrast, missing alt text, unsafe links and Gmail clipping, and you can test-send before publishing.
What counts as a generation?
Creating a new email from a prompt. Changes to an existing email use edits instead. A generation that fails or times out is refunded to your monthly allowance.
Your next email is one sentence away.
Free during the beta. Connect Resend, Postmark or Amazon SES when you are ready to publish.