← All comparisons

Postmark vs Mailgun

Postmark vs Mailgun for SaaS email APIs: price at 10k, 50k and 125k sends, webhook security, inbound, validation and migration steps both ways.

Last updated: 2026-10-07

Short answer

Pick Postmark if your SaaS mostly sends receipts, password resets, invites and alerts and you want a short plan list, 45-day message history on the entry plan and transactional traffic kept apart from broadcast traffic. Pick Mailgun if you need address validation, inbound routing rules, a US or EU region on one account, or the lower price at 50,000 emails: Mailgun's Foundation plan is $35 a month, while Postmark's slider reads $55 on Basic, $60.50 on Pro and $66 on Platform at the same volume. At 10,000 emails the two are level at $15. For most B2B SaaS teams with a single product and a modest volume, Postmark is the better default; for teams that validate signups or parse inbound mail by rule, it is Mailgun.

Postmark

Three plans priced on one volume slider, a transactional stream that never mixes with broadcast traffic, and a 45-day activity history on Basic.

Mailgun

Four plans from a 100-emails-a-day free tier to Scale, with validation, routes, HMAC-signed webhooks and US or EU sending from one account.

These two services look interchangeable from the send call, and that is where teams get surprised. The difference sits around the send: how long you can look a message up afterwards, how an inbound reply reaches your code, how your server proves a webhook came from the vendor, and what happens when marketing traffic and password resets share a pipe. Read the verdict as a statement about that surrounding machinery, not about whether either one can deliver an email.

Quick comparison

Decision area Postmark Mailgun What to verify
Entry plan Free: 100 emails a month, no overages. Basic from $15 a month for 10,000 emails. Free: 100 emails a day, one custom sending domain, one day of log retention. Basic from $15 a month for 10,000 emails. Count your test traffic: Postmark free stops at 100 emails in a month, Mailgun free resets daily, so a staging environment burns through Postmark free much sooner.
Price at 50,000 emails Basic $55, Pro $60.50, Platform $66 a month (slider readout) Foundation $35 a month after a free first month The gap is $20 to $31 a month. Decide whether the 45-day history and stream separation on the Postmark side are worth $240 to $372 a year to you.
Price near 125,000 emails Basic $115, Pro $126.50, Platform $138 a month at the 125,000 stop Foundation $75 and Scale $90 at 100,000; Scale $215 at 250,000 There is no shared stop here, so request a Mailgun quote for your exact volume instead of interpolating between $90 and $215.
Overage per 1,000 emails Basic $1.80, Pro $1.30, Platform $1.20 Basic from $1.80, Foundation from $1.30, Scale from $1.10 Mailgun words its rates as "from", so a burst month may bill differently from the headline; check a recent invoice.
Message history 45-day retention on Basic, adjustable up to 365 days; custom activity retention add-on from $5 a month One day on Free and Basic, five days on Foundation, 30 days on Scale Look at how old your oldest support ticket about a missing email usually is; if it is more than five days, Foundation history is too short.
Webhook authentication Basic HTTP auth in the URL and IP allowlisting; no HMAC signature HMAC-SHA256 signature over timestamp and token, keyed with an account-wide signing key If your security review requires signed payloads, Postmark fails that item and you will need a gateway or an allowlist to satisfy it.
Inbound email One JSON POST per message to the server webhook; attachments total up to 35 MB Routes with priority, match_recipient, match_header and catch_all filters, and forward, store or stop actions Send a reply with an attachment and a plus-address to each service and check the payload your code receives.
Address validation No validation product; Postmark suggests keeping a validator such as Kickbox Single and bulk validation API with deliverable, undeliverable, do_not_send, catch_all and unknown results; 5,000 validations included on Scale Run 500 real signup addresses through validation before you buy to see what share lands in catch_all or unknown.
Dedicated IP From $50 a month per IP; for customers sending 300,000 emails a month or more, on Pro or higher One IP included with Foundation 100k, Growth and Scale; extra IPs $59 a month each A dedicated IP is only worth having if you send steadily; ask each vendor about warm-up for your expected daily peak.
Regions Postmark's pricing page does not state a hosting region Send through the US or the EU from a single account If you hold EU customer data, ask both vendors for their data processing addendum and sub-processor list before you sign.

