Sign inGet started

SMS von einem anderen Anbieter migrieren

Verwenden Sie diese Anleitung, um Produktions-SMS von einem anderen Anbieter zu Bird umzuziehen. Zwei Dinge stehen vor dem ersten Versand, die Ihr bisheriger Anbieter anders handhabt, und deshalb kommen sie vor dem Code: die Länder, in die Sie senden, und der Absender, von dem Sie senden. Danach portieren Sie den Send-Call, übernehmen Ihre Opt-out-Liste, leiten Zustellberichte auf Webhooks um und testen gegen simulierte Ziele, bevor Sie echten Traffic umleiten.
Die Migrations-Checkliste:
  1. Zielländer aktivieren
  2. Absender einrichten
  3. Den Send-Call abbilden auf POST /v1/sms/messages
  4. Opt-out-Liste übernehmen
  5. Zustellberichte auf Webhooks umstellen
  6. Gegen simulierte Ziele testen vor dem Cutover
Die Schritte 3, 4 und 5 hängen davon ab, welchen Anbieter Sie verlassen. Ihre Anbieter-Anleitung enthält das Feld-für-Feld-Payload-Mapping, die Status- und Event-Übersetzung und den Weg, Ihre Opt-out-Liste zu exportieren.
Beginnen Sie mit den Schritten 1 und 2. Die Absender-Registrierung ist der längste Posten in einer SMS-Migration: Die Prüfung durch Carrier und Registry kann länger dauern als die Codeänderung. Schätzen Sie beides ab, bevor Sie ein Cutover-Datum festlegen.

1. Zielländer aktivieren

Ihr Workspace hat eine Ziel-Allowlist mit Default-Deny, die zunächst nur das Heimatland Ihrer Organisation enthält. Ein Versand in ein anderes Land liefert 422 SMSDestinationNotEnabled zurück, noch bevor Bird einen Absender auflöst. Eine sauber portierte Integration scheitert also an ihrer ersten internationalen Nachricht, bis Sie das Land freigeben.
Aktivieren Sie jedes Land, in das Sie senden, unter SMS > Destinations. Nehmen Sie die Liste aus den Nachrichtenprotokollen Ihres bisherigen Anbieters statt aus dem Gedächtnis: Ein vergessenes Land ist eine stille Lücke am Cutover-Tag, und ein aktiviertes Land, das Sie nie nutzen, ist unnötige Angriffsfläche. Default-Deny begrenzt außerdem den Schaden durch SMS-Pumping, bei dem betrügerischer Traffic an Premium-Nummern Ihnen in Rechnung gestellt wird.

2. Absender einrichten

Bei einem Freitext-Versand ist from der Absender, den Ihr Empfänger sieht, und er hat eine von drei Formen: eine alphanumerische Sender-ID, eine Telefonnummer im E.164-Format, die Ihrem Workspace gehört, oder ein Short Code. Welche Formen funktionieren, hängt vom Zielland ab, und ein dort ungültiger Absender wird mit einem 422 abgelehnt, der den Grund nennt. SMS senden beschreibt die Regeln pro Form.
Wie Sie die einzelnen Typen erhalten:
  • Alphanumerische Sender-IDs erstellen Sie selbst unter SMS > Senders. Wenn das Zielland eine Registrierung der Sender-ID verlangt, reichen Sie die Registrierung dort ein und warten Sie auf die Genehmigung, bevor Sie Traffic darüber routen.
  • US-Geschäfts-Traffic über lokale Long Codes erfordert die entsprechende 10DLC-Marke und -Kampagne, eingerichtet unter SMS > 10DLC. Toll-Free-Nummern und dedizierte Short Codes haben eigene Verifizierungs- oder Antragsprogramme. Die USA akzeptieren alphanumerische Sender-IDs grundsätzlich nicht, eine europäische Sender-ID, die überall sonst funktioniert, hat also kein US-Äquivalent.
  • Nummern erhalten Sie über den Numbers-Workflow, wobei Verfügbarkeit und verwaltete Bereitstellung vom Typ und Zielland abhängen. Prüfen Sie SMS-Nummern für den richtigen Weg; das Anlegen eines alphanumerischen Absenders beschafft keine Nummer.
  • Bestehende Nummern behalten ist kein Self-Service: Bird hat keinen Port-in-Flow, den Sie über das Dashboard steuern können. Wenn Ihre Abonnenten auf Nummern antworten, die Sie heute besitzen, klären Sie den Port mit dem Support, bevor Sie ein Cutover-Datum festlegen, und planen Sie Port und Codeänderung als getrennte Vorgänge.
