Skip to main content
Getting started File 004

Postboi compared

How Postboi stacks up against Resend, SendGrid, Postmark, Mailtrap, nodemailer and SMS SDKs like sms-sdk. Postboi is an email provider in its own right, and using someone else's is optional.

If you’re choosing between Postboi and another email service, start here: Postboi is an email provider. We run the sending infrastructure, same as Resend, Postmark or SendGrid do, and postboi on npm is the SDK for it. A POSTBOI_TOKEN is all you need. You don’t need an account anywhere else.

On top of that, the same mail() call can send through another provider if you’d like it to, and the same API sends SMS, WhatsApp, push and chat as well. Both are extras.

Is Postboi a wrapper around other providers?

No. We support 40-odd other providers, which makes it easy to assume Postboi sits on top of them. It works the other way round:

  1. Postboi is an email service. Its mail is delivered by Amazon SES in the EU, each team as its own SES tenant, and the Postboi provider handles sending, custom domains, lists and broadcasts, contacts, double opt-in, suppressions, a message log, delivery webhooks, scheduling, hosted forms, receiving, email testing and a dashboard. It also runs Tempboi, throwaway inboxes at tempboi.email for tests and agents.
  2. postboi is its SDK. mail() and friends, with one error type, in any JS framework.
  3. You can point the SDK elsewhere. Send through another provider instead, or keep our log and dashboard while relaying delivery through your own Resend, Postmark or SES account.

So “Postboi or Resend?” compares two email providers.

Is Postboi built for transactional email?

Yes, it’s the main thing it’s for. Sign-in links, one-time codes, receipts and password resets are what the provider is built around:

  • Delivery status on every message, with bounces and complaints tracked and the addresses suppressed for you.
  • Idempotency keys, so retrying a send after a timeout can’t send it twice, and retries with backoff built into the SDK.
  • Webhooks for every delivery event, and message lookup from code.
  • Sending pauses itself if bounce or complaint rates climb past a safety threshold, which protects your domain’s reputation before a mailbox provider has to.
  • Receiving, so a reply to a transactional email isn’t lost.

The other channels and the provider switch are extras on top of that.

Postboi vs Resend

Postboi Resend
Email provider with managed sending ✅ ✅
TypeScript SDK ✅ mail() ✅ resend.emails.send()
Works without any other provider account ✅ ✅
First send with no DNS and no card ✅ from you@send.postboi.email Needs a verified domain for real recipients
Custom domains, webhooks, scheduling ✅ ✅
Idempotency keys, suppressions, bounce tracking ✅ ✅
Receiving email ✅ ✅
Lists, broadcasts, contacts ✅ ✅
Switch provider without rewriting your code ✅ one line of config ❌ your code calls Resend’s API
SMS, WhatsApp, push and chat in the same API ✅ ❌ email only
Turn FormData into an HTML email ✅ ❌
Hosted form endpoints (no backend) ✅ ❌
Local dev inbox, no code changes ✅ /__postboi ❌
Throwaway inboxes for tests and agents ✅ Tempboi, no account Test addresses that simulate delivery and bounces
Mailboxes an AI agent keeps ✅ agentboi.email, no account to make one, with drafts, review and MCP Inboxes, in private beta in October 2026
An agent can set it up without you signing in ✅ postboi init --agent Needs an account and API key first
Free tier 3,000 a month, 100 a day 3,000 a month, 100 a day
First paid plan £9 for 40,000 a month $20 for 50,000 a month
50,000 emails a month £13 (about $17) $20
100,000 emails a month £25 (about $33) $35
Lists and broadcasts Included in every plan A separate plan, priced by contact
Ecosystem and track record Newer, with a measured delivery record ✅ bigger, been around longer

This is Resend as we understand it in September 2026, with dollars at 1.32 to the pound. Check resend.com/pricing for what it charges today, and Postboi or Resend? for the cost at every volume.

Pick Postboi if you want to pay less for the same volume, as little code as possible between your app and a sent email, if an AI agent is setting things up, if you’ll want SMS or push later, or if you’d like to be able to change provider without touching your code.

Pick Resend if you want its ecosystem, its React Email tooling (React Email works with Postboi too, since body takes any HTML) or its longer history in production.

Already using Resend? You can keep it. postboi/resend sends through your Resend account using Postboi’s API, and if you move to the Postboi provider later, you change provider: "resend" to provider: "postboi" and that’s it. bunx postboi migrate resend brings your domains, audiences and webhooks across first (the CLI page has the flags), and Moving from Resend goes through the rest step by step.

Postboi vs SendGrid, Postmark, Mailgun or SES

Same story as Resend. Each is an email provider with its own SDK, and code you write against that SDK only sends through them. Postboi is also an email provider, and its SDK can send through any of them too. So you can use Postboi instead of them, or keep one and stop your app depending on it directly.