Postmark prices on one slider with stops at 10,000, 50,000, 125,000 and 300,000 emails, and Mailgun prices by named plan with its own published points at 10,000, 50,000, 100,000, 250,000 and 500,000. The two ladders only meet at 10,000 and 50,000, so above that the table compares neighbouring stops and says so. Neither vendor publishes a per-thousand rule that would let you price a volume in between, so ask for a quote or move the slider on the vendor's page before you budget a number that is not in the table.

Feature comparison

Feature Postmark Mailgun
Single and batch send

POST /email for one message and POST /email/batch for up to 500 messages or 50 MB per call; a batch returns 200 even when single messages fail, so read each ErrorCode.

One messages call with a to list of up to 1,000 recipients and recipient-variables so each person gets an individual message; without recipient variables every recipient sees every address.

Template language

Mustachio syntax with variables, conditionals and loops, sent by TemplateAlias plus a TemplateModel; templates work only through the API, not through SMTP.

A customised Handlebars with if, unless, each, with and equal helpers; send with the template name and t:variables.

Template storage limits

Templates live on each server and can be copied between servers; layouts let several templates share one frame.

Account-level templates are capped at 100 templates and 40 versions per template, with the same cap per sending domain; templates must be created separately in each region.

Recipient and size limits

50 recipients across To, Cc and Bcc per message; Postmark's migration guide gives 10 MB as the outbound limit including attachments.

Send options starting with o:, h:, v: or t: are limited to 16 KB in total; Postmark's guide puts Mailgun's outbound message limit at 25 MB, so confirm that figure with Mailgun.

Transactional against broadcast

Message streams: transactional and broadcast traffic do not mix, including IP ranges, and a transactional stream does not accept bulk sends. Omit the stream and the message goes to the default transactional stream called outbound.

No stream concept; you separate traffic with sending domains or subdomains and, per Postmark's migration guide, IP pools on the Mailgun side.

Unsubscribe handling

Required on broadcast streams; transactional streams default to none. Unsubscribes arrive as suppressions with the reason ManualSuppression.

Unsubscribes recorded when a recipient clicks a Mailgun-generated link, per domain, with tags; the list can be imported by CSV.

SMTP

smtp.postmarkapp.com for transactional and smtp-broadcasts.postmarkapp.com for broadcast, selected with the X-PM-Message-Stream header; ports 25, 587 and 2525, not 465.

smtp.mailgun.org on ports 25, 465, 587 and 2525 with per-domain credentials; Mailgun recommends 587.

Webhook events

Delivery, bounce, spam complaint, open, click, subscription change and inbound, each configured on its own.

accepted, delivered, temporary_fail, permanent_fail, opened, clicked, unsubscribed and complained, at account or domain level.

Webhook retries

Outbound webhooks retry at 1, 5, 10, 10, 10 and 15 minutes after the previous attempt, then stop; 5xx, 408, 429 and network errors are retried, other 4xx are dropped.

A 200 ends delivery, a 406 rejects without a retry, anything else is retried with exponential backoff over 8 hours.

Inbound processing

JSON only, never raw MIME; up to 10 retries from 1 minute to 6 hours; StrippedTextReply holds the parsed reply text when In-Reply-To or References is present.

Forward posts a parsed message to a URL, JSON if the URL ends in json; store keeps the message for later retrieval; stop ends route evaluation.

Validation

Not offered.

Single address check returns a result and a risk level of high, medium, low or unknown, with reasons such as no_mx, mailbox_does_not_exist and mailbox_is_disposable_address.

Pricing and operating cost

Postmark

Free plan with 100 emails a month and no overages, meant for testing an integration. There is no trial of the paid plans on the pricing page.

The free plan is 100 emails in total per month with no overage allowed, so a busy staging environment can lock you out of test sends. The plan you pick sets your overage rate: $1.80, $1.30 or $1.20 per 1,000, so a team that regularly exceeds its slider stop should price Pro or Platform, not Basic. Postmark's migration guide lists no scheduled delivery, no email validation and a 50-recipient limit per message, so those jobs move into your own code or another service. Dedicated IPs start at $50 a month per IP and are limited to Pro or higher accounts sending 300,000 emails a month or more.

