Skip to content
spacepost

Compare

A SendGrid alternative for transactional email

SpacePost is a transactional email API on Amazon SES, run by an EU company. If your app sends receipts, password resets and notifications through SendGrid, here is how each part moves over, and where SendGrid still does more.

This page is about transactional email. SpacePost has audiences and simple broadcasts, but it does not replace SendGrid Marketing Campaigns (automations, signup forms, A/B tests, a visual editor).

How SendGrid concepts map

TopicSendGridSpacePost
Sending APIv3 Mail Send: POST /v3/mail/send with personalizations (up to 1,000 per request), answers 202 AcceptedPOST /emails (one message with to, cc and bcc) or POST /emails/batch (up to 100 messages), answers with the email id
SMTPsmtp.sendgrid.net, ports 25, 587 or 2525 (TLS) or 465 (SSL), username apikeysmtp.spacepost.dev, port 25976 with STARTTLS, username spacepost, password = your API key
TemplatesDynamic templates stored in SendGrid (ids starting with d-), Handlebars, filled with dynamic_template_dataNo hosted templates yet: render HTML in your app (for example with React Email) and send html and text
SuppressionsBounces, blocks, spam reports, invalid emails and unsubscribe groupsOne suppression list per team: hard bounces, complaints and repeated soft bounces are added automatically; add your own with POST /suppressions
Event webhooksEvent Webhook: a JSON array of events (processed, delivered, deferred, bounce, dropped, open, click, spam report, unsubscribe), with a signed variantWebhooks per event type (email.sent, delivered, delivery_delayed, bounced, complained, opened, clicked, failed, suppressed), one event per request, Standard Webhooks signatures
EUGlobal API plus an EU host (api.eu.sendgrid.com) for EU regional subusersOperated by Studio 404 d.o.o., an EU company; sending in AWS eu-central-1 (Frankfurt); data stored in the EU
Marketing emailMarketing Campaigns: contacts, segments, automations, signup formsAudiences, contacts and broadcasts with one-click unsubscribe; no automations or visual editor

Moving over

  1. 01

    Key and domain

    Create a SpacePost API key and verify your sending domain (three DKIM CNAMEs plus the MAIL FROM records). Keep SendGrid's DNS records until you switch.

  2. 02

    Sending calls

    Each personalization becomes one POST /emails call: to, cc, bcc, subject, html or text, reply_to, base64 attachments and custom headers carry over. Use POST /emails/batch for up to 100 messages at once.

  3. 03

    Or just SMTP

    Change the host to smtp.spacepost.dev, the port to 25976 with STARTTLS, the username to spacepost and the password to your API key.

  4. 04

    Templates

    Render your dynamic templates in your code before sending. Handlebars sources can be reused with any Handlebars library.

  5. 05

    Suppressions

    Export bounces, blocks, spam reports and unsubscribes from SendGrid and add each address with POST /suppressions, so you never email them again.

  6. 06

    Webhooks

    Create a webhook for the events you use and map SendGrid's event names to ours. Signatures follow Standard Webhooks, so Svix-compatible libraries verify them.

The same message, before and after

sendgrid.ts
// SendGrid v3 Mail Send
await fetch("https://api.sendgrid.com/v3/mail/send", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.SENDGRID_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    personalizations: [{ to: [{ email: "ada@example.com" }] }],
    from: { email: "receipts@acme.com", name: "Acme" },
    subject: "Your receipt",
    content: [{ type: "text/html", value: html }],
  }),
});
spacepost.ts
// SpacePost (Resend-compatible API)
const res = await fetch("https://api.spacepost.dev/emails", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.SPACEPOST_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    from: "Acme <receipts@acme.com>",
    to: ["ada@example.com"],
    subject: "Your receipt",
    html,
  }),
});
const { id } = await res.json();

Where SendGrid does more

  • Hosted dynamic templates with a design editor, and Marketing Campaigns with automations and signup forms.
  • Inbound Parse for receiving email, which SpacePost does not offer yet.
  • Many years of operation at very large volume, and more ways to split traffic across subusers and regions.

SendGrid details are taken from twilio.com/docs/sendgrid (Mail Send API, SMTP integration, Event Webhook) on October 29, 2026. They can change; tell us at support@spacepost.dev if something is out of date.

SpacePost is an independent product and is not affiliated with or endorsed by Twilio or SendGrid. "SendGrid" and "Twilio" are trademarks of their owners.

Try it with your own app

3,000 emails a month are free, with no card.

Start for free