For developers

Email marketing you can call from code

Send transactional email, sync contacts and fire events from your app with one SDK. Your campaigns and flows run on the same contacts, without a second vendor.

Start with 1,000 free emails
signup.js
import Fromly from '@fromly/sdk'

const fromly = new Fromly({ apiKey: process.env.FROMLY_API_KEY })

await fromly.contacts.upsert({ email: 'ada@example.com', firstName: 'Ada' })
await fromly.track({ email: 'ada@example.com', name: 'export.completed' })

await fromly.send({
  to: 'ada@example.com',
  subject: 'Your export is ready',
  html: '<p>Download it here.</p>',
})

Today

Receipts go through an email API, newsletters through a marketing tool.

A CSV export to get your users into the marketing tool.

A pull request to fix a typo in the welcome email.

With Fromly

One contact and one unsubscribe for both.

fromly.contacts.upsert() from your app, at signup.

The copy lives in the editor, and your code sends it by id.

One API for transactional and marketing

The REST API and the Node SDK cover sends, contacts, events, emails and messages. A transactional email and a campaign reach the same contact, and an unsubscribe or a bounce applies to both.

  • Typed SDK, Node 18+, no dependencies
  • Each send returns a messageId you can look up
  • Errors carry the status and, on rate limits, when to retry
Read the API reference

Templates people can edit, data from your code

Build a transactional email in the editor once, then send it by id with the data that changes. The copy stays in Fromly, so fixing a typo is not a deploy.

  • Send by emailId with {{data.*}} tags
  • An SMTP relay for tools that only speak SMTP, such as Supabase Auth
  • Sends only from your verified domain
Transactional emails

Sending health

View analytics

Watch

Spam reports are rising.

Delivered

98.5%

12,380 emails

Bounce rate

1.1%

133 emails

Complaint rate

0.06%

7 emails

By mailbox provider

Gmail
5,77998.5%40.5%8.9%0.6%0.00%Healthy
Other domains
2,51398.5%40.5%8.8%0.6%0.00%Healthy
Outlook
2,26195.0%40.5%8.8%2.9%0.00%Watch
iCloud
1,13198.5%40.5%8.8%0.6%0.00%Healthy
Yahoo and AOL
87998.5%40.5%8.9%0.6%0.00%Healthy

Your events start the flows

Track any event from your app and use it to start a flow. The event names are yours, and they sit in each contact's timeline next to the emails they got.

  • Events with your own names and properties
  • Flows that start on them, with waits and conditions after
  • Every event on the contact's timeline
How events work

What developers wire up first

  • Transactional from code

    Receipts, exports and magic links, sent by the SDK from a template your team can edit.

  • Event-driven flows

    An event from your app starts a flow, with waits and conditions on what happens next.

  • SMTP drop-in

    Point Supabase Auth or any tool with SMTP settings at the relay, with no code change.

  • From your editor

    Connect Claude Code or Cursor over MCP and draft emails without leaving the terminal.

FAQ

Frequently asked questions

Is there an SDK for my language?
There is a Node SDK today. Every other language uses the REST API directly, or the SMTP relay for tools that only send through SMTP.
Can I send transactional and marketing email from the same account?
Yes. Both go through the same contacts and the same verified domain, so an unsubscribe or a bounce is respected everywhere.
Do I have to write HTML for every email?
No. Emails are built from blocks in the editor and keep your logo, colours and footer. You can still send raw HTML from the SDK when you want to.
What does the API key give access to?
One workspace. A key cannot reach another workspace, and you can revoke it from Settings at any time.

Turn your signups into customers with email

Connect Supabase and Stripe, let your agent draft your first flow, and send your first 1,000 emails for free.

Start with 1,000 free emails