Migrate from SendGrid to PostStack
A modern REST API and SDK. Paid plans from €5/month instead of $19.95.
SendGrid is the legacy incumbent — powerful, but its REST surface predates modern conventions. Field names are PascalCase, transactional and marketing live on separate endpoints, and the SDK splits across @sendgrid/mail, @sendgrid/client, and @sendgrid/inbound-mail-parser. PostStack consolidates everything into a single typed SDK with lowercased JSON, idempotency keys, and a unified webhook surface. The migration is a small refactor in code, plus a DNS update for SPF/DKIM/DMARC alignment.
Why switch from SendGrid?
- Paid plans start at €5/month. SendGrid has no tier below $19.95
- Simple, predictable pricing instead of SendGrid's tier-and-add-on model
- IMAP and POP3 mailboxes and DMARC aggregate reports are built in, neither ships in SendGrid
- EU-hosted infrastructure in Helsinki, Finland with GDPR compliance by default
- A modern, typed REST API instead of the SendGrid v3 surface area
Price Comparison
Competitor prices are public list prices (USD) verified May 2026; PostStack prices are in EUR. Figures are approximate after currency conversion — check each provider's pricing page for current rates.
| Volume | SendGrid | PostStack | Savings |
|---|---|---|---|
| 3,000/mo | 60-day trial | €0 | Free forever |
| 10,000/mo | ~$19.95/mo | €5/mo | ~73% |
| 50,000/mo | ~$19.95/mo | €15/mo | ~19% |
| 100,000/mo | ~$89.95/mo | €30/mo | ~64% |
| 500,000/mo | ~$449/mo | €130/mo | ~69% |
| 1,000,000/mo | ~$899/mo | €255/mo | ~69% |
Code Migration
Before (SendGrid)
import sgMail from '@sendgrid/mail';
sgMail.setApiKey(process.env.SENDGRID_API_KEY!);
await sgMail.send({
to: 'user@example.com',
from: 'hello@yourdomain.com',
subject: 'Hello!',
html: '<h1>Welcome!</h1>',
});After (PostStack)
import PostStack from '@poststack/sdk';
const poststack = new PostStack('sk_live_...');
await poststack.emails.send({
from: 'hello@yourdomain.com',
to: 'user@example.com',
subject: 'Hello!',
html: '<h1>Welcome!</h1>',
});Feature Comparison
| Feature | SendGrid | PostStack |
|---|---|---|
| REST API | Yes (v3) | Yes |
| TypeScript SDK | Partial | Yes |
| Webhooks | Yes | Yes |
| Email Templates | Yes | Yes |
| Contact Management | Yes | Yes |
| Open/Click Tracking | Yes | Yes |
| SMTP Relay | Yes | Yes |
| Inbound Email + Webhooks | Yes (Inbound Parse) | Yes |
| IMAP/POP3 Mailboxes | No | Yes |
| Visual Email Builder | Limited | Yes |
| DMARC Aggregate Reports | No | Yes |
| Workflow Automation | Marketing only | Yes |
| Embeddable Signup Forms | Marketing only | Yes |
| EU Data Residency | No | Yes |
| Simple API Design | Complex | Yes |
API Mapping
Side-by-side reference for the most common operations as you migrate.
| Concept | SendGrid | PostStack |
|---|---|---|
| Send transactional email | sgMail.send({ to, from, subject, html }) | poststack.emails.send({ to, from, subject, html }) |
| Field casing | PascalCase legacy fields in v2; mixed in v3 | camelCase consistently across the API |
| Add a domain (sender authentication) | POST /v3/whitelabel/domains | poststack.domains.create({ name }) |
| Manage contacts | PUT /v3/marketing/contacts (Marketing Contacts product, separate billing) | poststack.contacts.create({ email, ... }) — included in every plan |
| Inbound Parse | Inbound Parse webhook with multipart/form-data | inboundEmails webhook with structured JSON |
| Webhook signature verification | EllipticCurve + signed-event-webhook-public-key (ECDSA) | X-PostStack-Signature header, HMAC-SHA256 of `timestamp.body` |
| Template engine | Handlebars (with proprietary helpers in v3) | Standard Handlebars (no proprietary extensions) |
Migration Gotchas
Field casing changes
SendGrid v2 used PascalCase (`From`, `To`, `Subject`); v3 mostly normalises but some legacy fields remain. PostStack uses lowercase camelCase consistently. Run a sed pass or rely on TypeScript autocomplete to catch the renames.
Marketing Contacts is a separate product on SendGrid
SendGrid bills marketing contacts and transactional sends separately. PostStack includes contacts, audiences, segments, and broadcasts in every plan — there is no contacts add-on or per-contact charge.
Inbound Parse uses multipart/form-data
SendGrid posts inbound mail as multipart/form-data; PostStack posts a clean JSON payload with parsed headers, plain-text body, HTML body, and attachments. Your existing inbound handler needs to switch from a multipart parser to JSON.
Webhook signature scheme differs
SendGrid uses ECDSA-based signature verification; PostStack uses HMAC-SHA256. The verification code is a few lines either way, but it is not a drop-in replacement — you do need to swap the verification logic.
Migration Steps
- 1Sign up for PostStack and get your API key
- 2Install the PostStack SDK: npm install @poststack/sdk
- 3Add your domain and verify DNS records
- 4Replace @sendgrid/mail with @poststack/sdk
- 5Update from sgMail.send() to poststack.emails.send()
- 6Test in development, then switch production traffic
Frequently asked questions
Can I keep my SendGrid templates?
Yes — export the Handlebars body from SendGrid and import as a PostStack template. PostStack uses standard Handlebars without proprietary helpers, so simple templates port directly. Templates using SendGrid-specific `{{insert}}` blocks may need a small rewrite.
Do I have to migrate marketing contacts separately?
No. PostStack does not split marketing and transactional. Export your contacts as CSV from SendGrid Marketing Campaigns, import into a PostStack audience, and continue sending — both transactional and broadcasts — from the same dataset.
How long does the migration take?
A small SaaS with a single sending integration usually finishes in two to four hours, including DNS propagation. Larger setups with template libraries and inbound parse handlers usually take a working day.
Can I run SendGrid and PostStack in parallel?
Yes. The two providers can coexist at the DNS layer (multiple `v=spf1 include:…` chains, multiple DKIM selectors). Run a percentage split for a day to verify deliverability before cutting over fully.
What about my IP warmup history?
IP reputation does not transfer between providers — neither way. PostStack handles IP warmup automatically on its shared pool for new senders, and a dedicated IP add-on is available if you need full control.
Does the inbound parse endpoint work the same?
Conceptually yes, but the payload format is different. SendGrid posts multipart/form-data; PostStack posts JSON. You will need to update your inbound webhook handler.