Postmark and Viesti compared
Postmark details come from its pricing page and documentation, linked in each row. Checked 26 September 2026. Prices in US dollars.
| Viesti | Postmark | |
|---|---|---|
| Entry paid plan | $5/month for 50,000 emails per billing cycle | Basic: $15/month for 10,000 emails. Pro ($16.50) and Platform ($18) also start at 10,000. |
| Free plan | 75 emails per UTC day and 2,000 per UTC month, with no time limit | Developer plan: 100 emails/month with no expiry and no overage; no plan between 100 and 10,000 emails |
| Extra emails | $0.10 per 1,000 ($0.0001 per email); paid sending has no volume cap | $1.80 per 1,000 on Basic, $1.30 on Pro, $1.20 on Platform |
| Sending domains | Up to 20 per workspace on every plan | 5 on Basic, 10 on Pro, unlimited on Platform |
| SMTP | smtp.viesti.email, port 587 (STARTTLS) or 465 (implicit TLS); AUTH PLAIN with username apikey and your API key as the password |
smtp.postmarkapp.com, ports 25, 2525 or 587 with STARTTLS; the server API token as username and password, or an SMTP token |
| HTTP API | POST /v1/send with JSON from, to, subject, text and html, or a whole MIME message in raw; no SDKs, no batch endpoint |
REST API with single and batch sends; official libraries |
| IP pools | Separate shared pools for free and for paid workspaces; marketing mail is not accepted on any plan | Transactional and broadcast message streams send from separate IP pools |
| Dedicated IPs | Dedicated plan: an IP pool of your own with hands-on warmup, custom pricing, up to 120,000 emails an hour and 2,000,000 a day; ask [email protected] | $50 per IP per month, for senders of at least 300,000 messages a month, on Pro plans or higher |
| Domain authentication | Ownership TXT, DKIM key delegated by CNAME (replaced without DNS changes), include:spf.viesti.email in SPF and a DMARC policy; optional Return-Path CNAME for SPF alignment |
DKIM TXT record (1024-bit keys); custom Return-Path CNAME to pm.mtasv.net |
| Open and click tracking | None | Open and link tracking, enabled per server or per message |
| Webhooks | None; each recipient's outcome is in the dashboard's Activity log | Delivery, bounce, spam complaint, open, click, subscription change and inbound |
| Templates | None; send rendered HTML and text | Responsive templates and a template editor |
| Inbound email | None | Inbound processing on Pro and Platform |
| Message history | Activity log; message bodies kept 30 days, delivery events 180 days | 45 days by default; up to 365 days on Pro and Platform |
Choose Postmark if
- Your app reacts to deliveries, bounces, complaints, opens or clicks through webhooks.
- You want templates stored and rendered by the provider.
- You process inbound email in your app.
- You also send broadcasts, such as product updates or digests, and want them on the same account on separate IPs.
- You want official libraries, batch sending or a sandbox mode for tests.
- You need several users with user roles on one account, or message content kept longer than Viesti's 30 days: Postmark keeps 45 days by default and up to 365 on Pro and Platform.
Choose Viesti if
- You send only transactional mail and price matters: $5 a month for 50,000 emails, then $0.10 per 1,000, against $15 for 10,000, then $1.80 per 1,000, on Postmark Basic.
- You send more than 100 and at most 2,000 emails a month, no more than 75 a day. That fits Viesti's free plan; Postmark has no plan between its 100-email free tier and 10,000 emails.
- You send from many domains: up to 20 per workspace on every Viesti plan.
- You want your provider to refuse marketing mail rather than route it to a separate stream.
- Delivery status in a dashboard is enough, and you need no webhooks, templates, tracking or inbound email.
Migrate from Postmark to Viesti
1. Create a workspace and an API key
Sign in with GitHub or Google; the first sign-in creates your workspace. Create an API key on the Credentials page and keep it in your secret store, for example as VIESTI_API_KEY. The quickstart walks through the whole setup.
2. Verify your sending domain
Add the domain on the Sending domains page and publish the records it lists (details in DNS records):
- TXT
_viesti.yourdomain.com, which proves ownership. - CNAME
v1._domainkey.yourdomain.com, which delegates DKIM signing todkim.viesti.email. include:spf.viesti.emailin the domain's SPF record. The page shows a merged value that keeps the includes you already publish; a domain must have only one SPF record.- A DMARC record at
_dmarc.yourdomain.com, only if no DMARC policy covers the domain yet. - Optional: CNAME
viesti.yourdomain.comtobounce.viesti.email, so bounces return to your own domain and SPF aligns with DMARC.
Viesti's records use their own names, so Postmark's DKIM and Return-Path records stay in place and both services can send while you switch.
3. Switch your SMTP settings
Host: smtp.viesti.email
Port: 587 (STARTTLS) or 465 (implicit TLS)
Username: apikey
Password: your Viesti API key
Viesti accepts AUTH PLAIN only, and only after TLS; mail libraries pick it automatically. To try the settings before you deploy, send a test message with curl:
printf 'From: [email protected]\r\nTo: [email protected]\r\nSubject: Viesti test\r\n\r\nSent through Viesti.\r\n' |
curl -sS --ssl-reqd smtp://smtp.viesti.email:587 \
--user "apikey:$VIESTI_API_KEY" \
--mail-from [email protected] --mail-rcpt [email protected] \
--upload-file -
The command prints nothing when Viesti accepts the message, which then shows in the Activity log; a rejected login or recipient prints curl's error. SMTP covers ports, limits and error replies.
Postmark accepts CRAM-MD5, DIGEST-MD5, PLAIN and LOGIN; if you pinned one of the others, switch it to PLAIN. Remove Postmark headers such as X-PM-Message-Stream, X-PM-Tag and X-PM-Metadata-*: Viesti does not read them and delivers them to recipients unchanged.
4. Or switch your API calls
Postmark's POST /email takes From, To (comma-separated), Subject, TextBody and HtmlBody. They map to Viesti's from, to, subject, text and html.
Viesti's endpoint is POST https://viesti.email/v1/send with Authorization: Bearer $VIESTI_API_KEY and a JSON body of from, to (an array of up to 50 addresses), subject, text and html. It rejects any other field with 400 invalid JSON. For Cc, Bcc, Reply-To, custom headers or attachments, build the MIME message yourself, send it in raw, and list every recipient, Cc and Bcc included, in to. See the HTTP API reference.
5. Replace what Viesti does not do
- Templates: render the message in your app and send the finished HTML and text.
- Webhooks: there are none. The Activity log shows each recipient's outcome, and hard bounces and complaints add the recipient to your suppression list automatically; see bounces and suppressions.
- Open and click tracking: Viesti does not rewrite links or add pixels, so there is nothing to configure or remove.
- Inbound email and broadcasts: keep them on Postmark or move them to another service; Viesti handles neither.
6. Carry over suppressions
Export the addresses your current provider suppresses (hard bounces, complaints, unsubscribes) and add each one on Viesti's Suppressions page with a reason. The page adds one address at a time. Viesti then refuses mail to those addresses when you submit it.
7. Remove Postmark's records
Once nothing sends through Postmark, wait a few days for late bounces, then delete Postmark's DKIM TXT record and the Return-Path CNAME that points to pm.mtasv.net (named pm-bounces by default). Keep your DMARC record; Viesti checks it.