Ein System-Template-Versand nutzt eine andere Request-Form. Er benötigt weiterhin das passende Zielland und die Empfängererlaubnis. Er liefert Body, Kategorie und Absender, daher wird from daneben nicht akzeptiert, und Bird wählt einen für das Zielland gültigen Absender.

3. Den Send-Call abbilden

Der Single-Send-Endpoint ist POST /v1/sms/messages. Erstellen Sie ein JSON-Payload mit to, from, text und category. Ein erfolgreicher Call gibt 202 Accepted mit einer sms_-präfixierten Message-ID zurück. Die Zustellung erfolgt nach der Response und erreicht Sie über Webhook-Events und die Read-Endpoints. Das vollständige Payload finden Sie unter SMS senden; das Feld-für-Feld-Mapping von Ihrem bisherigen Payload steht in Ihrer Anbieter-Anleitung.
Berücksichtigen Sie vor der Code-Portierung diese Unterschiede:
  • Ein Empfänger pro Request. Bird hat kein Recipients-Array. Wenn Ihr bisheriger Anbieter einen Call an viele Nummern verteilt, wird daraus ein Call pro Empfänger oder ein Batch unabhängiger Nachrichten in einem einzelnen Request.
  • category ist bei Freitext erforderlich, und zwar transactional, marketing, authentication oder service. Die meisten Anbieter leiten die Absicht aus der Kampagne oder dem Absender ab; hier deklarieren Sie sie pro Nachricht. Wenn ein Zielland eine Registrierung des Absenders verlangt, ist diese Registrierung für eine Kategorie genehmigt, und ein Versand außerhalb dieser Kategorie wird mit 422 SenderCategoryNotPermitted abgelehnt. Beachten Sie: Der active-Status des Absenders kann Ihnen das nicht im Voraus sagen, weil er ohne Bezug zu einer Kategorie gemeldet wird; lesen Sie stattdessen die länderspezifischen Anforderungen. Setzen Sie das beim Port richtig um, statt alles auf einen Wert zu setzen.
  • Der Body ist in Segmenten begrenzt, und Bird kürzt nicht. Ein zu langer Body wird mit einem 422 abgelehnt. Nicht-GSM-7-Zeichen reduzieren die Kapazität eines Segments um mehr als die Hälfte. Wenn Ihr bisheriger Anbieter geschwungene Anführungszeichen und Bindestriche stillschweigend transliteriert hat, setzen Sie options.smart_encoding, um die gewohnten Segmentzahlen beizubehalten. Die Option ist standardmäßig deaktiviert, weil sie den von Ihnen verfassten Body verändert.
  • Verwenden Sie tags für Filterdimensionen und metadata für Kontext. Tags sind {name, value}-Paare, nach denen Sie Analytics filtern und aufschlüsseln können; Metadata sind beliebige JSON, die Bird speichert, bei Reads zurückgibt und bei jedem Webhook-Event mitliefert. Ein einzelnes Client-Referenzfeld bei Ihrem alten Anbieter entspricht in der Regel metadata.
  • Einzelversand-Scheduling und ausgehende MMS erfordern einen separaten Plan. scheduled_at, media_urls, validity_period und empfängerspezifische personalization sind reservierte Felder, die mit 422 SMSUnsupportedFeature abgelehnt werden. Diese Teile Ihrer Integration lassen sich nicht mit dem Rest umziehen: Halten Sie geplante Versendungen in Ihrer eigenen Queue und rufen Sie den Send-Endpoint zum vorgesehenen Zeitpunkt auf. Für Zielgruppen-Kampagnen evaluieren Sie Broadcasts separat; ein Broadcast ist kein Endpoint-Feld-Rename.
  • Verwenden Sie Idempotency-Key für begrenzte Retries. Senden Sie einen eindeutigen Key pro logischer Nachricht und nutzen Sie ihn für Retries des identischen Requests innerhalb des dreistündigen Replay-Fensters. Replays reduzieren doppelte Requests, sind aber keine Exactly-once-Zustellgarantie. Siehe Idempotency.