Postboi vs Mailtrap, Mailosaur and temp mail APIs

These are testing services: a sandbox that catches what your app sends in staging, or inboxes a test can receive at. Postboi has both halves, beside the sending:

  • Dev inbox catches everything your app sends in development, locally, with no account and no code changes.
  • Tempboi gives a test or an agent a real address at tempboi.email that receives mail from anywhere, with the code and link already pulled out. No account.
  • Email testing checks an email for client support, clipping, accessibility and deliverability before it’s sent.

The difference is that the same SDK then sends your production mail, so the email your tests read is the one your users get. If you already use Mailtrap for sending, mail() can send through it too (postboi/mailtrap).

Postboi vs nodemailer

nodemailer is a library. You still need an SMTP server or a provider behind it, and you don’t get a delivery log, suppressions or webhooks. Postboi is a provider and a library, so bunx postboi init replaces installing nodemailer, signing up somewhere and pasting in SMTP credentials. If you do want SMTP, Postboi supports that too (postboi/smtp).

Postboi vs sms-sdk and other SMS libraries

For text messages Postboi works differently from email. We don’t send texts ourselves: sms() sends through your own account with an SMS provider, so the comparison is with other SMS libraries, such as opencoredev/sms-sdk or a provider’s own SDK. A provider’s SDK only talks to that provider. sms-sdk and Postboi both put one API over several, and they cover much of the same ground:

Postboi sms-sdk
SMS providers 9: Twilio, Telnyx, Vonage, Plivo, Sinch, Bandwidth, The SMS Works, PureSMS, Amazon SNS 6: Twilio, Telnyx, Vonage, Plivo, Sinch, Bandwidth
One result shape whichever provider sent it ✅ id, ids, provider, delivery ✅ providerId, handoff, delivery
Fail over only when a provider proves it refused ✅ POSTBOI_SMS_PROVIDER=twilio,puresms ✅ fallback: "on-known-rejection"
Never resend after a timeout or a 5xx ✅ ✅
Idempotency store, so a key sends once ✅ memory_idempotency_store() or your own ✅ memoryIdempotencyStore() or your own
Encoding and segments, checked before sending ✅ sms.validate() ✅ validate()
MMS, validity period, provider options ✅ ✅
Verified delivery and inbound webhooks ✅ 8 providers ✅ 6 providers
Sinch callbacks ✅ Basic credentials or HMAC ✅ Basic credentials or HMAC
STOP, START and HELP ✅ ✅
A key for skipping redelivered webhooks ✅ dedupe_key ✅ dedupeKey
Spam blocks reported apart from other failures Twilio, Telnyx, Vonage, Sinch, Plivo, Bandwidth Twilio, Telnyx, Vonage, Sinch
Phone numbers masked in errors and hooks ✅ by default (sms.redact: false shows them) ✅ always
Message text kept out of errors and hooks ✅ by default, with the numbers ✅ always
Runtime dependencies None None
Dry-run doctor, and one confirmed live send ✅ postboi doctor --sms-text, --sms-live ✅ sms-sdk doctor, --live
Contract tests for an adapter you write ✅ postboi/testing ✅ /testing
Configured from the environment, no setup code ✅ POSTBOI_SMS_PROVIDER and its keys ❌ adapters are constructed in code
Texts logged, not sent, in development ✅ by default ❌ swap in the memory adapter yourself
Email, WhatsApp, push and chat in the same API ✅ ❌ SMS only

This is sms-sdk 0.1 as we read it in October 2026. Its README has the current list.

Pick Postboi if you send more than texts, if you’d rather set the provider in the environment than wire it up in code, if you text into the UK (The SMS Works and PureSMS are UK-native and cheaper there), or if a dev machine shouldn’t be able to text a real phone.

Pick sms-sdk if you only send texts and want a small package that does nothing else.

Why it works well with AI agents

  • Setup is one command and nobody has to sign in. bunx postboi init --agent creates a project the agent can use straight away. You claim it with one click when you’re ready.
  • An agent can receive mail too. Tempboi gives it an address with no account, for signing up to things and reading the code. Email for agents has the whole picture.
  • Every channel looks the same. mail({ to, subject, body }) writes the plain-text version for you, and sms(), push() and the rest take the same shape and fail the same way.
  • Errors have one shape. Whichever provider fails, you get a PostboiError, with a code when the provider gave one. On the Postboi provider that’s one of ours, like rate_limited or from_not_allowed. Other providers pass their own codes through.
  • Mistakes show up as type errors. postboi sync types from to the addresses your account can send from, and form names to the forms you have.
  • The docs are easy for a model to read. The package ships a skill (bunx postboi skill), every page is plain Markdown at /raw/<slug>, and the whole site is one file at /llms-full.txt.