Migrer SMS depuis Sinch
Cette page fait correspondre SMS API, les groupes et les accusés de réception de Sinch avec Bird. Suivez le guide de migration principal dans l'ordre et utilisez ces correspondances pour les étapes 3, 4 et 5.
Deux différences structurelles conditionnent le portage, et toutes deux coûtent plus que les renommages de champs. Sinch indexe l'envoi sur un service plan dans le chemin d'URL et envoie un lot (batch), si bien qu'un message à une seule personne reste un tableau ; le endpoint POST /v1/sms/messages de Bird prend un seul destinataire sur votre hôte régional avec une clé bearer, sans segment de plan. Et l'enregistrement US que vous ne pouvez pas ignorer se trouve sur un hôte différent de celui de l'envoi, derrière une autre famille d'identifiants, si bien qu'un code qui appelle Sinch pour les deux atteint en réalité deux endroits distincts.
Transmettez ceci à votre agent
Utilisez ce brief dans votre agent de codage. Il commence par une phase de découverte et produit un plan de migration révisable avant toute modification en production.
Exemple de code
Help me migrate my SMS integration from Sinch to Bird.
1. Inspect this repository's sends, senders, callbacks, schedules, templates, opt-outs and tests. List the traffic and behavior that must survive the migration.
2. Read the Markdown guides at https://bird.com/docs/guides/sms/migrate/sinch.md and https://bird.com/docs/guides/sms/migrate.md. Use an existing authenticated Bird MCP or CLI connection. If neither is available, follow https://bird.com/docs/ai/set-up-your-agent.md. Discover the actual operations; do not invent commands or ask me to paste credentials into chat.
3. Prepare the code changes, sender/destination requirements, consent migration, webhook verification and rollout/rollback plan. Preserve the scope of each customer's preferences, including requests outside SMS replies. Separate API batches from audience broadcasts and preserve any behavior that has no direct endpoint equivalent.
4. Show me the exact affected resources, destinations, test volume and known costs before an action that sends messages, spends money, registers or changes a sender, or moves production traffic. Require explicit human authorization for each paid submission or production change. Name one-off 10DLC registration and resubmission fees before requesting approval. An existing explicit approval for that exact action is sufficient; broad migration approval is not. Simulated SMS destinations are billable and still require authorization.
5. If I am keeping Sinch numbers, prepare the human support port request and obtain authorization to send it. Read bird support-tickets create --help, then use the available CLI or MCP support operation with the reviewed number list and requirements. Return the ticket ID and follow the reply; support arranges the port on its own schedule, separately from the code cutover.
6. Run local and intercepted tests first. When authorized, perform the agreed bounded integration tests, inspect accepted and final outcomes separately, and report failures or uncertainty. Do not claim a delivery receipt proves reading or that request idempotency guarantees exactly-once delivery.
7. Keep production cutover and retiring the old provider as explicit steps in the approved rollout. Finish with the diff, evidence, unresolved requirements and the next action.Faire correspondre l'appel d'envoi
| Fonction | Sinch | Bird |
|---|---|---|
| Destinataire | to (tableau, ou un ID de groupe) | to (un par requête) |
| Expéditeur | from | from |
| Corps | body | text |
| Routage du compte | service plan, dans le chemin d'URL | la clé bearer ; aucun segment de chemin |
| Intention | (aucun) | category, requis sur le texte libre |
| Accusé de réception | delivery_report + callback_url, par lot | un webhook d'espace de travail ; pas de contrôle par envoi |
| Corrélation | client_reference | metadata, renvoyé sur chaque événement |
| Libellés filtrables | (aucun) | paires tags : {name, value} |
| Réessais sûrs | (aucun documenté) | en-tête Idempotency-Key |
| Flash | flash_message | pas d'équivalent |
Notes de portage :
- Choisissez délibérément un envoi unitaire, un lot ou une diffusion. to est un tableau chez Sinch et un numéro unique ici ; utilisez donc des envois unitaires ou le endpoint de lot pour un maximum de 100 messages indépendants. Une campagne destinée à une audience relève du workflow de diffusion. Un lot qui désignait un groupe nécessite que l'appartenance soit résolue au préalable ; consultez la section sur les désinscriptions, car c'est le même problème.
- body devient text. C'est le seul renommage qui touche chaque point d'appel.
- client_reference n'est pas une clé d'idempotence. Sinch le définit comme un identifiant ajouté à l'accusé de réception du lot : il corrèle mais ne déduplique pas. Si vous comptiez dessus pour sécuriser un réessai, vous n'étiez pas couvert ; c'est Idempotency-Key qui remplit ce rôle ici.
- Rien ne correspond à category. Décidez par type de message s'il s'agit de transactional, marketing, authentication ou service.
Reporter les désinscriptions
Sinch enregistre qui est inscrit, et Bird a besoin de savoir qui est désinscrit. Cette inversion est le cœur du travail.
Sinch gère les destinataires sous forme de groupes, et un groupe peut se mettre à jour automatiquement à partir de mots-clés : un abonné qui envoie STOP est retiré du groupe, et un abonné qui envoie SUBSCRIBE y est ajouté. La désinscription est donc encodée comme une absence d'une liste plutôt qu'une présence sur une autre, et l'absence n'est pas exportable : un numéro absent d'un groupe peut s'être désinscrit, n'avoir jamais été inscrit, ou avoir été supprimé par un import il y a six mois.
Reconstruisez plutôt qu'exporter. Votre propre journal de messages entrants est la source fiable, car certaines désinscriptions ont commencé par des messages entrants, tandis que d'autres sont passées par le support, des formulaires ou un autre canal de préférences, et ces messages existent quel que soit l'état actuel de l'appartenance au groupe. Si vous conserviez votre propre indicateur de désinscription à côté du groupe, cet indicateur est une meilleure preuve que l'appartenance. Importez la liste reconstruite dans la boucle de suppression, et montrez la liste au responsable du compte avant de l'importer : une entrée erronée ici bloque silencieusement des messages que vous aviez l'intention d'envoyer.
Une suppression Bird est une paire expéditeur-abonné : un abonné que vous bloquez sur trois expéditeurs représente donc trois enregistrements. Lire et gérer les suppressions contient la commande, ainsi que la raison pour laquelle une suppression manuelle bloque toutes les catégories, y compris les messages transactionnels.
Une fois arrivé ici, Bird répond lui-même aux mots-clés d'arrêt à partir de son propre catalogue par pays ; le comportement de mise à jour automatique du groupe n'a donc pas d'équivalent à reconstruire : un abonné qui envoie STOP produit une suppression sans que votre application n'intervienne. Les raisons s'empilent au lieu de fusionner : une paire que vous avez importée comme manual et qui envoie ensuite STOP détient deux enregistrements, et les messages restent bloqués tant que les deux n'ont pas pris fin.
Convertir les statuts de livraison
Utilisez ce tableau pour comparer les concepts de cycle de vie, pas pour renommer mécaniquement les événements. Bird choisit un événement d'échec à partir du statut et de la raison signalés. Une requête API refusée ne crée aucun message ; un rejet après acceptation peut produire sms.rejected, y compris un rejet par l'opérateur. Une absence de preuve de livraison reste inconnue. Conservez le statut brut du fournisseur et le code aux côtés de votre résultat normalisé.
La référence des accusés de réception de Sinch inclut queued, dispatched, delivered et plusieurs états d'échec final distincts. Conservez le code et le statut au niveau du destinataire lors de la conversion de vos rapports.
| Concept Sinch | Décision d'intégration Bird |
|---|---|
| Queued / Dispatched | Suivez l'acceptation et la soumission à l'opérateur séparément avec sms.accepted et sms.sent. |
| Delivered | Enregistrez le résultat réseau via sms.delivered ; cela ne prouve pas la lecture. |
| Failed / Rejected / Deleted | Inspectez la raison signalée. Les événements d'échec Bird ne se sélectionnent pas par simple substitution de nom. |
| Aborted / Expired / Cancelled | Conservez la cause et l'étape. L'envoi unitaire API de Bird ne dispose pas de minuteur de planification ni de validité pour recréer ces contrôles. |
| Unknown | Laissez le résultat incertain ; ne comptez pas un accusé de réception absent ou non interprétable comme une livraison. |
sms.expired de Bird fait suite à un rapport d'expiration de l'opérateur. Examinez votre comportement actuel d'expiration et d'annulation indépendamment de cet événement plutôt que de faire correspondre chaque délai d'attente à celui-ci.
Notez également que les statuts intermédiaires ne sont signalés que lorsque le lot a demandé un rapport per_recipient, ce qui fait partie de ce qui change ci-dessous.
Vous perdez le contrôle par envoi des accusés de réception, et cela mérite d'être dit clairement. Un lot Sinch choisit sa propre granularité de rapport et peut surcharger l'URL de callback du service plan pour cet envoi seul. Bird ne propose ni l'un ni l'autre : le reporting est un abonnement au niveau de l'espace de travail, chaque événement souscrit est livré, et il n'y a pas de surcharge par message. Si vous utilisiez delivery_report pour mettre en sourdine les campagnes verbeuses, ce filtrage passe dans votre handler. Si vous routiez les rapports d'une campagne vers un endpoint différent, cela devient un seul endpoint avec un branchement, ou un second abonnement.
Enregistrez le endpoint une seule fois en nommant les types d'événements que votre handler attend : les événements sms.* ci-dessus sont la liste à laquelle souscrire, et il n'existe pas de joker pour les remplacer. Bird envoie JSON signés selon Standard Webhooks ; Créer un endpoint contient la commande et la seule chose à réussir du premier coup : stocker le secret de signature que la réponse n'affiche qu'une seule fois.
Bird signale un échec avec un code error standardisé tel que invalid_destination, content_rejected, provider_unavailable ou recipient_opted_out ; la liste complète se trouve sur la page des événements.
Basculer
Les destinations, les expéditeurs et la montée en charge du trafic sont indépendants du fournisseur et couverts dans le guide principal. Deux éléments spécifiques à Sinch doivent figurer dans le plan de bascule.
Votre marque et campagne 10DLC sont enregistrées auprès de The Campaign Registry via Sinch et ne deviennent pas automatiquement des enregistrements Bird. Confirmez la procédure de migration ou d'enregistrement applicable avant de soumettre du travail payant. C'est aussi là que l'intégration se simplifie. Chez Sinch, l'enregistrement API se fait sur un hôte distinct de l'envoi et utilise des identifiants de projet plutôt que le token du service plan, et la propre documentation de Sinch indique que HTTP Basic y est destiné uniquement aux tests et fortement limité en débit ; une intégration de production construit donc un flux de token OAuth pour cela. Chez Bird, /v1/sms/10dlc/* se trouve aux côtés de /v1/sms/messages sous une seule URL de base et une seule clé : ce cycle de vie de token est donc supprimé, pas porté. Commencez par S'enregistrer pour le 10DLC, qui explique la signification de chaque champ et l'appel de vérification des prérequis qui vous indique quoi fournir avant de créer la marque, l'étape payante.
Les numéros que vous possédez chez Sinch nécessitent un portage que le support organise, selon son propre calendrier et non le vôtre.
Étapes suivantes
-
Comparer Bird et Sinch pour SMS : évaluation produit et considérations de migration
-
Envoyer des SMS : le payload vers lequel vous portez, dans son intégralité
-
Désinscriptions et mots-clés : couverture des mots-clés par pays et gestion des suppressions
-
Événements SMS : le vocabulaire d'événements vers lequel votre handler de rapports migre
-
Webhooks et événements : configuration des endpoints et vérification Standard Webhooks
Ressources associées
Poursuivez avec la documentation, les guides et les exemples sur ce sujet. Les ressources sont en anglais.