4. Opt-out-Liste übernehmen

Importieren Sie Ihre Opt-outs vor dem ersten Produktionsversand. Jemandem zu schreiben, der Ihrem alten Anbieter gesagt hat, er solle aufhören, ist der Compliance-Verstoß, der eine Migration scheitern lässt, und weder dem Carrier noch der Regulierungsbehörde ist es wichtig, welcher Anbieter den Eintrag verloren hat.
Eine Bird-Suppression deckt ein Absender-Abonnenten-Paar ab, das enger sein kann als der Service-, Profil- oder Account-weite Block Ihres alten Anbieters. Übertragen Sie den tatsächlichen Widerruf der Person auf jeden relevanten Absender und jedes Programm. Fügen Sie jedes Paar mit POST /v1/sms/suppressions hinzu:
Codebeispiel
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.csv
Der gleiche Import läuft über die CLI als bird sms suppressions add --destination +15550001234 --originator +15557654321.
Zwei Dinge, die Sie über den Import wissen sollten:
  • Beide Enden sind für absenderspezifische Suppressions erforderlich. Ein Workspace-weites Opt-out gehört zum separaten Preference Owner. Der Call ist idempotent: 201 legt eine neue Suppression an, 200 gibt die bereits vorhandene manuelle Suppression zurück. Ein erneutes Ausführen eines teilweisen Imports ist also sicher.
  • Importierte Paare erhalten reason: manual, was jede Kategorie einschließlich transaktionaler blockiert. Das ist strenger als eine Suppression, die Bird selbst über ein Stop-Keyword aufzeichnet. Wenn ein Abonnent nur Marketing abgelehnt hat, entscheiden Sie bewusst, ob Sie dieses Paar importieren.
Prüfen Sie das bestehende Keyword- und Präferenzverhalten, bevor Sie Code stillegen. Bird beantwortet unterstützte Keywords und zeichnet Suppressions auf, wo sein Länderkatalog gilt. Behalten Sie die Behandlung für nicht unterstützte Anfragen, breitere Präferenzen und andere Kontaktkanäle bei. Benutzerdefinierte Kampagnen-Keywords und -Antworten verwenden Keyword-Regeln. Siehe Opt-outs und Keywords für Abdeckung und Geltungsbereich.

5. Zustellberichte auf Webhooks umstellen

Registrieren Sie einen Endpoint mit POST /v1/webhooks und abonnieren Sie ihn für eine explizite Liste von Event-Typen. Das ist die strukturelle Änderung, die die meisten Anbieter erfordern: Statt einer Callback-URL pro Nachricht oder Nummer hat Ihr Workspace Endpoints, und jeder Endpoint abonniert die Events, die er erhalten soll.
Die Event-Namen von Bird folgen resource.action. Der Happy Path ist sms.accepted, dann sms.sent, dann sms.delivered, mit sms.undelivered, sms.failed, sms.expired und sms.rejected für den Rest, und sms.received für Antworten an Ihre Nummern. Die Übersetzung vom Status-Vokabular Ihres bisherigen Anbieters steht in Ihrer Anbieter-Anleitung, und die Event-Payloads finden Sie unter SMS-Events.
Die Korrelation lässt sich sauber portieren. Jedes Event enthält sms_id, workspace_id, to und from und spiegelt tags und metadata vom Versand wider. Ihr Handler liest also Ihre eigenen Identifier direkt vom Event, statt die Nachricht nachzuschlagen.
Zwei Mechaniken, die Sie mit dem Handler portieren müssen:
  • Zustellungen werden gemäß Standard Webhooks signiert, mit den Headern webhook-id, webhook-timestamp und webhook-signature und einem HMAC-SHA256 über {id}.{timestamp}.{raw body}. Anbieter, die mit einem eigenen Schema signieren, erfordern einen Austausch der Signaturprüfung; die Anleitung dazu steht unter Webhooks & Events.
  • Die Zustellung erfolgt at-least-once und ungeordnet. Deduplizieren Sie anhand von webhook-id und sortieren Sie nach dem Payload-timestamp, nie nach Ankunftsreihenfolge.
