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. Recipients are nested inside `personalizations`, 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 flat, lowercase 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 September 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 | ~71% |
| 50,000/mo | ~$19.95/mo | €15/mo | ~14% |
| 100,000/mo | ~$34.95/mo | €30/mo | ~2% |
| 500,000/mo | ~$499/mo | €130/mo | ~70% |
| 1,000,000/mo | ~$799/mo | €255/mo | ~63% |
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.dev/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 | Pro plans and up (US parent) | Yes, every plan |
| 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 }) |
| Payload shape | personalizations: [{ to: [{ email }] }], content: [{ type, value }] | Top-level to: [...], subject, html, text — snake_case throughout |
| 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 | `email.inbound` webhook event with structured JSON |
| Webhook signature verification | EllipticCurve + signed-event-webhook-public-key (ECDSA) | X-PostStack-Signature header, HMAC-SHA256 of the raw request body |
| Template engine | Handlebars (with proprietary helpers in v3) | {{variable}} merge tags with flat {{#if}} / {{#unless}} blocks |
Migration gotchas
Flatter payloads
If you call the SendGrid v3 REST API directly, recipients live inside `personalizations` and bodies in a `content` array. PostStack takes top-level `to` (always an array), `subject`, `html`, and `text`. With the `@sendgrid/mail` helper the shapes are already close, and TypeScript autocomplete catches the rest.
Marketing Contacts is a separate product on SendGrid
SendGrid bills marketing contacts and transactional sends separately. PostStack includes contacts, 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.dev/sdk
- 3Add your domain and verify DNS records
- 4Replace @sendgrid/mail with @poststack.dev/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?
Mostly. Export the HTML from SendGrid and save it as a PostStack template. Simple `{{variable}}` substitutions and flat `{{#if}}` blocks port directly. PostStack does not support loops (`{{#each}}`), nested conditionals, or SendGrid’s custom helpers such as `{{insert}}`, so templates that use them need those parts rendered in your code and passed in as variables.
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 them into PostStack, group them into segments, 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.