Postmark setup
Transactional-grade delivery with a real suppression API. Postmark splits mail into message streams, and Mimeo routes every send to the right one automatically.
On a fresh Mimeo, the setup wizard walks you through all of this in order — provider prep, keys, webhooks, senders, domains. This page is the full Postmark reference, and where to look when you change something later.
What you need
- A Server API token (Postmark → your server → API Tokens tab).
- A confirmed sender signature, or a verified DKIM domain. Postmark refuses every send without one. New Postmark accounts can also only deliver to addresses on the sender's own domain until Postmark approves the account.
- A Broadcasts-type message stream (your server → Message Streams). Postmark creates one on every server with the ID
broadcast— Mimeo assumes that ID by default, so there's nothing to do unless you made your own stream. - A webhook secret — any long random value you generate. Postmark can't sign webhooks, so this secret in the webhook URL is how your Mimeo knows a request is Postmark's.
- An Account API token (Postmark → Account → API Tokens). This is how Mimeo reads your verified domains and sender signatures back from Postmark — the list that send-time domain enforcement checks against — so without it, nothing sends.
Postmark verifies From identities in two shapes, and Mimeo honors both: a DKIM-verified domain covers every address on it, while a confirmed sender signature covers exactly that one address. Mimeo checks the from address against that list before every send — an email from an unverified sender holds in the queue rather than bouncing off Postmark. The other half of the setup is connecting the same domain in Mimeo under Settings → Domains & senders; see Sending domains & senders.
Setting it up
- Confirm your sender signature in Postmark, and create the Broadcasts-type stream.
- In Mimeo: Settings → Provider, select Postmark. Paste the server token, the account token, the broadcast stream ID, and your webhook secret, then Save & connect.
- Press Verify connection. It validates the tokens, checks the configured stream exists and really is a Broadcasts-type stream, refreshes the list of domains and sender signatures Postmark has verified, and flags anything on the Postmark side that's configured against the grain.
- Connect your sending domain and add your senders under Settings → Domains & senders — the walkthrough.
- Set up webhooks (below).
Credentials are encrypted in your Mimeo's database. Never in a config file, never in an environment variable — so switching providers is a Settings change rather than a deploy.
Message streams
Postmark requires marketing mail to ride a Broadcasts-type stream, and keeps
transactional mail on the default outbound stream. Mimeo
routes automatically: broadcasts, sequences, flows and test sends go to your
configured broadcast stream; transactional mail — password resets, operator
alerts — rides outbound. Nothing to choose per send.
Webhooks
Postmark states plainly that it can't sign webhooks, so verification is the webhook secret carried in the URL. Webhooks are configured per stream:
- In Mimeo: Settings → Provider → Postmark, press Generate next to the webhook secret. The Webhook URL box below the credentials assembles the complete URL — copy it right then, because a saved secret is never shown again (Generate again any time to rotate it).
- In Postmark: your server → your broadcast stream → Settings → Webhooks → Add webhook, and paste that URL (it has the shape
https://your-mimeo.com/webhooks/email/postmark?secret=…). Leave custom headers and basic auth empty — the secret in the URL is the verification. - Check Delivery, Bounce, Spam Complaint and Subscription Change. Leave Open and Click unchecked — tracking is Mimeo's.
- Add the same webhook on the
outboundstream (Bounce and Delivery) if you want delivery truth for transactional mail too. - Back in Mimeo, press Save & connect so the secret in the URL and the saved secret match.
A request with a wrong or missing secret is refused. Rotate the secret by updating both sides.
Leave open and click tracking off
Postmark can track opens and clicks at the server level. Don't turn it on. The adapter forces tracking off on every message it sends anyway, and Verify connection flags a server that has it switched on. Tracking is Mimeo's — one dataset, with bot filtering, tied to the exact send.
The unsubscribe links
Broadcast streams default to Postmark-managed unsubscribe handling: Postmark appends its own unsubscribe link to the footer of every broadcast-stream message and replaces the RFC 8058 unsubscribe headers with its own. Mimeo's emails already carry their own unsubscribe link, so recipients see two.
Nothing breaks. An unsubscribe through Postmark's page comes straight back via the Subscription Change webhook and suppresses the person locally, so the two links agree. But the clean setup is one link — yours:
- Ask Postmark support to enable custom unsubscribe handling for your account. It's permission-gated — the API refuses to set it self-serve.
- Set the broadcast stream to Manage unsubscribes on your own.
Postmark then injects nothing: one visible unsubscribe link (Mimeo's), and Mimeo's one-click headers ride through intact, attributing every unsubscribe to the exact email it came from. Until that's done, Verify connection reminds you.
What Postmark does, and what Mimeo does
| Postmark | Your Mimeo |
|---|---|
| Delivers the message | Decides who gets it and when |
| Reports delivery, bounces, complaints and subscription changes by webhook | Owns the suppression list and checks it before every send |
| Keeps a per-stream suppression list Mimeo reads and writes | Compiles the HTML, from your own layouts |
| — | Tracks opens and clicks |
| — | Sets the RFC 8058 unsubscribe headers, and hosts the one-click target |
| — | Paces the sending |
Suppression flows both ways
An unsubscribe in Mimeo is pushed to Postmark as a manual suppression on the broadcast stream, so Postmark's own list agrees with yours. And Postmark's suppression list can be read back per address, which keeps the periodic suppression checks running — a suppression that happens Postmark-side doesn't stay a secret. One asymmetry worth knowing: Postmark refuses to delete spam-complaint suppressions, so a resubscribe here can't clear one there. The standing guard and Postmark's list both keep that address unmailed, which is the right outcome for a complaint.
No bulk pipeline — which is fine
Postmark has no broadcast-campaign API, so Mimeo can't hand a broadcast off to it. Broadcasts fan out through the ordinary paced queue instead. That's the better path anyway: guards apply, send windows apply, tracking applies, and every broadcast gets a full report.
Switching to Postmark from another provider
It's a Settings change. Pick the new provider, enter its credentials, verify, save. Your people, suppression list, flows, sequences, emails and history all stay exactly where they are — none of it was ever the provider's.
See also: Sending providers · Postmark API notes