Eingehende Nachrichten folgen dem gleichen Modell. Abonnieren Sie sms.received einmal für den Workspace, statt eine Inbound-URL pro Nummer zu konfigurieren, und beachten Sie, dass Bird auch für eine Antwort, die einem Stop-Keyword entsprach, weiterhin sms.received auslöst, nachdem die Suppression aufgezeichnet wurde.

6. Gegen simulierte Ziele testen

Bird synthetisiert Zustellergebnisse für eine Reihe von Testzielen, sodass Sie Ihren portierten Versandpfad und Ihren Webhook-Handler gegen echte API-Responses und echte signierte Zustellungen testen können, ohne ein Endgerät zu benötigen. Es handelt sich um dieselben Nummern, die mehrere Anbieter für Test-Credentials verwenden, und eine Nachricht an eine davon erreicht nie einen Carrier.
ZielWas Ihre Integration sieht
+15005550001Bei Submission abgelehnt mit invalid_destination
+15005550002sms.sent, dann sms.undelivered mit unreachable
+15005550003sms.sent, dann sms.failed mit provider_unavailable
+15005550004sms.sent, dann sms.failed mit blocked_by_carrier
+15005550006sms.sent, dann sms.delivered
+15005550009sms.sent, dann sms.failed mit recipient_opted_out
Drei Bedingungen gelten, und die ersten beiden überraschen bei einem frischen Workspace:
  • Es handelt sich um US-Nummern, daher müssen die Vereinigten Staaten unter Destinations aktiviert sein, und from muss ein für die USA gültiger Absender sein. Eine alphanumerische Sender-ID wird dort abgelehnt.
  • Ein simulierter Versand wird berechnet, zum normalen Tarif des Ziellandes. Nichts erreicht ein Endgerät, aber die Wallet-Belastung ist real. Dimensionieren Sie Ihren Smoke-Test entsprechend.
  • Das Ergebnis ergibt sich allein aus dem Ziel. Es gibt kein separates Test-Credential und keinen Testmodus, den Sie ausschalten müssten.
Ein brauchbarer Smoke-Test sendet an +15005550006 und prüft, dass Ihr Handler sms.accepted über sms.sent bis sms.delivered durchläuft; sendet an +15005550002 und +15005550009 und prüft, dass Ihre Fehler- und Opt-out-Behandlung beim richtigen error-Code greift; und sendet eine echte Nachricht an ein Endgerät, das Sie kontrollieren, um zu bestätigen, dass Absender und Body wie erwartet dargestellt werden.
Schneiden Sie dann nach Traffic-Anteil um, nicht auf einen Schlag. Verlagern Sie einen kleinen Prozentsatz der Produktionsversendungen auf Bird, beobachten Sie das SMS-Log und die Metriken hinsichtlich Zustellraten und Fehlercodes im Vergleich zu dem, was Ihr alter Anbieter für dieselben Routen gemeldet hat, und erhöhen Sie den Anteil, sobald die Zahlen stimmen. Halten Sie die alte Integration deploybar, bis die erste vollständige Abrechnungsperiode in Ordnung aussieht.

Von einem bestimmten Anbieter migrieren

  • Twilio: formkodierter PascalCase zu JSON, Messaging Services zu Absendern, StatusCallback zu abonnierten Webhooks
  • Plivo: src und dst zu from und to, Powerpacks zu Absendern, DND-Paare zu Suppressions
  • Telnyx: der ähnlichste Send zu Bird, Messaging-Profile aufgelöst in Absender und Subscriptions, profilweite Opt-outs zu Paaren
  • Bandwidth: zwei Hosts zu einem, applicationId-Callbacks zu Workspace-Webhooks und eine Opt-out-Liste, die Ihre eigene Anwendung bereits vorhält
  • Sinch: Batches zu Einzelversendungen, body zu text, Gruppenmitgliedschaften als Suppressions neu aufgebaut
  • Infobip: ein dreistufiges Payload vereinfacht, eine kontobezogene Base-URL zu einem regionalen Host, eine Blocklist zu Paaren erweitert
  • Bird Connectivity Platform: rest.messagebird.com API, originator und recipients zu from und to, reportUrl-GET-Callbacks zu signierten Webhooks

Nächste Schritte

Verwandte Ressourcen

Weiter mit der Dokumentation, Anleitungen und Beispielen zu diesem Thema. Die Ressourcen sind auf Englisch.