DEV Community

RAXXO Studios
RAXXO Studios

Posted on • Originally published at raxxo.shop

Resend vs Postmark: 30 Days With Each For Transactional Email

  • Resend with React Email shipped in 18 minutes, Postmark took 41 minutes plus DMARC tweaks

  • Resend hit 99.7% Gmail placement on 4,212 sends, Postmark hit 99.4% but won Outlook by 2.1 points

  • Postmark dashboard surfaces bounce reasons in one click, Resend hides them two screens deep

  • Postmark costs 13.50€ at 10k sends, Resend costs 18€, gap widens at 50k volume

  • I picked Postmark for production, kept Resend for early-stage projects and React Email previews

I run four products from one laptop. Every product sends transactional email: order confirmations, password resets, magic links, weekly digests. For 30 days I split traffic between Resend and Postmark to figure out which one earns the SMTP slot in production. Same templates, same volume, same domain reputation, two different stacks. Here is what 30 days and 8,400 emails actually told me.

I went into the test biased toward Resend. The React Email integration looked beautiful in their docs, and as a solo developer the idea of writing email templates as JSX felt like a clean win. I came out the other end with a different answer than I expected. The numbers below are the reason.

Setup, SDKs, and Day One Developer Experience

Resend ships a TypeScript SDK that pairs with React Email. If you already write JSX, the learning curve is roughly zero. I had a working order confirmation in 18 minutes, including DNS verification.


import { Resend } from 'resend'
import { OrderConfirmation } from '@/emails/order-confirmation'

const resend = new Resend(process.env.RESEND_API_KEY)

await resend.emails.send({
  from: 'orders@raxxo.shop',
  to: customer.email,
  subject: `Order ${order.id} confirmed`,
  react: OrderConfirmation({ order }),
})

Enter fullscreen mode Exit fullscreen mode

Postmark took 41 minutes to reach the same milestone. The extra time went to DMARC, a return-path subdomain, and a slightly less obvious template flow. Postmark wants you to author templates inside their UI (or sync with their CLI) and reference them by alias. That feels heavier on day one. By day three it felt safer, because every send goes through a versioned template with a real preview history.


import { ServerClient } from 'postmark'

const client = new ServerClient(process.env.POSTMARK_SERVER_TOKEN)

await client.sendEmailWithTemplate({
  From: 'orders@raxxo.shop',
  To: customer.email,
  TemplateAlias: 'order-confirmation',
  TemplateModel: { order },
  MessageStream: 'outbound',
})

Enter fullscreen mode Exit fullscreen mode

Two real differences after a week:

  1. Resend is faster to iterate locally because templates live in your repo as React components. Hot reload works.

  2. Postmark forces a separation between code and content. Designers can edit copy without a deploy. For a one-person studio that sounds pointless, until you realize Future Norman is also a stakeholder.

Both SDKs are small, both throw on validation errors, both return a clean message ID. No surprises in either client.

Deliverability Numbers Across 8,400 Sends

This was the part I cared about most. I ran identical content through both providers, alternating per recipient, on the same authenticated domain. Tracking was done with a custom pixel plus webhook events from each provider. Spam folder placement was sampled with GlockApps seed lists once a week.

Across 30 days:

| Metric | Resend | Postmark |

|---|---|---|

| Total sends | 4,212 | 4,189 |

| Inbox placement (Gmail) | 99.7% | 99.4% |

| Inbox placement (Outlook) | 97.1% | 99.2% |

| Median send latency | 312 ms | 218 ms |

| Bounce rate | 0.42% | 0.38% |

| Webhook delivery within 5s | 99.1% | 99.8% |

Two surprises here. First, Resend won Gmail by a hair but lost Outlook by two full points. If your audience is B2B German users on Outlook, that gap matters. My remind.me-adjacent test list skews Outlook, so this one number nudged me toward Postmark. Second, Postmark webhooks were noticeably more reliable. Out of 4,189 sends, only 8 webhook events arrived after the 5 second mark. Resend had 38 late webhooks and 3 that never arrived (I caught them with a reconciliation cron).

