Migrating from SendGrid
SendGrid (Twilio Email) is great at one thing: blasting a lot of email cheaply. It's not a journey platform. If you're using SendGrid Marketing Campaigns for lifecycle workflows, hitting the limits of their Automations product, or watching the Twilio bill scale unfavorably, Apex is a clean upgrade.
This guide focuses on the Marketing Campaigns + Automations path. If you're using SendGrid purely for transactional sends, see the API migration section at the bottom — that's a much smaller change.
Why teams move
- Automations were never the focus. SendGrid's strength is transactional + bulk; their Automations are second-class. Apex's Adaptive Journeys are the headline product.
- Real lift measurement. SendGrid's reporting tells you opens and clicks. It doesn't tell you whether the journey caused the conversion vs. would-have-converted-anyway. Apex's global holdout + calibrated impact compute that number directly.
- One bandit across all surfaces. SendGrid's A/B is per-send, fixed splits. Apex's Adaptive Branches Thompson-sample arms continuously and share the engine with web experiments.
- AWS-native. Sends go through your own SES under your AWS account. No new vendor relationship for the actual delivery; just orchestration + measurement.
Concept mapping
| SendGrid | Apex | Notes |
|---|---|---|
| Sender Identity / Domain | SES domain identity | Keep your existing AWS SES setup. Apex doesn't proxy your sends. |
| Marketing Campaigns | Communications | One-shot sends become a journey with a single Send step (or just a transactional API call if it's not lifecycle-shaped). |
| Automations | Adaptive Journeys | Same shape: trigger on event, sequence of steps, exit conditions. |
| Automation: Send Email | Send step | Reuses your existing comm template via the comm picker. |
| Automation: Wait | Wait step (duration) | Direct mapping. |
| Automation: A/B Test | Branch step (experiment mode) | Becomes Thompson-sampled with goal attribution. |
| Lists | Audiences (or Cohorts for static lists) | Dynamic SendGrid segments → Apex audience predicates. Static lists → org-level cohorts. |
| Single Sends | one-shot Communication | Use a one-step journey with an immediate trigger, OR call the transactional send API directly. |
| Contact Custom Fields | End-user attributes | Backfill via /api/events. |
| Template Engine (Handlebars) | LiquidJS | The few syntax differences flag at preview time. Most templates port verbatim. |
| Email Activity / Stats | Calibrated impact + per-step stats | Different shape — Apex shows lift vs holdout, not just opens/clicks. Your transactional opens/clicks still come through SES events. |
What you can leave as-is
- SES — keep your domain identity, IPs, configuration sets. SendGrid was sending through SendGrid's IPs; you'll switch to your own SES IPs as part of the migration. Plan for a 2-week IP warm-up if you're sending high volume.
- Event tracking — if you're tracking signup/activation/etc. via your own analytics already, just point them at
/api/events. - Contacts data — exportable as CSV from SendGrid; backfill into Apex via a one-time identify call per contact.
Migration steps
1. Provision SES (if you haven't already)
SendGrid handles the SMTP layer for you. Moving to SES means:
- Add your sending domain to SES (DKIM + DMARC records)
- Request out-of-sandbox if you're sending to addresses you don't own
- (Optional) request dedicated IPs and plan a 2-week warm-up if you're doing >10k/day
Apex's onboarding flow walks you through this — it's a one-time setup that takes a couple of days for DNS propagation.
2. Export from SendGrid
Pull from SendGrid's Marketing Campaigns API:
- A JSON dump of Single Sends, Marketing Campaigns, and Automations
- A CSV of contacts + custom field values
- (Optional) recent email-event history for backfill
3. Translate
The migration tool emits:
- Apex audience predicates from SendGrid dynamic segments
- Org-level cohorts from SendGrid static lists
- Adaptive Journey drafts from SendGrid Automations
- Communications from individual email templates (preserves the Handlebars-to-Liquid conversion where straightforward; flags non-portable filters)
4. Review + publish
Open /dashboard/communications/journeys/[id] for each translated journey. Walk the canvas, dry-run with a test subject, set the journey-level goalEventName if relevant, then publish.
5. Cut over
- Pause the SendGrid Automation (stops new entrants)
- Publish the Apex equivalent
- Wait 1-2 weeks for in-flight SendGrid contacts to drain
- Update DNS to send through SES if you haven't already
- Sunset the SendGrid Marketing Campaigns plan; keep Twilio for SMS if you use it (Apex routes SMS through the Webhook step → Twilio)
If you're using SendGrid purely for transactional
Apex doesn't build a separate transactional-only product — every send goes through the same pipeline. If you're using SendGrid solely for password-resets / receipts / 2FA codes, the migration is trivial:
- POST https://api.sendgrid.com/v3/mail/send
+ POST https://api.apex.inc/v1/transactional/send
The payload schema is similar (personalizations, from, subject, content). Apex's transactional API also gives you:
- Idempotency keys (15-minute window)
- Sandbox mode (
X-Apex-Mode: sandbox) - The same delivery + bounce + complaint signals you got from SendGrid
See the transactional API docs for the full schema.
What's NOT in the migration
- SendGrid IP reputation. Doesn't transfer — you're sending through your own SES under your AWS account. Plan the IP warm-up.
- SendGrid template editor history. Templates port; revision history doesn't.
- SendGrid Email Activity feed. Apex's event history is per-end-user (queryable via the dashboard); the bulk Activity API is a different shape.
FAQ
Will my email reputation tank during the move? No, if you do the warm-up right. We recommend ramping volume from 1k → 5k → 25k → full over the first two weeks. Apex's onboarding ships with a sample warm-up plan; SES dedicated-IP customers get IP-pool monitoring per recipient domain.
What about SendGrid Marketing Campaigns' segmentation? Translates cleanly to Apex audiences. Dynamic segments → predicates; static lists → cohorts.
Can I keep SendGrid for transactional? Sure. Pointing Marketing Campaigns at Apex while keeping SendGrid for /v3/mail/send calls is a valid intermediate state.
How long does a typical migration take? Pure transactional: a sprint. Marketing Campaigns + Automations: 1-2 weeks including the SES IP warm-up.
Get migration help
migration@apex.inc — send your SendGrid API key + a quick description of your setup and we'll send back a translated Apex workspace + a tailored cutover plan.