# SMS migreren van Twilio

Deze pagina vertaalt Twilio's Programmable Messaging API, Messaging Services en statuscallbacks naar Bird. Volg de [hoofdmigratiegids](/docs/guides/sms/migrate) op volgorde en gebruik deze vertalingen voor stap 3, 4 en 5.

Twee verschillen bepalen de hele migratie. Twilio's `POST /2010-04-01/Accounts/{AccountSid}/Messages.json` accepteert form-encoded `PascalCase`-parameters geauthenticeerd met je Account SID en Auth Token; [`POST /v1/sms/messages`](/docs/api/reference/create-sms-message) accepteert JSON geauthenticeerd met een bearer API-key tegen je regionale host. En een Twilio Messaging Service kan afzenderselectie, opt-outafhandeling en callbackconfiguratie bundelen. Vertaal elk gedrag afzonderlijk naar de Bird-eigenaar; het hernoemen van de SID naar een afzenderwaarde behoudt niet de hele service.

## Geef dit aan je agent

Gebruik deze briefing in je coding-agent. Het begint met inventarisatie en levert een reviewbaar migratieplan op voordat er iets in productie verandert.

```text
Help me migrate my SMS integration from Twilio 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 https://bird.com/docs/guides/sms/migrate/twilio.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 Twilio 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.
```

## Vertaal de send-call

| Wat het doet            | Twilio                            | Bird                                                                               |
| ----------------------- | --------------------------------- | ---------------------------------------------------------------------------------- |
| Ontvanger               | `To`                              | `to` (één per request)                                                             |
| Afzender                | `From` of `MessagingServiceSid`   | `from`                                                                             |
| Body                    | `Body`                            | `text`                                                                             |
| Contenttemplate         | `ContentSid` + `ContentVariables` | beoordeel content apart; Bird-systeemtemplates zijn geen import van Twilio Content |
| Intent                  | (geen)                            | `category`, verplicht bij vrije tekst                                              |
| Filterbare labels       | (geen)                            | `tags`: `{name, value}`-paren                                                      |
| Retourcontext           | eigen opslag, gekeyd op SID       | `metadata`: willekeurige JSON, meegegeven bij elk event                            |
| Afleverrapporten        | `StatusCallback`                  | een werkruimte-webhook geabonneerd op de onderstaande afleverevents                |
| Transliteratie          | `SmartEncoded`                    | `options.smart_encoding` (standaard `false`)                                       |
| Veilig opnieuw proberen | (niet bij Messages)               | `Idempotency-Key`-header                                                           |
| Inplannen               | `ScheduleType` + `SendAt`         | geen equivalent: `scheduled_at` wordt geweigerd                                    |
| Media                   | `MediaUrl`                        | geen equivalent: `media_urls` wordt geweigerd                                      |
| Geldigheid              | `ValidityPeriod`                  | geen equivalent: `validity_period` wordt geweigerd                                 |
| Linkverkorting          | `ShortenUrls`                     | geen equivalent                                                                    |

