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
us1oreu1— 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
- Create a Bird account and generate a region-prefixed API key (
us1oreu1, per your residency needs). - Map the request fields:
phones→to,sender→from,body→text; addcategory; convert the recipient array to a single E.164 string. - Re-point your sending code to the region host and replace the OAuth token exchange with the static Bearer key.
- Re-test against Bird’s sandbox before sending live traffic.
- Update delivery/status webhooks and callbacks to Bird’s payload format.
- Run both providers in parallel and reconcile delivery results.
- 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.