useSendEverJust

Overview

EverJust's self-hosted, multi-tenant transactional email platform on AWS SES — a drop-in replacement for Resend that costs $0 per sending domain.

useSend is EverJust's self-hosted transactional email platform. It is the open-source useSend project (formerly Unsend) running on our own AWS account, sending through Amazon SES. We run it to replace Resend across every EverJust product.

The dashboard is live at mail.everjust.app and the REST API is served from https://mail.everjust.app/api/v1.

Why we run it

  • $0 per sending domain. SES bills per email (~$0.10 per 1,000), never per domain. Add as many verified domains as products need at no marginal cost — the opposite of Resend's per-domain pricing.
  • Self-hosted, one AWS account. All email flows through infrastructure we own. No third-party sees the message bodies, and there is no external quota to buy.
  • Near drop-in for Resend. The send payload mirrors Resend's (from / to / subject / html / text), so migrating a product is mostly a base-URL and API-key swap. See Migrate from Resend.
  • Multi-tenant by design. One deployment serves every product, each isolated into its own tenant.

Tenancy model

There is one useSend deployment for all of EverJust. Within it:

  • A Team is a tenant, and there is one Team per product.
  • Each Team owns its own sending domains and its own API keys. A key is scoped to its Team — it can only send from that Team's domains and only sees that Team's data.
  • Adding a new product means creating a new Team, verifying its domain(s), and issuing a key for it. Nothing is shared at the application layer between Teams.
useSend deployment  (mail.everjust.app)
├── Team "EverJust"        ← tenant = product
│   ├── domain: send.everjust.app   (verified)
│   └── API key: us_...             (Bearer)
├── Team "ProductB"
│   ├── domain: mail.productb.com
│   └── API key: us_...
└── Team "ProductC" …

What's already live

The deployment is running — dashboard at mail.everjust.app, API at https://mail.everjust.app/api/v1.
Team EverJust exists as the first tenant.
Sending domain send.everjust.app is fully verified — DKIM, SPF, DMARC, and MAIL FROM all pass.
An API key with the us_ prefix is issued for the EverJust Team.

Authentication is HTTP Bearer. Every API request carries the key in the header, exactly:

Authorization: Bearer us_xxxxxxxxxxxxxxxxxxxx

Because we self-host, rate limiting is disabled — there is no per-second or per-day API cap imposed by useSend. Throughput is bounded only by your SES sending quota.

SES is in sandbox. Production access has been requested from AWS but is still pending. Until it's granted, you can only send to verified addresses or the SES mailbox simulatorsuccess@simulator.amazonses.com, bounce@simulator.amazonses.com, complaint@simulator.amazonses.com. Once AWS grants production access, any recipient works with no code change.

A first send

curl -X POST https://mail.everjust.app/api/v1/emails \
  -H "Authorization: Bearer us_xxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "from": "EverJust <hello@send.everjust.app>",
    "to": "success@simulator.amazonses.com",
    "subject": "Hello from useSend",
    "html": "<p>It works.</p>"
  }'
import { UseSend } from "usesend-js";

const usesend = new UseSend(
  "us_xxxxxxxxxxxxxxxxxxxx",
  "https://mail.everjust.app/api/v1"
);

await usesend.emails.send({
  from: "EverJust <hello@send.everjust.app>",
  to: "success@simulator.amazonses.com",
  subject: "Hello from useSend",
  html: "<p>It works.</p>",
});
from usesend import UseSend

usesend = UseSend(
    api_key="us_xxxxxxxxxxxxxxxxxxxx",
    url="https://mail.everjust.app/api/v1",
)

usesend.emails.send({
    "from": "EverJust <hello@send.everjust.app>",
    "to": "success@simulator.amazonses.com",
    "subject": "Hello from useSend",
    "html": "<p>It works.</p>",
})

Where to go next