Mailgun

Free plan with 100 emails a day, one custom domain and one day of log retention. Foundation and Scale are free for the first month, then $35 and $90 a month.

Free and Basic keep one day of logs and Foundation five, so an investigation that starts a week after a complaint has nothing to look at below Scale. Validation beyond the 5,000 included on Scale is billed per 100 addresses; the pricing page lists overage from $0.80 per 100 on Scale and $1.20 per 100 on Basic and Foundation. Extra dedicated IPs cost $59 a month each, and templates must be recreated in every region you use. The Foundation and Scale prices of $35 and $90 apply after a free first month, so the first invoice is not the number to budget from.

Tier or usage case Postmark Mailgun
Free $0

No overages are allowed, so the 101st email in a month is rejected rather than billed.

$0

Limits are one custom sending domain and one day of log retention.

10,000 emails a month Basic $15, Pro $16.50, Platform $18

All three plans start at 10,000 emails; Basic keeps 45 days of history. Overage is $1.80, $1.30 and $1.20 per 1,000.

Basic from $15

Basic keeps one day of logs. Extra emails are from $1.80 per 1,000.

50,000 emails a month Basic $55, Pro $60.50, Platform $66

Slider readout dated 2026-10-07. The yearly total is $660, $726 or $792.

Foundation $35

Five days of log retention; extra emails from $1.30 per 1,000. The yearly total is $420 once the free first month is ignored.

100,000 to 125,000 emails a month At 125,000: Basic $115, Pro $126.50, Platform $138

Postmark has no 100,000 stop; its next stop above 50,000 is 125,000.

At 100,000: Foundation $75, Scale $90

Scale adds 30 days of logs, 5,000 validations and a dedicated IP.

250,000 to 300,000 emails a month At 300,000: Basic $245, Pro $269.50, Platform $294

A dedicated IP, from $50 a month, is open to customers at 300,000 emails or more on Pro or higher.

At 250,000: Scale $215

The 500,000 point is $400 a month, one dedicated IP included, extra IPs $59 each.

What each plan costs at 10,000, 50,000 and 125,000 emails

At 10,000 emails a month the bill is the same on the entry plans: Postmark's pricing page lists Basic at $15 and Mailgun's pricing page lists Basic from $15. The extra-email rate is $1.80 per 1,000 on both. What differs is what the $15 buys: Postmark Basic carries a 45-day data retention, and Mailgun Basic keeps one day of logs. If anyone on your team ever opens the activity feed to answer a customer, the retention line is the real price difference at this size.

At 50,000 emails Mailgun is cheaper: Foundation is $35 a month, $420 over twelve months. Postmark's slider reads $55 on Basic, $60.50 on Pro and $66 on Platform, which is $660, $726 and $792 over twelve months. The premium is therefore $20 a month ($240 a year) for Basic, $25.50 ($306) for Pro and $31 ($372) for Platform. Foundation also adds five days of log retention against one on Basic, but Postmark Basic still has nine times that, at 45 days.

At 125,000 emails Postmark reads $115 on Basic, $126.50 on Pro and $138 on Platform. Mailgun's published points are 100,000 and 250,000: Foundation $75 and Scale $90 at 100,000, then Scale $215 at 250,000. Because the points differ, the honest statement is a range: you pay $115 to $138 on Postmark for a volume that Mailgun would price somewhere between $90 and $215, and the exact figure needs a Mailgun quote or a slider check on its page.

Moving up to 300,000 emails on Postmark costs $245 (Basic), $269.50 (Pro) or $294 (Platform). Add the cheapest dedicated IP, from $50 a month, and a Pro account lands at $319.50. On Mailgun, Scale at 250,000 is $215 with one dedicated IP included, and Scale at 500,000 is $400 with the same IP. At this size Mailgun is the cheaper line, and the gap widens if you need a dedicated IP.

Webhooks: Basic Auth and an IP allowlist against a signed payload

