Resend and Viesti compared
Resend details come from its pricing page and documentation, linked in each row. Checked 26 September 2026. Prices in US dollars.
| Viesti | Resend | |
|---|---|---|
| Entry paid plan | $5/month for 50,000 emails per billing cycle | Pro: $20/month for 50,000 emails, no daily limit |
| Free plan | 75 emails per UTC day and 2,000 per UTC month, with no time limit | 3,000 emails/month, at most 100 a day |
| Extra emails | $0.10 per 1,000 ($0.0001 per email); paid sending has no volume cap | $0.90 per 1,000 on Pro |
| Sending domains | Up to 20 per workspace on every plan | 3 on Free, 10 on Pro, 1,000 on Scale |
| SMTP | smtp.viesti.email, port 587 (STARTTLS) or 465 (implicit TLS); AUTH PLAIN with username apikey and your API key as the password |
smtp.resend.com, ports 465 or 2465 (implicit TLS) or 25, 587, 2587 (STARTTLS); username resend, password the API key |
| 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 |
POST /emails with from, to, subject, html and text, plus cc, bcc, reply_to, headers, attachments, tags, scheduled_at, templates and idempotency keys; batch sends of up to 100 |
| Marketing mail | Not accepted | Broadcasts on separate marketing plans: free up to 1,000 contacts, then from $40/month |
| IP pools | Separate shared pools for free and for paid workspaces; marketing mail is not accepted on any plan | Shared IPs by default; managed dedicated pools on request |
| 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] | $30/month add-on on Scale, for senders above 3,000 emails a day |
| 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 at resend._domainkey; MX and SPF TXT on the Return-Path subdomain, send by default; DMARC recommended |
| Open and click tracking | None | Off by default; enabled per domain |
| Webhooks | None; each recipient's outcome is in the dashboard's Activity log | On every plan; 5 endpoints on Pro, 10 on Scale |
| Templates | None; send rendered HTML and text | Stored templates; React Email |
| Inbound email | None | On every plan |
| Message history | Activity log; message bodies kept 30 days, delivery events 180 days | 30 days on Free; other plans: see pricing |
Choose Resend if
- You build email with React Email or want stored templates.
- You need webhooks, inbound email, scheduled sends, batch sends or idempotency keys.
- You also send newsletters or product updates from the same account.
- You need more free volume: 3,000 emails a month and 100 a day, against Viesti's 2,000 and 75.
- You need to choose a sending region, or SOC 2 Type II, which Resend's pricing page lists on every plan.
Choose Viesti if
- Price per email matters: $5 for 50,000 emails, then $0.10 per 1,000, against $20 for 50,000, then $0.90 per 1,000, on Resend Pro.
- You want your provider to refuse marketing mail, so its shared pools carry transactional mail only.
- You send from several domains on the free plan: up to 20 on Viesti, against 3 on Resend Free.
- Your sends use only
from,to,subject,htmlandtext, which carry over by name.
Migrate from Resend 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 Return-Path record is viesti.yourdomain.com, not send, and its DKIM selector is v1, so Resend's 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.
Change the username from resend to apikey along with the host and password, and use port 587 or 465 if you used 25, 2465 or 2587. Remove the Resend-Idempotency-Key header if you set it: Viesti does not read it and delivers it to recipients unchanged.
4. Or switch your API calls
Keep the Bearer header and point requests at Viesti. A basic Resend payload needs two changes: to must be an array, and fields Viesti does not know, such as cc, reply_to, attachments or scheduled_at, must go.
curl https://viesti.email/v1/send \
-H "Authorization: Bearer $VIESTI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"from": "Acme <[email protected]>", "to": ["[email protected]"], "subject": "Your receipt", "html": "<p>Thanks for your order.</p>", "text": "Thanks for your order."}'
A 202 response carries the message id. Viesti has no idempotency keys: if a request times out and you retry it, the recipient can get two copies.
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.
- React Email: render your components to HTML in your app and send the result as
html. - Inbound email and Broadcasts: keep them on Resend 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 Resend's records
Once nothing sends through Resend, wait a few days for late bounces, then delete the resend._domainkey TXT record, the MX and TXT records on the Return-Path subdomain (send by default) and the tracking CNAME if you enabled tracking. Keep any MX records Resend uses to receive mail for the domain if you still receive through it, and keep your DMARC record; Viesti checks it.