Migration guide

How to migrate from SendPulse to Bird

A developer's guide to moving SMS and messaging traffic from SendPulse to Bird, covering channel and compliance differences, request-format mapping, and a step-by-step migration checklist.

SendPulse is a multi-channel marketing and messaging platform that exposes email, SMS, and chatbots (WhatsApp, Telegram, Viber, Facebook Messenger) through one REST API. Bird (formerly MessageBird) is a communications infrastructure platform offering unified APIs for email, SMS, WhatsApp, and voice on a network that carries a large share of global commercial SMS. On the messaging.dev Score, SendPulse rates 63/100 and Bird 76/100 — this guide covers what actually changes when you move your sending code from one to the other.

What changes at a glance

Both platforms cover SMS, WhatsApp, and email, and both expose REST plus SMTP with documentation rated high quality. The differences that matter:

  • Channels you gain: voice. Channels you lose: Viber, Facebook Messenger, and Telegram — Bird does not offer them, so any SendPulse chatbot flows on those channels have no direct Bird equivalent. Neither provider does MMS, RCS, or Apple Messages for Business.
  • Compliance: both are GDPR-aligned. Bird additionally holds ISO 27001, SOC 2, and HIPAA, so you gain certifications rather than lose any.
  • Data residency: both run EU and US servers. Bird adds a genuine residency choice — your region-prefixed key routes to us1 or eu1 — whereas SendPulse runs US and Germany servers without a region selector.
  • Pricing: both are usage-based per destination country. Bird advertises no platform or seat fees, with SMS from $0.0073 to US numbers and WhatsApp priced by country and message category.
  • Free credit: this shrinks. SendPulse gives a free plan of 15,000 emails/month plus 10 test SMS; Bird’s free tier is 1,000 emails/month with no free test SMS.
  • SDKs: SendPulse ships PHP, Python, Ruby, Java, Node.js, and C#; Bird ships TypeScript, Python, and Go. Only Python overlaps.
  • Sandbox: SendPulse has none; Bird provides a test environment.

How the request format differs

SendPulse quickstart:

curl -X POST https://api.sendpulse.com/sms/send \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "sender": "SenderName",
    "phones": ["380931258293"],
    "body": "Hello from SendPulse"
  }'

Bird quickstart:

curl -X POST "https://us1.platform.bird.com/v1/sms/messages" \
  -H "Authorization: Bearer bk_us1_..." \
  -H "Content-Type: application/json" \
  -d '{
    "to": "+14155550100",
    "from": "Bird",
    "text": "Your Bird verification code is 481920. It expires in 10 minutes.",
    "category": "authentication"
  }'

Endpoint: you move from https://api.sendpulse.com/sms/send to https://us1.platform.bird.com/v1/sms/messages. Bird’s host is region-prefixed (us1/eu1) and must match your key’s region.

Authentication: SendPulse uses OAuth2 client_credentials — you POST client_id/client_secret to /oauth/access_token for a 1-hour Bearer token (or use a static API key), then send Authorization: Bearer <token>. Bird drops the token exchange entirely: a static region-prefixed key (bk_us1_... / bk_eu1_...) goes straight into the Authorization: Bearer header, so you can remove your token-refresh logic.

Payload mapping: the recipient field phones (an array of numbers) becomes to (a single E.164 string with a leading +); sender becomes from; and the message body becomes text. Bird also expects a category field (e.g. "authentication") that SendPulse has no equivalent for.

Migration checklist

  1. Create a Bird account and generate a region-prefixed API key (us1 or eu1, per your residency needs).
  2. Map the request fields: phonesto, senderfrom, bodytext; add category; convert the recipient array to a single E.164 string.
  3. Re-point your sending code to the region host and replace the OAuth token exchange with the static Bearer key.
  4. Re-test against Bird’s sandbox before sending live traffic.
  5. Update delivery/status webhooks and callbacks to Bird’s payload format.
  6. Run both providers in parallel and reconcile delivery results.
  7. Cut over, then revoke the SendPulse credentials.

For a from-scratch setup, see how to start with Bird, and check the full Bird vs SendPulse comparison.

Watch out for

  • Lost channels: Viber, Facebook Messenger, and Telegram do not exist on Bird — migrate or retire those flows first.
  • Smaller free tier: 1,000 emails/month and no free test SMS, versus SendPulse’s 15,000 emails plus 10 test SMS.
  • Narrower SDK coverage: only Python overlaps; PHP, Ruby, Java, C#, and Node.js users lose an official SDK.
  • Payload shape: recipients are a single E.164 string, not an array, so any batch loops that pushed multiple numbers per call need refactoring.