Postmark's webhooks overview says outright that Postmark does not currently support HMAC webhook signature verification. Instead you embed Basic HTTP auth credentials in the webhook URL, restrict your firewall to Postmark's published webhook IP ranges (the page warns that the origin IP can change for each attempt) and check the structure of the payload. When you create or edit a webhook, Postmark tests each enabled event type and expects a 200; an event type that keeps failing the check is flagged and its delivery is paused.

Mailgun signs every event. Its securing webhooks guide describes a token, a timestamp and a signature: you join timestamp and token, compute an HMAC-SHA256 with the Webhook Signing Key, and compare the hex digest with the signature. The key is account-wide, covers all domains and is separate from your API key. The guide also suggests caching tokens to reject replays and checking that the timestamp is recent.

Retry behaviour differs too. Postmark retries a failing outbound webhook at 1, 5, 10, 10, 10 and 15 minutes, 51 minutes in all, then stops; it retries 5xx responses, 408, 429 and network failures but drops other 4xx responses such as 400 or 410. Mailgun's retry page says a 200 ends delivery, a 406 rejects without retrying and anything else is retried over 8 hours. If your receiver is down for an hour, Postmark has given up on that event and Mailgun is still trying. For Postmark, deduplicate on the MessageID and the X-PM-Webhook-Trace-Id header, which stays stable across retries.

  • Choose Mailgun if a security review insists on signed webhooks and you do not want to run a gateway.
  • Choose Postmark if an IP allowlist plus Basic Auth over HTTPS satisfies your reviewer and you prefer one JSON body per event type with stable field names.

Inbound email: a JSON webhook or a routing table

Postmark delivers a received message to the webhook URL you set for the server, as one JSON POST with headers, body parts and base64 attachments, per its inbound documentation. The total of all attachments may not exceed 35 MB, Postmark waits two minutes for your response, and a non-200 reply schedules up to 10 retries growing from one minute to six hours; a 403 stops the retries. Fields such as StrippedTextReply (English only, needs In-Reply-To or References) and MailboxHash for plus-addressing suit a support or reply-by-email feature.

Mailgun puts the decision logic on its side. A route has a priority, a filter (match_recipient, match_header or catch_all) and actions (forward, store, stop). Lower priority numbers run first, every matching route runs unless a stop action cuts it short, and filter and action fields are limited to 4 KB. A forward to a URL ending in json posts application/json; otherwise it posts form data, switching to multipart when there are attachments, per the route actions page. Mailgun retries a failing forward over 8 hours.

In practice, if every inbound address goes to the same handler, Postmark's single webhook is less to configure. If you want support@ to go to a helpdesk, billing@ to a parser and everything else to be stored for a week, Mailgun's routes do that without a custom router in your own app.

Address validation, suppressions and what you keep in your own code

Mailgun sells validation next to sending. The single validation documentation describes a request for one address that returns a result of deliverable, undeliverable, do_not_send, catch_all or unknown, a risk of high, medium, low or unknown, and reasons such as no_mx, mailbox_does_not_exist, mailbox_is_disposable_address and mailbox_is_role_address, with a did_you_mean suggestion for likely typos. Scale includes 5,000 validations; beyond that the pricing page lists overage from $0.80 per 100 on Scale. Validating 20,000 signup addresses on Scale therefore leaves 15,000 billable, which is 150 blocks of 100 and at least $120 at that rate.

Postmark has no counterpart; its own migration guide suggests keeping Mailgun's validator or using a service such as Kickbox. What Postmark does offer is per-stream suppression handling: its Suppressions API can list, create and delete suppressions, and a Subscription Change webhook fires when a hard bounce, spam complaint or manual suppression changes. A spam-complaint suppression cannot be reactivated through the UI or API, so a wrongly suppressed customer means a support ticket to Postmark.

Mailgun keeps separate bounce, complaint and unsubscribe lists per domain and accepts CSV imports of up to 25 MB for unsubscribes and complaints through its API. If a message goes to an address on one of those lists, Mailgun drops it and stops trying.

Moving from Mailgun to Postmark

