Compare
Groundmail vs SendGrid
Groundmail does one job: transactional email, sent from mail servers and IP space we own. When you need more isolation, add dedicated IPs or move to a dedicated server on the same API.
At a glance
A smaller payload and a narrower focus
One flat JSON body per send. One kind of mail on our IPs. Here is how it lines up.
| Topic | Groundmail | SendGrid |
|---|---|---|
| Sending infrastructure | Our own mail servers and our own IP space | See their docs |
| Isolation | Shared transactional pool, dedicated IPs, or your own dedicated mail server | See their docs |
| Email types | Transactional only | Email API plus Marketing Campaigns |
| Send API | POST api.groundmail.dev/emails | POST api.sendgrid.com/v3/mail/send |
| Payload | Flat from, to, subject, html | personalizations[] and content[] |
| Node package | groundmail | @sendgrid/mail |
| SMTP | smtp.groundmail.dev:587 | See their docs |
| Pricing | Free 3,000/mo · Pro from $20/mo · Dedicated server from $299/mo | See their pricing page |
SendGrid details come from SendGrid's public docs. Check them for current features and pricing.
What you get
Built only for mail your users are waiting on
Transactional only
Our servers, our IPs
Dedicated IPs and dedicated servers
A team that has run mail at scale
Switching
Replace v3 mail send with POST /emails
- Create a gm_ API key and verify your sending domain
- Swap @sendgrid/mail for groundmail, or call the API directly
- Flatten personalizations and content[] into from, to, subject and html
- Swap template_id for a Groundmail template alias
- Recreate webhook endpoints and update signature checks
Full field and event tables are in the SendGrid migration guide. Prefer SMTP for now? See SMTP relay.
Mapping
/v3/mail/send → /emails
personalizations[].to[] → to
from.email → from
content[] (type, value) → html / text
template_id → template aliasNode
import { Groundmail } from "groundmail";
const client = new Groundmail(process.env.GROUNDMAIL_API_KEY);
await client.emails.send({
from: "you@yourdomain.com",
to: "user@example.com",
subject: "Your order shipped",
html: "<p>It's on the way.</p>",
});FAQ
Questions about switching from SendGrid
How does a v3 mail send call map to Groundmail?
Flatten it. personalizations[].to[] becomes to, from.email becomes from, and content[] becomes html and/or text on POST /emails. The SendGrid migration guide has the full mapping table.
What replaces dynamic templates?
Groundmail templates. Build them in the dashboard with {{variables}} and send by alias, or pass html straight from your app. React Email works too.
How do Event Webhook events map?
Groundmail sends one signed JSON object per event. delivered maps to email.delivered, bounce to email.bounced, spamreport to email.complained, open to email.opened and click to email.clicked. The guide lists the rest.
Can I move my marketing email too?
No. Groundmail is transactional only. We keep marketing and cold email off our IPs so the shared pool stays clean for receipts, resets and alerts. Keep campaigns with a marketing tool and send transactional mail here.
Can I keep using SMTP while I migrate?
Yes. Point your SMTP settings at smtp.groundmail.dev on port 587 with credentials from the dashboard. Move HTTP sends over when you are ready.
Put your transactional email on solid ground.
Start free on our transactional pool. Move to dedicated IPs or a dedicated server when you need the isolation. Same API either way.