Migrer SMS depuis un autre fournisseur
Utilisez ce guide pour transférer vos SMS de production d'un autre fournisseur vers Bird. Deux éléments conditionnent un premier envoi ici que votre fournisseur actuel gère différemment, ils viennent donc avant le code : les pays vers lesquels vous envoyez, et l'expéditeur depuis lequel vous envoyez. Après ceux-ci, portez l'appel d'envoi, importez votre liste de désinscriptions, redirigez les accusés de réception vers des webhooks, et testez avec des destinations simulées avant de basculer le trafic réel.
Liste de contrôle de la migration :
- Activer vos pays de destination
- Configurer un expéditeur
- Adapter l'appel d'envoi vers POST /v1/sms/messages
- Importer votre liste de désinscriptions
- Basculer les accusés de réception vers des webhooks
- Tester avec des destinations simulées avant la bascule
Les étapes 3, 4 et 5 dépendent du fournisseur que vous quittez. Votre guide fournisseur contient la correspondance champ par champ du payload, la traduction des statuts et événements, et la marche à suivre pour extraire votre liste de désinscriptions.
Commencez par les étapes 1 et 2. L'enregistrement de l'expéditeur est le chemin critique d'une migration SMS : la validation par l'opérateur et le registre peut prendre plus de temps que la modification du code. Évaluez les deux avant de fixer une date de bascule.
1. Activer vos pays de destination
Votre espace de travail dispose d'une liste blanche de destinations en refus par défaut qui ne contient initialement que le pays d'origine de votre organisation. Un envoi vers tout autre pays retourne 422 SMSDestinationNotEnabled avant que Bird ne résolve un expéditeur : une intégration portée fidèlement échoue donc sur son premier message international tant que vous n'avez pas ouvert le pays.
Activez chaque pays vers lequel vous envoyez aujourd'hui sous SMS > Destinations. Tirez la liste des logs de messages de votre fournisseur actuel plutôt que de votre mémoire : un pays oublié est une interruption silencieuse le jour de la bascule, et un pays activé mais jamais utilisé est une exposition inutile. Le refus par défaut est aussi ce qui limite les dégâts du SMS pumping, où du trafic frauduleux vers des numéros surtaxés vous est facturé.
2. Configurer un expéditeur
Lors d'un envoi en texte libre, from est l'expéditeur que votre destinataire voit, et il prend l'une de trois formes : un identifiant d'expéditeur alphanumérique, un numéro de téléphone au format E.164 que votre espace de travail possède, ou un numéro court. Les formes acceptées dépendent du pays de destination, et un expéditeur non valide dans ce pays est rejeté avec un 422 indiquant la raison. Envoyer des SMS détaille les règles par forme.
Comment obtenir chacun :
- Créez vous-même les identifiants d’expéditeur alphanumériques sous SMS > Senders. Si le pays de destination exige l’enregistrement de l’identifiant d’expéditeur, soumettez la demande et attendez son approbation avant d’y acheminer du trafic.
- Le trafic commercial US via des numéros longs locaux nécessite la marque et la campagne 10DLC applicables, configurées sous SMS > 10DLC, tandis que les numéros gratuits et les numéros courts dédiés ont leurs propres programmes de vérification ou de candidature. Les États-Unis n'acceptent pas du tout les identifiants d'expéditeur alphanumériques : un identifiant européen qui fonctionne partout ailleurs n'a pas d'équivalent aux États-Unis.
- Les numéros passent par le workflow Numbers, avec une disponibilité et un provisionnement éventuellement géré selon le type et la destination. Consultez SMS numbers pour le bon parcours ; ajouter un identifiant d'expéditeur alphanumérique n'acquiert pas de numéro.
- Conserver vos numéros actuels n'est pas en libre-service : Bird ne propose pas de flux de portage entrant pilotable depuis le tableau de bord. Si vos abonnés répondent à des numéros que vous possédez aujourd'hui, lancez le portage auprès du support avant de planifier une date de bascule, et prévoyez que le portage et la modification du code soient deux événements distincts.
Un envoi par modèle système utilise un formulaire de requête différent. Il nécessite toujours la destination applicable et l'autorisation du destinataire. Il fournit le corps, la catégorie et l'expéditeur, donc from n'est pas accepté en complément et Bird choisit un expéditeur valide pour la destination.
3. Adapter l'appel d'envoi
Le point de terminaison d'envoi unitaire est POST /v1/sms/messages. Construisez un payload JSON avec to, from, text et category, et un appel réussi retourne 202 Accepted avec un identifiant de message préfixé par sms_. La livraison intervient après la réponse et vous parvient via les événements webhook et les endpoints de lecture. Le payload complet se trouve dans Envoyer des SMS ; la correspondance champ par champ depuis votre payload actuel est dans votre guide fournisseur.
Avant de porter le code, tenez compte de ces différences :
- Un destinataire par requête. Bird n'a pas de tableau de destinataires. Si votre fournisseur actuel distribue un appel vers plusieurs numéros, cela devient un appel par destinataire, ou un batch de messages indépendants dans une seule requête.
- category est obligatoire pour le texte libre, et ses valeurs sont transactional, marketing, authentication ou service. La plupart des fournisseurs déduisent l'intention de la campagne ou de l'expéditeur ; ici vous la déclarez par message, et si le pays de destination exige que l'expéditeur soit enregistré, cet enregistrement est approuvé pour une catégorie et un envoi hors de celle-ci est rejeté avec 422 SenderCategoryNotPermitted. Le statut active de l'expéditeur ne peut pas vous l'indiquer à l'avance, car il est rapporté sans référence à une catégorie ; consultez plutôt les exigences par pays. Faites-le correctement dès le portage au lieu de tout mettre par défaut sur une seule valeur.
- Le corps est limité en segments, et Bird ne tronque pas. Un corps trop long est rejeté avec un 422. Les caractères non GSM-7 réduisent de plus de moitié ce qui tient dans un segment : si votre fournisseur actuel translittérait silencieusement les guillemets courbes et les tirets, activez options.smart_encoding pour conserver les comptages de segments auxquels vous êtes habitué. Cette option est désactivée par défaut car elle modifie le corps que vous avez composé.
- Utilisez tags pour les dimensions de filtrage et metadata pour le contexte. Les tags sont des paires {name, value} sur lesquelles vous pouvez filtrer et découper vos analyses ; les métadonnées sont des JSON arbitraires que Bird stocke, retourne en lecture et renvoie dans chaque événement webhook. Un champ de référence client unique chez votre ancien fournisseur correspond généralement à metadata.
- La planification par envoi individuel et les MMS sortants nécessitent un plan distinct. scheduled_at, media_urls, validity_period et personalization par destinataire sont des champs réservés, rejetés avec 422 SMSUnsupportedFeature. Ces parties de votre intégration ne migrent pas avec le reste : conservez les envois planifiés dans votre propre file d'attente et appelez le point de terminaison d'envoi au moment de soumission prévu. Pour les campagnes d'audience, évaluez Broadcasts séparément ; un broadcast n'est pas un simple renommage de champ du point de terminaison.
- Utilisez Idempotency-Key pour des réessais bornés. Envoyez une clé unique par message logique et réutilisez-la pour les réessais de la requête identique dans la fenêtre de rejeu de trois heures. Les rejeux réduisent les requêtes en double mais ne constituent pas une garantie de livraison exactement une fois. Voir Idempotency.
4. Importer votre liste de désinscriptions
Importez vos désinscriptions avant le premier envoi de production. Envoyer un message à quelqu'un qui a demandé l'arrêt auprès de votre ancien fournisseur est la violation de conformité qui fait échouer une migration, et ni l'opérateur ni le régulateur ne se soucie du fournisseur qui a perdu l'enregistrement.
Une suppression Bird couvre une paire expéditeur-abonné, ce qui peut être plus étroit que le blocage au niveau du service, du profil ou du compte de votre ancien fournisseur. Préservez le retrait effectif de la personne sur chaque expéditeur et programme concerné. Ajoutez chaque paire avec POST /v1/sms/suppressions :
Exemple de code
while IFS=, read -r destination originator; do
curl -s -X POST https://us1.platform.bird.com/v1/sms/suppressions \
-H "Authorization: Bearer $BIRD_API_KEY" \
-H "Content-Type: application/json" \
-d "{\"destination\": \"$destination\", \"originator\": \"$originator\"}"
done < opt-outs.csvLe même import s'exécute depuis le CLI en tant que bird sms suppressions add --destination +15550001234 --originator +15557654321.
Deux points à connaître sur l'import :
- Les deux extrémités sont requises pour les suppressions spécifiques à un expéditeur. Une désinscription à l'échelle de l'espace de travail relève du preference owner distinct. L'appel est idempotent : 201 enregistre une nouvelle suppression, 200 retourne la suppression manuelle déjà en place, donc relancer un import partiel est sans risque.
- Les paires importées reçoivent reason: manual, qui bloque toutes les catégories y compris transactionnelles. C'est plus strict qu'une suppression que Bird enregistre lui-même à partir d'un mot-clé d'arrêt. Si un abonné s'est désinscrit uniquement du marketing, décidez délibérément si vous devez importer cette paire.
Passez en revue le comportement des mots-clés et des préférences existants avant de retirer du code. Bird répond aux mots-clés pris en charge et enregistre les suppressions là où son catalogue pays s'applique. Conservez le traitement des demandes non prises en charge, des préférences plus larges et des autres canaux de contact. Les mots-clés et réponses de campagne personnalisés utilisent les règles de mots-clés. Voir Désinscriptions et mots-clés pour la couverture et la portée.
5. Basculer les accusés de réception vers des webhooks
Enregistrez un endpoint avec POST /v1/webhooks et abonnez-le à une liste explicite de types d'événements. C'est le changement structurel que la plupart des fournisseurs imposent : au lieu d'une URL de callback par message ou par numéro, votre espace de travail dispose d'endpoints, et chaque endpoint s'abonne aux événements qu'il souhaite recevoir.
Les noms d'événements de Bird suivent resource.action. Le parcours nominal est sms.accepted, puis sms.sent, puis sms.delivered, avec sms.undelivered, sms.failed, sms.expired et sms.rejected couvrant le reste, et sms.received transportant les réponses à vos numéros. La traduction depuis le vocabulaire de statuts de votre fournisseur actuel se trouve dans votre guide fournisseur, et les payloads par événement sont dans événements SMS.
La corrélation se porte proprement. Chaque événement contient sms_id, workspace_id, to et from, et renvoie les tags et metadata de l'envoi : votre handler lit vos propres identifiants directement sur l'événement au lieu de rechercher le message.
Deux mécanismes à porter avec le handler :
- Les livraisons sont signées selon Standard Webhooks, en utilisant les en-têtes webhook-id, webhook-timestamp et webhook-signature avec un HMAC-SHA256 sur {id}.{timestamp}.{raw body}. Les fournisseurs qui signent avec leur propre schéma nécessitent un remplacement de la vérification ; la recette est dans Webhooks & events.
- La livraison est au-moins-une-fois et non ordonnée. Dédupliquez sur webhook-id et triez par le timestamp du payload, jamais par ordre d'arrivée.
Les messages entrants suivent le même modèle. Abonnez-vous à sms.received une seule fois pour l'espace de travail au lieu de configurer une URL entrante par numéro, et gardez à l'esprit que Bird émet quand même sms.received pour une réponse correspondant à un mot-clé d'arrêt, après avoir enregistré la suppression.
6. Tester avec des destinations simulées
Bird synthétise des résultats de livraison pour un ensemble de destinations de test, ce qui vous permet d'exercer votre parcours d'envoi porté et votre handler de webhook avec de vraies réponses API et de vraies livraisons signées sans téléphone. Ce sont les mêmes numéros que plusieurs fournisseurs utilisent pour les identifiants de test, et un message vers l'un d'eux n'atteint jamais un opérateur.
| Destination | Ce que votre intégration observe |
|---|---|
| +15005550001 | Rejeté à la soumission avec invalid_destination |
| +15005550002 | sms.sent, puis sms.undelivered avec unreachable |
| +15005550003 | sms.sent, puis sms.failed avec provider_unavailable |
| +15005550004 | sms.sent, puis sms.failed avec blocked_by_carrier |
| +15005550006 | sms.sent, puis sms.delivered |
| +15005550009 | sms.sent, puis sms.failed avec recipient_opted_out |
Trois conditions s'appliquent, et les deux premières piègent souvent sur un espace de travail neuf :
- Ce sont des numéros américains, donc les États-Unis doivent être activés sous Destinations, et from doit être un expéditeur valide pour les États-Unis. Un identifiant d'expéditeur alphanumérique y est rejeté.
- Un envoi simulé est facturé au tarif normal de la destination. Rien n'atteint un téléphone, mais le débit du portefeuille est réel : dimensionnez votre test de fumée en conséquence.
- Le résultat dépend uniquement de la destination. Il n'y a ni identifiant de test séparé, ni mode test à désactiver.
Un test de fumée viable envoie à +15005550006 et vérifie que votre handler parcourt sms.accepted puis sms.sent puis sms.delivered ; envoie à +15005550002 et +15005550009 et vérifie que votre traitement d'échec et de désinscription se déclenche sur le bon code error ; et envoie un message réel à un téléphone que vous contrôlez pour confirmer que l'expéditeur et le corps s'affichent comme prévu.
Basculez ensuite par part de trafic plutôt que d'un coup. Déplacez un petit pourcentage des envois de production vers Bird, surveillez le journal SMS et les métriques pour comparer les taux de livraison et les codes d'erreur avec ce que votre ancien fournisseur rapportait pour les mêmes routes, et augmentez la part à mesure que les chiffres tiennent. Gardez l'ancienne intégration déployable jusqu'à ce que la première période de facturation complète soit satisfaisante.
Migration depuis un fournisseur spécifique
- Twilio : PascalCase encodé en formulaire vers JSON, Messaging Services vers des expéditeurs, StatusCallback vers des webhooks souscrits
- Plivo : src et dst vers from et to, Powerpacks vers des expéditeurs, paires DND vers des suppressions
- Telnyx : l'envoi le plus proche de celui de Bird, les profils de messagerie décomposés en expéditeurs et abonnements, les opt-outs au niveau du profil vers des paires
- Bandwidth : deux hôtes vers un seul, les callbacks applicationId vers des webhooks d'espace de travail, et une liste de désinscriptions que votre propre application détient déjà
- Sinch : les lots vers des envois unitaires, body vers text, l'appartenance aux groupes reconstruite en suppressions
- Infobip : un payload à trois niveaux aplati, une URL de base par compte vers un hôte régional, une Blocklist étendue en paires
- Bird Connectivity Platform : le rest.messagebird.com API, originator et recipients vers from et to, les callbacks GET reportUrl vers des webhooks signés
Étapes suivantes
-
Comparer les fournisseurs SMS : évaluer le workflow produit et les considérations de migration
-
Envoyer des SMS : le payload d'envoi complet, les expéditeurs, les segments et le modèle asynchrone 202
-
Désinscriptions et mots-clés : ce que Bird gère pour vous, et comment administrer les suppressions
-
Événements SMS : le vocabulaire des événements et les payloads par événement
-
Webhooks & events : configuration des endpoints, vérification de signature, réessais et rejeu
Ressources associées
Poursuivez avec la documentation, les guides et les exemples sur ce sujet. Les ressources sont en anglais.