Details follow Postmark's own Mailgun migration guide, which also records the limits you will hit: 50 recipients per message, a 10 MB outbound limit, no scheduled delivery, inbound only as JSON, and no equivalent of mailing lists or IP pool management.

  1. Create a Postmark server for each environment, because a server holds the activity, API tokens, templates and the inbound address; domains and sender signatures belong to the account and can be used by any server.
  2. Verify the sending domain with DKIM and a custom Return-Path, and keep Mailgun live meanwhile. DKIM selectors are unique to each provider, so both can sign during the cutover. Merge the two SPF includes into one record rather than publishing two SPF records.
  3. Decide the stream for each mail type. Receipts, resets and alerts go to the transactional stream (the default, outbound); newsletters or product announcements go to a broadcast stream, which needs unsubscribe management.
  4. Remap the payload: Mailgun o:tag and v: variables become Tag and Metadata, html and text become HtmlBody and TextBody, and the domain SMTP credentials become the Postmark server token used as username and password. There is no raw MIME send and no scheduled delivery.
  5. Convert Handlebars templates to Mustachio, upload them through the Templates API or dashboard, and send by TemplateAlias and TemplateModel. Remember that templates do not work over SMTP.
  6. Replace each Mailgun route with the inbound webhook, and move any routing rules into your handler. Rewire event webhooks: bounces and spam complaints both arrive in the Bounce webhook, and unsubscribes arrive in Subscription Change. Swap signature checking for Basic Auth plus an IP allowlist.
  7. Export the Mailgun suppression lists and add them to the right Postmark stream through the Suppressions API, then keep a replacement for validation in your signup flow. Run the low-risk mail first and raise the share over a week.

Moving from Postmark to Mailgun

