How to migrate from BulkSMS to Vonage
A developer's field guide to moving an SMS integration from BulkSMS to Vonage: channel and protocol differences, request-format mapping, and a step-by-step checklist.
BulkSMS is a privately held business-messaging platform out of Cape Town that focuses on bulk SMS and RCS delivery over web app, API, and SMPP. Vonage is a publicly traded communications-API provider (part of Ericsson) offering SMS, MMS, RCS, chat apps, and voice. On the messaging.dev Score, BulkSMS rates 43/100 and Vonage 89/100; this guide covers what actually changes when you move an SMS integration from one to the other.
What you gain and what you lose
Channels. Both providers send SMS and RCS, so nothing you use today disappears at the channel level. Moving to Vonage adds MMS, WhatsApp, Viber, Facebook Messenger, and voice on the same account. Neither offers Telegram, Apple Messages for Business, or email.
Protocols. This is the one place you lose surface area. BulkSMS exposes REST, HTTP, SMPP, and SMTP; Vonage is REST-only in the dataset. If any traffic runs over SMPP binds or email-to-SMS (SMTP), there is no drop-in equivalent — that path has to become HTTP requests.
Compliance and residency. Both are GDPR-aligned. Vonage additionally lists ISO 27001, SOC 2, and HIPAA. BulkSMS offers EU servers only with no region choice; Vonage offers EU and US servers plus a data-residency choice (and APAC/Australia regions).
Tooling. BulkSMS lists no official SDKs and no sandbox, with docs rated medium. Vonage ships SDKs for Node.js, Python, PHP, Java, C#, Ruby, and Kotlin, provides a sandbox, and rates docs high. Both support self-onboarding and a free developer credit (5 free test SMS on BulkSMS; €2 trial credit on Vonage). Pricing on both is pay-as-you-go — prepaid credits with no published headline rate on BulkSMS versus per-message/minute with volume discounts (~$0.0072 per US SMS segment) on Vonage.
How the request format differs
BulkSMS quickstart:
curl -X POST https://api.bulksms.com/v1/messages \
-u 'API_TOKEN_ID:API_TOKEN_SECRET' \
-H 'Content-Type: application/json' \
-d '{"to": "+27000000000", "body": "Hello, World!"}'
Vonage quickstart:
curl -X POST 'https://rest.nexmo.com/sms/json' \
-d 'api_key=YOUR_API_KEY' \
-d 'api_secret=YOUR_API_SECRET' \
-d 'from=Vonage' \
-d 'to=15551234567' \
-d 'text=Hello from Vonage'
Three things change:
- Endpoint. You POST to
https://rest.nexmo.com/sms/json(legacy SMS API) orhttps://api.nexmo.com/v1/messages(Messages API) instead ofhttps://api.bulksms.com/v1/messages. - Auth. BulkSMS uses HTTP Basic in the Authorization header (username/password or token ID + secret). Vonage’s SMS API sends
api_keyandapi_secretas request parameters, not a header; the Messages API uses JWT instead. - Payload. BulkSMS takes a JSON body; the Vonage SMS API takes form-encoded parameters. Field mapping: recipient
to→to, messagebody→text, and Vonage requires afromsender that the BulkSMS example omits.
Migration checklist
- Create a Vonage account (self-onboarding) and copy your API key + secret from the dashboard; the €2 trial credit covers test sends.
- Choose SMS API vs Messages API — the former is form-encoded with key/secret, the latter is JSON with JWT and unlocks the extra channels.
- Map request fields: swap the endpoint and auth, rename
body→text, addfrom, and keep numbers in E.164. - Re-point your sending code and move credentials into config/secrets.
- Re-test in Vonage’s sandbox before sending live traffic.
- Re-create delivery-receipt and inbound webhooks against Vonage’s callback URLs.
- Run both providers in parallel, compare delivery, then cut over and retire the BulkSMS credentials.
For a from-scratch setup, see how to start with Vonage; for a field-by-field spec view, see the BulkSMS vs Vonage comparison.
Watch out for
- No SMPP or SMTP. Vonage is REST-only in the dataset; SMPP binds and email-to-SMS have no equivalent and must be rewritten as HTTP calls.
- Two API surfaces. The quickstart uses the legacy Nexmo SMS API (the secret travels in the request body); new builds usually want the Messages API + JWT — pick one deliberately rather than mixing them.
- Sender and number formatting. The Vonage example requires a
from(BulkSMS omits it) and drops the leading+(15551234567vs BulkSMS’s+27000000000), so normalize sender IDs and number formatting before cutover.