Skip to content
SaaS

Email for your SaaS app, from one typed call.

Send password resets, receipts, invites, and alerts from your own domain. Change an email without a deploy, see what happened to every send, and get customer replies back as webhooks.

( SEND TO DELIVERED )

One call out, a signed event back.

A typed send call returns a message id right away. When the recipient's mail server accepts the email, Samva posts a signed message.delivered event to your webhook, and your product database updates from that signal.

POST https://api.samva.dev/v1/messages
idempotency-key: reset-4417

{ to: [{ email: "ada@example.com" }],
  channel: "email",
  email: { templateSlug: "plan-changed" } }

← { id: "msg_7q2xk9mvt4znw8rh", status: "pending" }
POST /webhooks/samva
webhook-signature: v1,SGVsbG8...

{ type: "message.delivered",
  timestamp: "2026-07-08T09:42:14Z",
  data: { messageId: "msg_7q2xk9mvt4znw8rh",
    channel: "email", status: "delivered" } }
( THE STACK TODAY )

Product email is a stack nobody signed up to own.

A 200 that tells you nothing

The API accepts the send, and nobody hears about the bounce until a user asks where their reset link went.

Email copy in your codebase

Fixing a typo in a receipt means a pull request and a deploy.

Replies to noreply

Customers answer your receipts and alerts, and the reply goes nowhere.

( HOW IT WORKS )

Send it, change it, hear back.

#01 — SEND

One typed call, safe to retry.

One typed call from the SDK, REST, or the CLI. Send the same idempotency key and payload within 24 hours and Samva replays the first result instead of sending again.

const  message = await samva.email.send({
  to: "ada@example.com",
  templateSlug: "plan-changed",
}, { idempotencyKey: "receipt:order-4417" });

← msg_7q2xk9mvt4znw8rh · pending
#02 — CHANGE

Change the email, skip the deploy.

Templates live in a Git-backed project. Publish a version, roll back, or edit it in the AI email editor, with no deploy.

template plan-changed
  v4  draft      edited 2h ago
  v3 published pinned
  v2  archived
  v1  archived

send { templateSlug: "plan-changed", templateData: { plan: "Growth" } }
# the pinned version is the version that sends
#03 — HEAR BACK

Events and replies reach your webhook.

Sent, delivered, bounced, complained, and received events reach your webhook, signed and retried, plus opens and clicks. Unsubscribes arrive as contact.unsubscribed events.

POST /webhooks/samva
webhook-signature: v1,SGVsbG8...

{ type: "message.delivered",
  timestamp: "2026-07-08T09:42:14Z",
  data: { messageId: "msg_7q2xk9mvt4znw8rh" } }

verify: timingSafeEqual(signature, hmacSha256(secret, body))
( SEND, TEMPLATES, INBOUND )

See the pieces up close.

Per-email pricing3,000 emails a month free, then $0.50 per 1,000 extra.

Questions from developers.

Can I move from Resend or SendGrid?

Yes. Verify your domain in Samva, swap your send call for the SDK, and point your webhook at Samva's events. Each compare page lists the steps. Compare pages

How do customer replies reach my app?

Turn on receiving for your domain. A reply is parsed, attached to the conversation of the email it answers, and posted to your webhook as message.received with its conversationId. Store that id to find your record.

How do I know an email arrived?

Every send has delivery events: sent, delivered, bounced, and complained, plus opens and clicks when tracking is on. They reach your webhook signed and retried, and the dashboard shows a timeline per send. Bounced and complained addresses are suppressed for you.

How does pricing work?

Free covers 3,000 emails a month. Paid plans start at $5 for 15,000. Past your plan, extra emails cost $0.50 per 1,000, up to a spend limit you set.

First send

Send your next product email in minutes.

Create a key and send a typed call.

Related Resources