# Switching from SendGrid, with your code intact

> Switch from SendGrid without a rewrite: point @sendgrid/mail at a new base URL with a new key. Verified endpoint mapping, honest timelines, dated pricing.

Canonical: https://emailfast.dev/alternatives/sendgrid

## The whole code change

```diff
  import sgMail from "@sendgrid/mail";
+ import sgClient from "@sendgrid/client";

+ sgClient.setDefaultRequest("baseUrl", "https://api.emailfast.dev");
+ sgMail.setClient(sgClient);
- sgMail.setApiKey(process.env.SENDGRID_API_KEY);
+ sgMail.setApiKey(process.env.EMAILFAST_API_KEY); // ef_sandbox_… works everywhere
```

That is the migration for a send-call integration — a base URL and a key, because
SendGrid-, Mailgun-, and Postmark-compatible endpoints: point your existing SDK at a new base URL with a new key and keep your code — attachment sends are the one exception, refused with a clear error in your provider's own format rather than silently dropped. What the compatible endpoint actually honors, verified against the
code that serves it:

- **`POST /v3/mail/send`, same shape.** Same Bearer auth, same body, and the
  success your code expects: an empty-body `202` with an `X-Message-Id` header.
- **`cc`, `bcc`, and `send_at` carry over.** Each personalization's `cc`/`bcc` ride
  on every message fanned from it, and `send_at` — top-level or per-personalization —
  schedules the send.
- **Personalizations fan out** to one message per recipient. One honest difference:
  where SendGrid sends one message per personalization, we deliver each recipient
  their own copy — a personalization with several `to` addresses becomes that many
  copies, each carrying its `cc`. If any recipient is blocked by policy, the whole
  call rolls back and returns a truthful 4xx — nothing half-queued for a retry to
  double-send.
- **`template_id` sends resolve today.** Re-create the template in the dashboard or
  over `POST /v1/templates` with the slug set to your old SendGrid id — `d-…` ids
  are valid slugs — and the compat send works unchanged. An unknown id returns a
  SendGrid-shaped 400 naming it.
- **Attachments are refused loudly.** Outbound attachments aren't supported yet,
  platform-wide; a send carrying one gets a SendGrid-shaped 400 `errors[]` entry
  saying so — never a message quietly delivered without its file. SendGrid-only
  knobs with no equivalent here (`categories`, `custom_args`, `mail_settings`, and
  the like) are accepted without effect; native platform policy applies.
- **An `Idempotency-Key` header makes retries safe** — something the SendGrid send
  endpoint never offered: a 202 from the API means the send is committed to a durable, partitioned outbox before we answer — a crash can't lose it, and a retry with the same idempotency key can't double-send.

Behind the compatible surface, every send passes the same checkpoint as every other
ingress: every send — REST, SMTP, browser SDK, compatibility endpoints, broadcasts, automations — passes through one admission gate: idempotency, suppression, quota, and content policy in a single checkpoint no ingress can skip.

## How long it actually takes

Honest ranges, tied to the path above — not a slogan:

| What you're moving | The work | Time |
|---|---|---|
| Send calls (`@sendgrid/mail` or raw `/v3/mail/send`) | Base URL + key, then a sandbox test | Under an hour |
| Domain authentication | Add our SPF/DKIM records at your DNS host | Minutes of work, DNS propagation up to a few hours |
| Dynamic templates | Re-create in the dashboard or `POST /v1/templates`, slugged with your old template ids (a hosted importer is planned) | An afternoon for a handful |
| Contacts and suppression lists | CSV export from SendGrid → CSV import here (screened for hygiene) | Under an hour |
| Marketing automations | Rebuilt on our automation canvas — they do not import | Days, honestly |

Test the whole thing before production traffic moves: sandbox keys (ef_sandbox_…) that run the real pipeline dry: real validation, real rendering, real events, a hosted capture inbox — and no email leaves.

## What SendGrid publishes at your volume

| Monthly emails | Price / month | Published as |
| --- | --- | --- |
| 10,000 | $19.95 | Essentials (50k band, smallest paid tier) |
| 50,000 | $19.95 | Essentials (starting price of 50k-100k band) |
| 100,000 | *not published* | Essentials top-of-band or Pro starting $89.95 — UNVERIFIED - exact 100k price not published; Pro 'starting at $89.95/mo' covers 100k |
| 500,000 | *not published* | Pro — UNVERIFIED - Pro band price at 500k not published on public page |

