groundmail

Features

Templates your whole team can edit

Teammates design in a visual builder. Engineers push HTML from git. Everyone sends by a stable alias, and live mail only ever uses a published version.

Two ways in

Dashboard for teammates, git for engineers

Both paths end in the same place: a published template with an alias your code can call.

Visual block editor

Headings, text, buttons, images, columns and footers. Add {{variables}} to the subject, copy and button links. A code view shows the exact HTML that will be sent.

Versioned publish

Publishing freezes an immutable version. Draft edits never touch live sends, and older versions can be restored into the draft.

Push from git

The CLI upserts a template from a local .html, .txt or React Email file, keyed by alias. Your repo stays the source of truth.

Starter templates

Password reset, email verification, welcome, invoice and team invite. Copy one into your account and send it in minutes.

Send

One alias from any client

The same template id works from Node, Python, PHP, Ruby, Go, the CLI and automations.

  • Variables merge at send time; HTML values are escaped
  • Subject comes from the template unless you override it
  • Suppressions and domain rules apply like any other send

Send by template alias

await client.emails.send({
  from: "hello@yourdomain.com",
  to: "user@example.com",
  template: {
    id: "welcome",
    variables: {
      name: "Ada",
      dashboard_url: "https://app.example.com",
    },
  },
});

Inbox-safe output

Built for real mail clients

The builder emits table-based HTML with Outlook conditionals, bulletproof buttons, mobile stacking, dark-mode meta and a hidden preheader. Preview and publish use the same output.

  • Global CSS on bare tags is inlined, so it survives Gmail clipping and Outlook
  • Warnings when HTML may not render, such as SVG logos
  • Raw HTML templates when you want full control of the markup

CLI push

# Upsert a template from your repo and publish it
groundmail templates push ./emails/welcome.html \
  --alias welcome --subject "Welcome" --publish

Starters and their variables

password-reset      name, reset_url
email-verification  name, verify_url, code
welcome             name, dashboard_url
invoice             name, amount, invoice_url, invoice_id
team-invite         name, inviter_name, team_name, invite_url

FAQ

Common questions

Do draft edits change what customers receive?

No. Sends always use the published version. Edit the draft as much as you like, then publish when it is ready.

Can I roll back a template?

Yes. Every publish keeps a version. Restore an older one into the draft and publish it again.

Can I use React Email?

Yes. Push a React Email component with the CLI and it renders on your machine before upload, or render it in your own Node process at send time.

Do I need Node in my app to use templates?

No. Templates are stored on Groundmail and referenced by alias, so any SDK or plain HTTP works. Only the machine running the CLI needs Node.

Put your transactional email on solid ground.

Start free on our transactional pool. Move to dedicated IPs or a dedicated server when you need the isolation. Same API either way.