For the 4 magic link flows I run, latency below 300 ms matters. Postmark beat Resend by about 90 ms median, which is small in isolation and noticeable when a user is staring at a login screen.

Dashboards, Debugging, and the Bounce Story

Resend has the prettier dashboard. Lots of whitespace, a clean event timeline, and a nice domain health view. For day-to-day glances it is the one I open first.

Postmark has the more useful dashboard. Bounces include the raw SMTP response, the receiving server, the suppression reason, and a one-click resubscribe toggle. When a corporate Outlook server greylisted a batch of 14 messages, Postmark told me exactly which IP rejected the connection and why. Resend told me "delivery failed" and pointed me at a generic doc.

Webhook debugging followed the same pattern. Postmark logs every webhook attempt with status code, response time, and full payload. Resend shows the last attempt and whether it succeeded. When my webhook handler choked on a missing field, Postmark let me replay the exact event from the dashboard. With Resend I had to re-trigger the original send to reproduce.

Here is the webhook handler I ended up shipping for both, normalized into one shape:


export async function POST(req: Request) {
  const event = await req.json()
  const provider = req.headers.get('x-provider')

  const normalized = provider === 'postmark'
    ? { type: event.RecordType, messageId: event.MessageID, email: event.Recipient }
    : { type: event.type, messageId: event.data.email_id, email: event.data.to[0] }

  if (normalized.type === 'Bounce' || normalized.type === 'email.bounced') {
    await suppressionList.add(normalized.email)
  }

  await db.emailEvents.insert(normalized)
  return new Response('ok')
}

Enter fullscreen mode Exit fullscreen mode

Both providers use HMAC signatures for webhooks. Postmark documents the verification flow with a copy-paste snippet for every major language. Resend has the same feature, the docs are thinner, and I had to read the source to be certain about the signing string.

Support response times told the same story. Postmark replied to a deliverability question in 47 minutes on a Tuesday. Resend replied in 19 hours, with a templated answer that did not address my actual question. I asked again, got a useful reply 6 hours later. Both fine, one clearly faster.

Pricing and Scaling Math in EUR

Both providers bill in dollars, which my bank converts to euros. Numbers below are the EUR amount that actually hit my card during the test month, with the conversion fee included.

At 10,000 emails per month:

  • Resend Pro: 18€ flat

  • Postmark Outbound 10k: 13.50€ flat

At 50,000 emails per month (where I will be in Q4 if the digest grows):

  • Resend Scale: 78€

  • Postmark Outbound 50k: 50€

At 300,000 emails per month (hypothetical, but worth modeling):

  • Resend: 350€ish, custom tier

  • Postmark: 296€ via their published ladder

Postmark is cheaper at every tier I will plausibly hit this year. The difference is about 4.50€ at 10k and 28€ at 50k. Not life changing, real money over 12 months. Resend includes a marketing email tier in the same plan. Postmark splits transactional and broadcast into separate streams with separate prices, which is more honest billing for what each one actually costs to deliver.

One detail that almost flipped my decision: Resend gives 3,000 free emails per month forever on a verified domain. For projects that send 200 emails a month (every side product I have ever shipped) that is genuinely free. Postmark gives 100 free per month, which is barely a smoke test. So Resend wins for early-stage and hobby projects, no question.

For my main shop and the two products that actually move volume, Postmark wins on price by 25 to 30 percent at the volumes I care about.

The pricing math also has a hidden line item. Postmark separates broadcast (newsletters, announcements) onto a different stream with its own price. That sounded annoying until I realized it kept my transactional reputation isolated from the inevitable day a digest gets flagged by some Outlook filter. Resend keeps everything in one bucket, which is simpler to reason about and slightly riskier when one bad campaign can hurt every transactional send for 24 hours.

Resend is not behind on pricing because it is bad. It is priced higher because it bundles broadcast and ships React Email, which has real engineering behind it. Different bet, same business.

Bottom Line

Postmark won the production slot because Outlook placement was 2.1 points higher, webhooks were more reliable, the dashboard surfaces real failure reasons, and at the 10k to 50k sends per month range it costs about 30% less. Resend keeps the magic link and React Email preview workload because the SDK is faster to iterate on locally and the free tier covers it.

Top comments (0)