**Detail:** Forever-free plan no longer advertised: 'Free trial lets you send 100 emails/day for 60 days'. Public page publishes only 'starting at' prices per band: Essentials starting $19.95/mo for 50,000-100,000 emails/mo; Pro starting at $89.95/mo for 100,000-2,500,000 emails/mo (includes 1 dedicated IP, SSO, subusers); Premier custom. Exact per-volume prices within bands (e.g. Essentials at 100k, Pro at 300k/500k/700k) are no longer published on the public page - they surface only in the signup flow. 'Taxes and overages may apply' with no public overage rate.

**Not published / not verified:** Exact Essentials price at 100k sends; Pro per-volume prices (300k/500k/700k/1.5M/2.5M); Overage rates (page says 'overages may apply' without rates).

Figures verified 2026-08-29 on [the SendGrid (Twilio) pricing page](https://www.twilio.com/en-us/products/email-api/pricing), promo and intro discounts excluded — method and corrections via the [claims methodology](/legal/claims-methodology).

Price your own numbers against every surveyed platform — a scenario is shareable as
a link: [50,000 sends/month](/compare/pricing-calculator?sends=50000&contacts=5000),
[100,000](/compare/pricing-calculator?sends=100000&contacts=10000), or
[500,000](/compare/pricing-calculator?sends=500000&contacts=50000).

## Where Email Fast stands

| Plan | Price / month | Emails included | Overage per 1,000 |
| --- | --- | --- | --- |
| Free | $0 | 2,500 | — |
| Starter | $9.90 | 20,000 | $0.90 |
| Creator | $39 | 100,000 | $0.65 |
| Growth | $79 | 300,000 | $0.55 |
| Scale | $249 | 1,500,000 | $0.35 |

Our stake, declared: we make Email Fast, and these are the launch prices already published on our [pricing page](/pricing) — during early access they may be refined before general availability, and self-serve checkout opens at GA. Contacts and subscribers are never billed, at any list size.

## Where SendGrid wins

From our own pricing survey, their side stated plainly — Massive proven scale and deliverability infrastructure, the broadest SDK/integration ecosystem in email, marketing + transactional under one roof, and Twilio SMS/voice adjacency.

Two honest additions. Twilio's trust center holds third-party attestations we don't
have yet — our [security page](/security) says exactly what is and isn't certified.
And if you want email, SMS, and voice under one vendor and one bill, Twilio is that
vendor and we are not. The full comparison, including when to stay:
[SendGrid vs Email Fast](/compare/sendgrid-alternative).

## Next

- [The step-by-step migration guide](/migrate/sendgrid) — including domain verification
- [Also pricing Mailgun](/alternatives/mailgun) or [Postmark](/alternatives/postmark)?
- [Suspended by your current platform?](/alternatives/suspended) Read that first.
- [Apply for early access](/early-access) — live sending starts by application

*SendGrid is a trademark of its owner; Email Fast is not affiliated with or endorsed by them. SendGrid facts were verified on their public pages on the dates shown — corrections: [hello@emailfast.dev](/contact).*

## Can I really keep using @sendgrid/mail?

Yes: SendGrid-, Mailgun-, and Postmark-compatible endpoints: point your existing SDK at a new base URL with a new key and keep your code — attachment sends are the one exception, refused with a clear error in your provider's own format rather than silently dropped. For SendGrid that means POST /v3/mail/send keeps its shape — same Bearer auth, same body, each personalization's cc / bcc and send_at scheduling honored — and a success returns the empty-body 202 with an X-Message-Id header your code already expects. A send carrying attachments gets a SendGrid-shaped 400 errors[] telling you so, because a message quietly delivered without its file would be worse.

## How long does switching from SendGrid take?

If your integration is send calls, under an hour including a sandbox test — the code change is a base URL and a key. Add DNS time for domain verification. Dynamic templates and marketing automations are the slow part: templates are re-created today, slugged with their old ids so existing sends keep working (a hosted importer is planned), and automations are rebuilt, not imported.

## Do my SendGrid dynamic templates come across automatically?

Not automatically — a hosted importer for SendGrid templates, contacts, and suppression lists is planned; today the data moves by CSV and the dashboard. The template bridge works now, though: re-create each template in the dashboard or over POST /v1/templates with the slug set to your old SendGrid template id ( d-… ids are valid slugs), and your existing compat send calls work unchanged. A send that references an id you haven't re-created returns a SendGrid-shaped 400 naming it, rather than silently sending something wrong.

## What does Email Fast cost compared to SendGrid?

Both tables on this page are the honest answer: SendGrid's published points (with the gaps their public page no longer publishes marked as such) and our launch prices from the pricing page , which may be refined before general availability. The pricing calculator prices your exact volume side by side.

## Is there a free tier to land on?

Yes — 2,500 emails a month with full platform features and an unlimited test sandbox; it never expires and never asks for a card. Free sends carry a small “Sent with Email Fast” footer that every paid plan removes. During early access, live sending starts by application .
