SendGrid → Sendtim

Migrate from SendGrid to Sendtim

4 min read · Updated

SendGrid is two products sharing a login: a marketing platform and a transactional relay. Sendtim replaces the first. Start by deciding which of your email is which, because that decision shapes everything else in this move.

Decide what actually moves

Move the marketing side: campaigns, newsletters, lifecycle sequences, anything sent to a list or a segment. Sendtim holds one contact book per workspace with lists, segments, campaigns and automations, and keeps consent and suppression decisions next to the send.

Keep a transactional provider for application email — password resets, receipts, security alerts. Those are sent one at a time, triggered by your backend, and they want a relay. Sendtim is not one.

Per-contact lifecycle email *can* run here: build it as an automation and start it for one contact through POST /automations/{id}/trigger. That covers onboarding and nudges. It does not cover a password reset that must arrive in two seconds.

Write the decision down as a list of every email your business sends and who owns it after the move. Everything below assumes you have.

1. Export from SendGrid

Export the marketing side in full while the account is live, and export suppression as its own job. In SendGrid the suppression data is spread across more places than anywhere else, and all of them count:

  • Marketing contacts, with every custom field column.
  • Global unsubscribes — people who opted out of everything.
  • Unsubscribe (suppression) groups — people who opted out of one kind of mail. If you are collapsing groups into one list in Sendtim, treat every member of every group as suppressed rather than guessing.
  • Bounces and blocks — addresses that failed. Do not re-mail them on a new sending path.
  • Spam reports — the most important file in the export and the easiest to overlook.
  • Single Send and Dynamic Template HTML for anything you will rebuild, plus a written outline of each automation.

2. Map the concepts

SendGridSendtim
Marketing contact and custom fieldContact and custom property
ListList
SegmentSegment
Single SendCampaign
AutomationAutomation
Global unsubscribes, groups, bounces, blocks, spam reportsSuppression
Dynamic Template (marketing)Template in the email editor
Dynamic Template (application email)Stays on your transactional provider

SendGrid custom fields become named custom properties, and each one is also a merge tag: a property called plan is {{plan}} in an email. Create the properties on the first import rather than adding them later, so segments have something to filter on from the start.

3. Suppressions first, then contacts

Load every suppression file into Sendtim before importing a single contact. Once an address is suppressed it is skipped by every import whatever the file says, and nobody who unsubscribed can be re-subscribed by uploading a spreadsheet — but that protection only covers addresses already in there.

  1. Import global unsubscribes, group unsubscribes, bounces, blocks and spam reports as suppressions.
  2. Go to Contacts → Import and upload the marketing contacts file. Up to 200 MB, processed in the background.
  3. Map the standard columns, then give each remaining custom field column a property key: plan, signup_source, account_manager.
  4. Pick the list the contacts join under Options, and tick consent only where you hold documented opt-in.
  5. Read the rejected count under Recent imports. Rejected rows say why they were rejected.

4. Repoint the code that writes contacts

There is no SDK to install. Sendtim’s API is plain HTTP with a bearer token, one base URL and no datacenter suffix to configure, so whatever HTTP client your backend already has is enough.

A contact write is an upsert keyed on email, so it is safe to retry and safe to call on every signup:

curl -X POST https://sendtim.com/api/v1/contacts \
  -H "Authorization: Bearer $SENDTIM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "ada@example.com",
    "firstName": "Ada",
    "customProperties": { "plan": "trial" },
    "listIds": ["YOUR_LIST_ID"],
    "consentGiven": true,
    "consentSource": "api"
  }'

To start a lifecycle sequence for one person, trigger an automation that has a manual trigger:

curl -X POST https://sendtim.com/api/v1/automations/AUTOMATION_ID/trigger \
  -H "Authorization: Bearer $SENDTIM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "contactId": "CONTACT_ID" }'

Every failure returns the same JSON shape — { "error": { "code", "message", "details" } } — so one handler covers all of it. Rate limits are per key, per minute: 60 on Free, 300 on Starter, 600 on Pro and Scale; over the limit returns 429. Full reference in Use the Sendtim REST API and the OpenAPI document.

Keep the API key server-side. It can do anything an admin can in its workspace, so it never belongs in a browser or a mobile app.

5. Set up the workspace

  1. Create an API key in Settings → API and check it can read the workspace with GET /me.
  2. Add your sending domain and publish the SPF, DKIM and DMARC records Sendtim shows. Leave SendGrid’s records in place until the old path is retired — both can be authenticated at once.
  3. Create lists for the explicit subscription choices you want to offer, and custom properties for the fields your segments need.
  4. Rebuild Single Sends and marketing templates in the editor. Check desktop, mobile, plain text, and what each email looks like when a merge tag is empty.
  5. Rebuild automations, then walk yourself through each one from its real trigger before a contact reaches it.

6. Cut over safely

  • Send the first campaign to your most engaged contacts, then widen over a week or two while watching what comes back.
  • Keep one platform responsible for each email type, and switch the old one off for that type the same day. Never send the same campaign from both.
  • Point forms, zaps and product integrations at Sendtim. Anything still writing to SendGrid fills a list you no longer send from.
  • When no new traffic reaches SendGrid, take a final suppression snapshot, pause the old path, and keep it available for your agreed rollback window.

The reasoning behind the staged cutover, and what to watch afterwards, is in Switch email platforms without losing deliverability.

More resources