How to Send Bulk Email with Postmark's New Bulk API
Sending the same product announcement to 10,000 users through a transactional email API has always been the ugly part of the job. You chunk the list into batches of 500, duplicate the entire HTML body into every single message object, build retry logic for the calls that fail, and write your own throttling so Gmail doesn’t start deferring you halfway through. The email itself takes ten minutes to write. The plumbing around it takes a week and then breaks quietly at 2am.
Postmark shipped a fix for this. The Bulk API, now live and flagged as new across Postmark’s product navigation, takes one message definition plus a recipient list and compiles the individual messages server-side. One call, thousands of emails, and Postmark handles the pacing. The payload difference is not marginal — duplicating a 5 KB HTML body across 10,000 message objects is 50 MB of upload; defining it once is a few hundred kilobytes.
This guide covers what you need before you start, how the send actually works, what it costs on top of your existing plan, and the specific limits that will bite you if nobody warned you about them.
What the Bulk API Actually Does
The old approach used Postmark’s /email/batch endpoint. Batch was built for a different problem: sending different messages to different recipients in one request. Because each message carries its own content, the payload grows linearly with your list, and Postmark caps the endpoint at 500 messages per request. Sending to 10,000 people meant 20 calls, your own chunking logic, and your own rate limiting.
The new /email/bulk endpoint inverts that. You set Subject, HtmlBody, TextBody, and any attachments once at the request level. Then you pass a Messages array where each entry is a recipient plus a TemplateModel of personalization variables. Postmark expands that into individual messages on its side and meters the send at whatever rate the receiving mailbox providers are currently tolerating.
Three things follow from that design, and they’re the whole reason to care:
- The payload shrinks by orders of magnitude. Content is transmitted once, not once per recipient.
- You delete your rate-limiting code. Postmark throttles automatically based on provider conditions.
- Attachments are defined once and sent to everyone, instead of being re-uploaded with every message.
Postmark
Transactional email with exceptional deliverability, now by ActiveCampaign
Postmark, originally built by Wildbit and acquired by ActiveCampaign in 2022, is a transactional email service laser-focused on deliverability and speed. It consistently achieves...
Prerequisites
Four things need to be true before your first call.
1. Your account needs the Bulk API switched on. This is the step people trip over. The Bulk API is available on every Postmark plan including the free Developer tier, but it is not self-serve — you have to email support@postmarkapp.com and ask them to enable it. Postmark says turnaround is usually a few hours. Budget for a day if you’re sending on a deadline.
2. You need a Broadcast Message Stream. The Bulk API only works with Broadcast streams, not transactional ones. If you’ve only ever used Postmark for password resets, you may not have a Broadcast stream yet. Create one in the dashboard; it takes about thirty seconds and there’s no additional charge.
3. Your sending domain needs DKIM and Return-Path configured. This is table stakes for any Postmark stream, but broadcast traffic is scrutinized harder than transactional traffic by every mailbox provider. If your authentication is half-configured, bulk is where you’ll find out.
4. Your content needs to pass Postmark’s policy. Postmark’s content rules are stricter than most competitors’. Purchased lists, cold outreach, and anything resembling unsolicited marketing will get your account reviewed, Bulk API or not. This endpoint is for people you already have a relationship with.
Step by Step: Your First Bulk Send
Step 1 — Define the message once
Set everything that stays constant at the top level of the request body: From, Subject, HtmlBody, TextBody, MessageStream, and attachments. Note that {{FirstName}}-style variables can appear anywhere in these fields, including the subject line.
Step 2 — Build the recipients array
Each entry in Messages needs a To address and a TemplateModel object holding that recipient’s variables. Cc and Bcc are supported per-recipient. A minimal request looks like this:
POST https://api.postmarkapp.com/email/bulk
{
"From": "updates@yourapp.com",
"Subject": "New feature: {{FeatureName}}",
"HtmlBody": "<html><body>Hi {{FirstName}}, check this out.</body></html>",
"MessageStream": "broadcast",
"Messages": [
{ "To": "user1@example.com",
"TemplateModel": { "FirstName": "Alex", "FeatureName": "Dark Mode" } },
{ "To": "user2@example.com",
"TemplateModel": { "FirstName": "Jordan", "FeatureName": "Dark Mode" } }
]
}
Every official Postmark library supports this — sendBulkEmail() in Node, emails.send_bulk() in Python, deliver_bulk() in Ruby, plus PHP and .NET equivalents. The Bulk API documentation has the full parameter reference.
Step 3 — Watch the 50 MB ceiling
There is no recipient count limit. There is a 50 MB total payload cap, and attachments count against it. Do the arithmetic before you send: a 2 MB PDF attached to a bulk send leaves 48 MB for everything else, which is plenty, because the attachment is only transmitted once. But a 40,000-recipient list with verbose TemplateModel objects can approach the ceiling on its own. If you’re near it, split into two calls.
Step 4 — Poll for status
Postmark returns a bulk request ID. Hit /email/bulk/{bulk-request-id} to get total message count, percentage completed, and a status of Accepted, Processing, or Completed. This is a poll, not a push — there’s no dedicated webhook for bulk-send progress, so if you want a progress bar in your admin panel you’ll be writing a polling loop. Standard Postmark delivery, bounce, and open webhooks still fire per message as normal.
What It Costs
Nothing extra. Messages sent via the Bulk API count against your monthly email allowance at the same rate as any other Postmark message — no per-call fee, no bulk surcharge.
Postmark’s plans, verified July 14, 2026:
- Developer (Free): 100 emails/month, no expiry
- Basic: $15/month for 10,000 emails; $1.80 per 1,000 over
- Pro: $16.50/month for 10,000 emails; $1.30 per 1,000 over
- Platform: $18/month for 10,000 emails; $1.20 per 1,000 over
The overage rate is the number that matters for bulk sending, because a broadcast is exactly the thing that blows past your included volume. The Basic-to-Pro upgrade costs $1.50/month and cuts overage by $0.50 per 1,000 — it pays for itself at roughly 13,000 emails/month. Unused emails do not roll over, and Postmark does not offer annual billing. Confirm current numbers at Postmark’s pricing page before you budget.
One genuine upside: broadcast traffic runs on separate IPs from your transactional traffic at no additional cost. Your password resets don’t inherit the reputation consequences of a newsletter that got a bad complaint rate, and vice versa. Providers that mix both on shared pools can’t offer that.
Bulk API vs Batch API
| Bulk API | Batch API | |
|---|---|---|
| Best for | Same message, many recipients | Different messages per recipient |
| Content | Defined once, personalized with variables | Defined separately per recipient |
| Attachments | Once, sent to all | Included with every message |
| Limit | 50 MB total payload | 500 messages per request |
| Throttling | Automatic | You build it |
| Streams | Broadcast only | Broadcast and transactional |
The rule is simple. One message going to a list? Bulk. Genuinely different messages? Batch. Transactional traffic of any shape? Batch, because Bulk won’t accept it.
Common Mistakes
Assuming it’s enabled. It isn’t. Your first call returns an error until support turns it on. Ask before you need it.
Sending to a stale list. Bulk sending to addresses that haven’t engaged in two years is how you convert a clean sender reputation into a dirty one in a single afternoon. Run the list through validation and drop the non-engagers before the first broadcast, not after.
Treating Postmark as a marketing platform. There is no subscriber management UI, no automation builder, no segmentation, no landing pages, and no visual campaign editor. Postmark gives you an endpoint. Everything upstream of that endpoint — who’s on the list, who unsubscribed, which segment gets which variant — is your application’s problem. If you want that layer, you want an actual marketing tool, not this.
Skipping the text body. Broadcast content without a plain-text alternative gets filtered more aggressively than transactional email does. Always set TextBody.
Where This Leaves Postmark
The Bulk API closes a real gap. Before it, teams running a product-update email through Postmark wrote their own batching layer or moved that traffic to a second vendor. Now the endpoint does the tedious part, and the broadcast stream isolation is a legitimate deliverability argument that SendGrid and Mailgun don’t fully match on shared infrastructure.
But the limitations are real, and Postmark hasn’t hidden them. Broadcast-only means the throughput win doesn’t apply to your highest-urgency traffic. The manual enablement step is friction with no obvious justification. The 50 MB cap is generous but is a cap. And the economics stay where they were: at $1.20–$1.80 per 1,000 overage emails, a million-message broadcast is expensive. Amazon SES charges a fraction of that per email and remains the volume answer for teams with the engineering capacity to run it.
| Feature | Postmark | Twilio SendGrid |
|---|---|---|
| Rating | 4.6/5 | 4/5 |
| Starting Price | $15/mo | $15/mo |
| Free Plan | 100 emails/month, never expires, test integration and side projects | 100 emails/day (60-day trial), Marketing: 100 contacts |
| Founded | 2009 | 2009 |
| Email Templates | 20 | 60 |
| Integrations | 30 | 320 |
| Deliverability Rate | 98.7% | 95.5% |
| Marketing Automation | ✕ | ✓ |
| A/B Testing | ✕ | ✓ |
| Landing Pages | ✕ | ✕ |
| Segmentation | ✕ | ✓ |
| Drag & Drop Editor | ✕ | ✓ |
| SMS Marketing | ✕ | ✕ |
| Ecommerce Features | ✕ | ✓ |
| API Access | ✓ | ✓ |
| Multi-Language | ✕ | ✕ |
| Web Push Notifications | ✕ | ✕ |
| Live Chat | ✕ | ✕ |
| Advanced Analytics | ✓ | ✓ |
SendGrid’s counter-argument is one platform for everything: Essentials starts at $19.95/month covering the 50,000–100,000 emails/month range, with a bundled Marketing Campaigns module that includes the subscriber management Postmark refuses to build. Pro jumps to $89.95/month for up to 2.5M emails. The gap between those two tiers is awkward if you sit in the middle. Mailgun sits between the two, allowing promotional sending outright, with Basic at $15/month for 10,000 emails and Foundation at $35/month for 50,000 — but it mixes transactional and bulk on shared pools, which is precisely the contamination Postmark’s stream separation is built to prevent.
What Success Looks Like
A working bulk send looks like this: one API call returns a bulk request ID in under a second. The status endpoint moves from Accepted to Processing to Completed over the next several minutes — not instantly, because Postmark is deliberately pacing the send. Your bounce rate on the broadcast stream stays under 2%, your complaint rate under 0.1%, and your transactional stream’s delivery metrics don’t move at all, because it’s on different IPs.
If your transactional numbers do move after a broadcast, something is misconfigured — you’re almost certainly sending on the wrong stream.
For the wider field, see the best transactional email services ranking, the Postmark review for the full product assessment, or the Postmark vs SendGrid comparison if those two are your shortlist. Cost at your specific volume is in the Postmark pricing breakdown.
The Bottom Line
The Bulk API is a well-built solution to a narrow problem: one message, many recipients, no plumbing. It costs nothing extra, works on every plan, and inherits Postmark’s broadcast IP separation. If you already send transactional email through Postmark and you’ve been maintaining a batching layer for product announcements, delete it.
It does not turn Postmark into a marketing platform, and it doesn’t help your transactional traffic at all. Those are the two things worth being clear about before anyone on your team gets excited.
Postmark
Transactional email with exceptional deliverability, now by ActiveCampaign
Free plan · from $15/1,000 emails
Pricing verified: Postmark 14 July 2026; SendGrid and Mailgun competitor figures 17 July 2026. Confirm current rates on each provider’s pricing page before budgeting.
Sources
- Postmark — Bulk email API reference — accessed 2026-07-17
- Postmark — Pricing — accessed 2026-07-14
- SendGrid — Email API pricing — accessed 2026-07-17
- Mailgun — Pricing — accessed 2026-07-17
- Amazon SES — Pricing — accessed 2026-07-17
Related Articles
Postmark's KumoMTA Migration: Faster Queue Times and What They Mean for Your Stack
Postmark migrated its sending engine to KumoMTA in 2026. Here's what changed under the hood, what the queue-time numbers mean, and how Postmark now stacks up.
How-ToAmazon SES Agent Skills: AI-Assisted Email Development Explained
Amazon SES now ships open-source Agent Skills for Claude Code and Kiro. Here's how they work, how to install them, and the mistakes they prevent.
How-ToTransactional vs Marketing Email: What's the Difference?
Transactional and marketing emails follow different rules and need different infrastructure. Here's how to tell them apart and choose the right tool for each.