De drie geweigerde velden zijn [gereserveerd](/docs/guides/sms/sending-sms#reserved-fields) en beantwoorden `422 SMSUnsupportedFeature`. Laat inplannen en mediaverwerking voorlopig waar ze zijn.

Opmerkingen bij het porten:

- **Los de Messaging Service-gedragingen apart op.** Twilio lost de afzenderpool, sticky sender en geomatch op achter de SID. Bird verwacht de afzender zelf in `from`, dus kies de afzender per verzending, of gebruik een [template-verzending](/docs/guides/sms/templates), die een geldige afzender selecteert voor de bestemming en `from` weigert.
- **Een tekenlimiet wordt een [segmentlimiet](/docs/guides/sms/sending-sms#segments-and-encoding).** De lengtes komen dicht in de buurt voor GSM-7-tekst, maar het faalgedrag niet: Bird kort nooit in, dus een te lange body wordt geweigerd met een `422` in plaats van ingekort.
- **Niets in de Messages API komt overeen met `category`.** Beslis per berichttype of het `transactional`, `marketing`, `authentication` of `service` is. Authenticatieverkeer moet specifiek als zodanig gelabeld worden in plaats van in een marketingstandaard te blijven.
- **Twilio's testcredentials worden gesimuleerde bestemmingen.** De magische nummers waarmee je al test, waaronder `+15005550006` en `+15005550001`, leveren ook hier gesynthetiseerde uitkomsten op, met twee verschillen: er is geen apart testcredential en de verzendingen worden gefactureerd. De uitkomsten staan in de [hoofdgids](/docs/guides/sms/migrate#6-test-against-simulated-destinations).

## Neem opt-outs over

Twilio kan een opt-out koppelen aan een nummer of een Messaging Service. Een servicebreed verzoek kan meerdere afzenders dekken. Behoud die reikwijdte bij het importeren in de afzender-en-abonnee-suppressies van Bird, of gebruik de juiste werkruimtevoorkeur voor een verzoek dat echt werkruimtebreed is.

Twilio's [Advanced Opt-Out-documentatie](https://www.twilio.com/docs/messaging/tutorials/advanced-opt-out) vermeldt dat rapportage over geblokkeerde nummers niet beschikbaar is via de Console of REST API. Vraag een export aan via het beschikbare supportproces en leg die naast je eigen voorkeursrecords, inkomende logs en supportverzoeken. Alleen een keyword-log kan onvolledig zijn.

Importeer het beoordeelde resultaat via de [suppressieworkflow](/docs/guides/sms/migrate#4-carry-over-your-opt-out-list). Een handmatige suppressie blokkeert elke categorie voor dat paar, dus controleer het beoogde bereik in plaats van het stilzwijgend te versmallen of te verbreden.

Twilio's `21610` signaleert een uitgeschreven ontvanger. In Bird wordt een onderdrukt paar bij toelating geweigerd met `E12077 SMSRecipientSuppressed`, voordat er een bericht bestaat. De afleverfout `recipient_opted_out` rapporteert juist een downstream opt-out. Controleer [de keyword-dekking van Bird](/docs/guides/sms/opt-outs-and-keywords) voordat je een bestaande handler uitschakelt, en behoud opt-outmechanismen buiten de ingebouwde catalogus.

## Vertaal afleverstatussen

Gebruik deze tabel om lifecycleconcepten te vergelijken, niet om events mechanisch te hernoemen. Bird kiest een fout-event op basis van de gerapporteerde status en reden. Een geweigerd API-request maakt geen bericht aan; een afwijzing na acceptatie kan `sms.rejected` opleveren, inclusief een carrierafwijzing. Ontbrekend afleverbewijs blijft unknown. Bewaar de ruwe providerstatus en -code naast je genormaliseerde uitkomst.

| Uitkomst                           | Twilio `MessageStatus`  | Bird                             |
| ---------------------------------- | ----------------------- | -------------------------------- |
| API heeft het bericht geaccepteerd | `queued`, `accepted`    | `sms.accepted`                   |
| Overgedragen aan de carrier        | `sending`, `sent`       | `sms.sent`                       |
| Carrier bevestigt aflevering       | `delivered`             | `sms.delivered`                  |
| Carrier meldt niet-aflevering      | `undelivered`           | `sms.undelivered`                |
| Permanent falen                    | `failed`                | `sms.failed`                     |
| Request geweigerd bij toelating    | request error           | HTTP-fout; geen bericht of event |
| Geldigheidsvenster verstreken      | (geen)                  | `sms.expired`                    |
| Ingepland of geannuleerd           | `scheduled`, `canceled` | nog geen equivalent              |

Drie mechanismen veranderen mee met de namen:

- **Endpoints vervangen callback-URL's.** Twilio post naar de `StatusCallback` op het bericht of de Messaging Service. Bird levert af aan endpoints die je werkruimte registreert, elk geabonneerd op de gewenste eventtypen, dus een nieuwe consumer is een nieuw abonnement in plaats van een redeploy.
- **Ondertekende JSON vervangt form-encoded posts.** Twilio stuurt `application/x-www-form-urlencoded` met een `X-Twilio-Signature`-header; Bird stuurt JSON ondertekend volgens [Standard Webhooks](https://www.standardwebhooks.com). Vervang de verificatie door het recept in [Webhooks & events](/docs/guides/webhooks#verify-signatures).
- **Inkomende berichten komen binnen als events.** Twilio's per-nummer "A message comes in"-webhook verwacht een TwiML-response waarmee je app automatisch kan antwoorden. Bird stuurt `sms.received` naar hetzelfde geabonneerde endpoint als al het andere, en er is geen responsebody die een antwoord verstuurt: antwoord door het send-endpoint aan te roepen, of laat [keyword-regels](/docs/guides/sms/opt-outs-and-keywords) voor je antwoorden.

Registreer het endpoint eenmalig en noem de eventtypen die je handler wil: de `sms.*`-events in de bovenstaande tabel zijn de lijst om je op te abonneren, en er is geen wildcard die ze vervangt. [Maak een endpoint aan](/docs/guides/webhooks#create-an-endpoint) bevat het commando, waarom de catalogus opgesomd moet worden, en het ene dat bij de eerste call goed moet gaan: het opslaan van het ondertekeningsgeheim dat de response precies één keer toont.

Twilio's numerieke foutcodes hebben geen één-op-één-vertaling. Bird rapporteert een fout met een gestandaardiseerde `error`-code zoals `invalid_destination`, `content_rejected`, `provider_unavailable` of `recipient_opted_out`; de volledige lijst staat op de [eventspagina](/docs/guides/sms/events#failure-events). Koppel je alerting aan die codes in plaats van aan de 30000-reeks.

## Overschakelen

[Bestemmingen](/docs/guides/sms/migrate#1-enable-your-destination-countries), [afzenders](/docs/guides/sms/migrate#2-set-up-a-sender) en de [verkeersopbouw](/docs/guides/sms/migrate#6-test-against-simulated-destinations) zijn provideronafhankelijk en worden behandeld in de hoofdgids. Twee Twilio-specifieke punten horen op het overschakelplan: je 10DLC-merk en -campagne zijn geregistreerd bij The Campaign Registry via Twilio en worden niet automatisch Bird-registraties. Bevestig de toepasselijke migratie- of registratieprocedure voordat je betaald werk indient. Nummers die je bezit bij Twilio vereisen een port die support regelt, op hun schema in plaats van het jouwe.

Begin voor de Bird-zijde bij [Registreren voor 10DLC](/docs/guides/sms/10dlc): het behandelt wat elk veld betekent, de entiteitstypen die het register erkent, en de requirements-call die je vertelt wat je moet aanleveren voordat je het merk aanmaakt, de stap die kosten met zich meebrengt.

## Volgende stappen

- [Vergelijk Bird en Twilio voor SMS](/products/sms/compare/bird-vs-twilio): productevaluatie en migratieoverwegingen

- [SMS verzenden](/docs/guides/sms/sending-sms): de volledige payload waar je naartoe port
- [Opt-outs en keywords](/docs/guides/sms/opt-outs-and-keywords): keyword-dekking per land en suppressiebeheer
- [SMS-events](/docs/guides/sms/events): de eventvocabulaire waar je statushandler naartoe verhuist
- [Webhooks & events](/docs/guides/webhooks): endpoint-setup en Standard Webhooks-verificatie

## Related resources

- [Choose a sender for your markets](/explained/sms/which-sms-sender-type-should-i-use) (answer)
- [Check your message segments](/tools/sms-segment-calculator) (tool)
- [Compare SMS providers](/products/sms/compare) (product)
