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 emailsimport 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
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
Sending health
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,779 | 98.5% | 40.5% | 8.9% | 0.6% | 0.00% | Healthy |
Other domains | 2,513 | 98.5% | 40.5% | 8.8% | 0.6% | 0.00% | Healthy |
Outlook | 2,261 | 95.0% | 40.5% | 8.8% | 2.9% | 0.00% | Watch |
iCloud | 1,131 | 98.5% | 40.5% | 8.8% | 0.6% | 0.00% | Healthy |
Yahoo and AOL | 879 | 98.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
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.
Compared with the tools you may be looking at
The parts of Fromly you will use most
FAQ
Frequently asked questions
Is there an SDK for my language?
Can I send transactional and marketing email from the same account?
Do I have to write HTML for every email?
What does the API key give access to?
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.