Transactional

Receipts, alerts, magic links — in the same place as everything else.

Fire transactional emails from your backend with one API call. Edit templates without a deploy. p99 < 24ms.

app.bunloop.com / transactional
// Trigger a transactional send
await bunloop.send({
template: 'invoice_paid',
userId: 'usr_01J8K',
data: { amount: 4900 },
idempotencyKey: 'inv_4912'
})
// → 200 OK in 14ms
Live delivery log
invoice_paid14ms
password_reset22ms
login_alert18ms
invoice_paid11ms
seat_added

API-triggered

POST /v1/send with a userId and template name. We handle the rest.

Idempotent

Pass idempotencyKey to guarantee at-most-once delivery. No duplicate invoices ever.

Live delivery log

Every send observable in real time: latency, opens, bounces, complaints.

No deploys to edit copy

Template lives in Bunloop, code stays clean.

Marketing edits the template. Engineering owns the trigger. Both ship without stepping on each other.

  • Liquid templating with full type-safety
  • Preview with sample data, never break prod
  • Version every template; roll back instantly
app.bunloop.com / transactional
// Trigger a transactional send
await bunloop.send({
template: 'invoice_paid',
userId: 'usr_01J8K',
data: { amount: 4900 },
idempotencyKey: 'inv_4912'
})
// → 200 OK in 14ms
Live delivery log
invoice_paid14ms
password_reset22ms
login_alert18ms
invoice_paid11ms
seat_added
Developers

One call. Predictable response.

Send an invoice receipt, password reset, or any one-off email. Latency under 24ms p99.

// Trigger a transactional send
await bunloop.send({
  template: 'invoice_paid',
  userId:   'usr_01J8K',
  data: { amount: 4900, plan: 'pro' },
  idempotencyKey: 'inv_4912'
})
// → 200 OK in 14ms
FAQ

Common questions

Build the loop. Let it run forever.

Free forever for < 1,000 users. No credit card required.