Free during the private beta

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}}}

What your customer sees
Drag the line. One template, compiled by SwiftMail for Resend, Postmark, Amazon SES and plain text.

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

Published

Subject Reset your Plotline password

Plotline

Reset your password

Hi first_name, we got a request to reset your Plotline password.

Choose a new 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.

  1. 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
  2. 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.

    Fernhouse

    Thanks for your order, first_name

    Order order_id is confirmed and will ship within two days.

    Text
    Monstera deliciosa$48.00
    Terracotta pot, 8 in, x2$36.00
    Shipping$6.00
    Tax$7.20
    Totaltotal
    View order

    Fernhouse, 19 Alder Ave, Portland OR
    Email preferences

    Mention free shipping over $75

    Apply to selection
  3. Publish

    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 SES

    Variables

    • first_name→FIRST_NAME
    • order_id→ORDER_ID
    • total→TOTAL
    Publish to Resend

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

Kelp

Welcome to Kelp, first_name

You are three small steps away from saving on autopilot.

  1. 1Link your bank account
  2. 2Set your first savings goal
  3. 3Turn on round-ups
Open Kelp

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

Shorter, and say 15 minutes1 block selected

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.

DesktopMobileDark
Plotline

Desktop, mobile and dark previews

See the email the way recipients do before you publish. Then test-send it to yourself.

  1. 1v1 Generated
  2. 2v2 AI edit
  3. 3v3 ManualRestore
  4. 4v4 Test send
  5. 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.

Reset your Plotline password
Your password reset link (15 min)
Let’s get you back into Plotline

Three subject lines to choose from

Ask for options and pick the one that fits, with a matching preheader.

Inbox
SwiftMail Test[Test] Reset your Plotline passwordnow
TernYour notes from this week9:12
KelpYou saved $42.18 in SeptemberMon

Test-send to your own inbox

Send a real copy to your verified address, marked [Test], before anything goes live.

Logo

Fernhouse

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.

Parth ChokshiFounder, SwiftMail

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
Start free

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
Start free

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.