The send-call differences are small. The behavioural differences are the ones that cause incidents: no message streams to keep marketing away from receipts, shorter history on lower plans and signed rather than Basic-auth webhooks. Test the first two with a week of shadow traffic before the final DNS switch.

  1. Add each sending domain in Mailgun and publish its DNS records. Choose the US or EU region first, because templates are created per region and cannot be shared across them.
  2. Create SMTP credentials per domain if you send by SMTP, or use the API key and the messages endpoint if you send by API. Postmark's Tag and Metadata map onto Mailgun's o:tag and v: variables.
  3. Rewrite Mustachio templates as Mailgun Handlebars using the if, unless, each, with and equal helpers, upload them as account-level or domain-level templates, and send with the template name and t:variables. Mind the cap of 100 templates and 40 versions per template.
  4. Replace the Postmark webhooks with Mailgun event webhooks and verify the HMAC signature with the Webhook Signing Key. Drop the Basic Auth credentials from the URL, and keep dedup logic keyed on Mailgun's own message identifier.
  5. Rebuild inbound handling as routes. Where Postmark gave you one JSON POST, decide which recipients forward to which URL, set priorities, and add a stop action to keep catch-all routes from also firing.
  6. Export suppressions from Postmark (the stream's Suppressions tab exports JSON) and import unsubscribes and complaints into Mailgun with the CSV import endpoints, which accept files up to 25 MB.
  7. Check log retention. A Basic plan keeps one day of logs, so if you rely on Postmark's 45-day activity search for support, start on Scale or export events through webhooks into your own store.

Pros and cons

Postmark

Pros

  • Transactional and broadcast traffic are kept apart by design, including IP ranges, and the default stream is transactional.
  • 45-day message history on Basic, adjustable up to 365 days.
  • One JSON POST per inbound message with parsed reply text and a 35 MB attachment total.
  • Per-stream suppression API and a Subscription Change webhook for syncing with your own database.
  • Template syntax with conditionals and loops, and layouts shared across templates.

Cons

  • No HMAC webhook signature; Basic Auth and IP allowlisting are the options.
  • $55 to $66 at 50,000 emails against Mailgun's $35 Foundation.
  • No address validation, no scheduled delivery, and a 50-recipient limit per message.
  • Outbound webhooks give up after 51 minutes of retries.

Mailgun

Pros

  • Signed webhooks using HMAC-SHA256 and an account-wide signing key.
  • Inbound routes with priorities, filters and forward, store and stop actions.
  • Built-in address validation, with 5,000 checks included on Scale.
  • US or EU sending from a single account, and a dedicated IP included from Foundation 100k upward.
  • Lower price than Postmark at 50,000 emails: $35 on Foundation against $55 to $66.

Cons

  • One day of log retention on Free and Basic, five on Foundation.
  • Overage rates are published as 'from' figures, which makes a burst month harder to predict.
  • Templates are per region and capped at 100 templates and 40 versions each.
  • No equivalent of Postmark message streams; separation is by domain or IP pool.

Who should choose what?

B2B SaaS sending receipts, resets and invite emails at 50,000 a month

One product, one engineer on call, a support team that looks up message history when customers write in.

Recommendation: Postmark. Postmark Basic at $55 keeps 45 days of activity and keeps transactional mail on its own stream. The $20 a month premium over Mailgun Foundation is small next to the time lost when a five-day log window has already expired.

Signup form that attracts typos and disposable addresses

A free-trial product where bounces from bad addresses are already hurting your sender reputation.

Recommendation: Mailgun. Mailgun's validation API returns a result, a risk level and a did_you_mean hint at signup, and Scale includes 5,000 checks. Postmark has no validation, so you would be buying a second vendor.

Reply-by-email into a support or comments feature

Customers answer notification emails and the reply should land in a ticket thread, with attachments.

Recommendation: Postmark. Postmark posts one JSON body with StrippedTextReply and a MailboxHash for plus-addressing, which maps straight onto a thread ID. Mailgun's routes are more flexible but you will write the same extraction code anyway.

Platform that must prove webhook authenticity to an auditor

A fintech or healthtech customer asks how you verify that delivery events are really from your email provider.

Recommendation: Mailgun. Mailgun signs every webhook with HMAC-SHA256, so verification is a few lines of code. On Postmark you must defend Basic Auth plus an IP allowlist, which Postmark itself says changes between attempts.

High volume at 250,000 to 300,000 emails with a dedicated IP

A product notification stream that justifies its own IP and a steady daily send.

Recommendation: Mailgun. Mailgun Scale at 250,000 is $215 with one dedicated IP included; Postmark at 300,000 is $245 to $294 before a dedicated IP that starts at $50 a month.

The scenarios below are decided by who has to live with the tool: the on-call engineer who debugs a missing reset email, the founder who watches the monthly bill, or the support team that forwards customer replies into a ticket queue. Where the answer flips between those people, the scenario says so.

Final verdict

Choose Postmark if

  • you need weeks of searchable message history without paying for a high plan
  • you want broadcast traffic separated from transactional mail by the product itself
  • inbound mail is one handler, such as reply-by-email, and you want a single JSON payload
  • a webhook secured by Basic Auth and an IP allowlist is acceptable to your security team

Choose Mailgun if

  • you validate signup addresses and want it from the same vendor as sending
  • your inbound mail needs routing rules by recipient or header
  • your reviewer requires signed webhooks
  • you send 50,000 or more a month and the $20 to $31 a month saving matters, or you need EU sending

FAQ

How much do Postmark and Mailgun cost at 50,000 emails a month?

Postmark's slider reads $55 on Basic, $60.50 on Pro and $66 on Platform; Mailgun's Foundation plan is $35 a month after a free first month. Over twelve months that is $660 to $792 against $420. At 10,000 emails both start at $15.

Does Postmark verify webhooks with a signature like Mailgun?

No. Postmark's documentation says it does not currently support HMAC signature verification and points you to Basic HTTP auth credentials in the URL and an IP allowlist. Mailgun signs each request with HMAC-SHA256 over the timestamp and a token, using an account-wide signing key.

Which one keeps message history longer?

Postmark lists 45-day data retention on Basic and allows up to 365 days, with a custom retention add-on from $5 a month. Mailgun keeps one day of logs on Free and Basic, five on Foundation and 30 on Scale.

Can Postmark validate email addresses?

No. Postmark's migration guide has no counterpart to Mailgun's validation and suggests keeping a validator or using a service like Kickbox. Mailgun's single and bulk validation return deliverable, undeliverable, do_not_send, catch_all or unknown, with a risk level.

How hard is it to switch from one to the other?

The send call is a rewrite of a few fields, but plan for a week of parallel running. Templates change syntax between Mustachio and Handlebars, webhook authentication changes shape, and inbound handling moves between one JSON webhook and routes. Postmark publishes a Mailgun migration guide that lists the limits.