# Migrasi SMS dari Plivo

Halaman ini memetakan Message API, Powerpack, dan callback pengiriman Plivo ke Bird. Ikuti [panduan migrasi utama](/docs/guides/sms/migrate) secara berurutan dan gunakan pemetaan ini untuk langkah 3, 4, dan 5.

Pengiriman adalah bagian yang mudah. Keduanya menerima JSON dengan nama field huruf kecil, dan keduanya menyimpan registrasi 10DLC di samping pengiriman, bukan di host terpisah. Dua hal berubah. `POST https://api.plivo.com/v1/Account/{auth_id}/Message/` Plivo mengautentikasi dengan Auth ID dan Auth Token melalui HTTP Basic; [`POST /v1/sms/messages`](/docs/api/reference/create-sms-message) menerima kunci bearer API terhadap host regional Anda, tanpa segmen akun di path. Dan Powerpack Plivo menggabungkan number pool, perilaku sticky sender, dan status opt-out ke dalam satu objek; Bird memisahkannya menjadi sender, supresi, dan aturan keyword, sehingga tidak ada yang perlu dibuat ulang sebagai Powerpack.

## Serahkan ini ke agent Anda

Gunakan ringkasan ini di coding agent Anda. Proses dimulai dengan penemuan dan menghasilkan rencana migrasi yang dapat ditinjau sebelum perubahan apa pun di produksi.

```text
Help me migrate my SMS integration from Plivo 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/plivo.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 Plivo 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.
```

## Petakan panggilan pengiriman

| Fungsi                    | Plivo                                              | Bird                                                    |
| ------------------------- | -------------------------------------------------- | ------------------------------------------------------- |
| Penerima                  | `dst`                                              | `to` (satu per permintaan)                              |
| Pengirim                  | `src` atau `powerpack_uuid`                        | `from`                                                  |
| Isi pesan                 | `text`                                             | `text`                                                  |
| Pemilih channel           | `type`: `sms`, `mms`, `whatsapp`                   | endpoint itu sendiri; `/v1/sms/messages` adalah SMS     |
| Intent                    | (tidak ada)                                        | `category`, wajib pada teks bebas                       |
| Laporan pengiriman        | `url` + `method`, per pesan                        | webhook workspace; hanya JSON `POST`, lihat di bawah    |
| Konteks bolak-balik       | penyimpanan Anda sendiri, dikunci berdasarkan UUID | `metadata`: JSON arbitrer, dikembalikan di setiap event |
| Label yang dapat difilter | (tidak ada)                                        | `tags`: pasangan `{name, value}`                        |
| Coba lagi yang aman       | (tidak didokumentasikan)                           | header `Idempotency-Key`                                |
| Media                     | `media_urls`                                       | tidak ada padanan: `media_urls` ditolak                 |

Catatan porting:

- **UUID Powerpack menjadi nilai sender biasa.** Plivo menyelesaikan number pool, sticky sender, dan kehadiran lokal di balik UUID. Bird menerima sender itu sendiri di `from`, jadi pilih per pengiriman, atau gunakan [template send](/docs/guides/sms/templates), yang memilih sender yang valid untuk tujuan dan menolak `from`.
- **`type` tidak memiliki padanan karena endpoint sudah membawanya.** Plivo memilih channel per permintaan; SMS, WhatsApp Bird, dan channel lainnya adalah endpoint terpisah. Codebase yang mengganti `type` saat runtime dipecah menjadi panggilan ke endpoint yang berbeda.
- **Tidak ada yang di Message API bersesuaian dengan `category`.** Tentukan per jenis pesan apakah itu `transactional`, `marketing`, `authentication`, atau `service`. Lalu lintas autentikasi khususnya harus dilabeli demikian, bukan dibiarkan di default marketing.
- **Tinjau semantik coba lagi secara terpisah.** Referensi pengiriman Plivo tidak mendokumentasikan kunci idempotensi atau mekanisme deduplikasi, sehingga timeout di sana membuat Anda menebak. Kirim header `Idempotency-Key` sejak port pertama untuk mengurangi risiko permintaan duplikat dalam jendela replay tiga jam; ini bukan jaminan pengiriman exactly-once.

## Pindahkan opt-out

[Layanan DND](https://www.plivo.com/docs/messaging/concepts/dnd-service) Plivo memblokir pesan keluar dari satu nomor Plivo ke satu tujuan begitu tujuan tersebut membalas dengan keyword opt-out. Pengiriman yang diblokir dikembalikan dengan tanda Plivo [kode error `200`](https://www.plivo.com/docs/messaging/troubleshooting/error-codes), yang merupakan salah satu kode error pesan mereka dan bukan status HTTP, meskipun tampilannya mirip. Pasangan itu juga cara kerja supresi Bird: satu pengirim dan satu subscriber, sehingga cakupan impor harus mencakup setiap pengirim dan program yang termasuk dalam permintaan orang tersebut.

**Satu hal yang meluas, dan inilah alasan untuk menghitung sebelum Anda mengimpor.** Di dalam kampanye US 10DLC, Plivo memperlakukan opt-out dari satu nomor mana pun sebagai opt-out dari setiap nomor yang terhubung ke kampanye tersebut. Bird menyimpan pasangan, sehingga subscriber yang opt-out dari kampanye empat nomor menjadi empat supresi, bukan satu. Hitung berapa pasangan yang dihasilkan dari daftar Anda sebelum memulai, karena itu menentukan apakah impor berupa loop puluhan atau ribuan.

Mengambil daftar keluar adalah ekspor konsol, bukan panggilan API: filter nomor di konsol Plivo, pilih, dan gunakan **Export CSV** dari menu Choose Action. Impor hasilnya melalui [loop supresi](/docs/guides/sms/migrate#4-carry-over-your-opt-out-list). [Membaca dan mengelola supresi](/docs/guides/sms/opt-outs-and-keywords#reading-and-managing-suppressions) berisi perintahnya, dan alasan supresi manual memblokir setiap kategori termasuk transaksional.

Bird menangani keyword stop yang didukung melalui katalog per negaranya. Pengiriman ke pasangan yang disupresi ditolak saat admisi dengan `E12077 SMSRecipientSuppressed`. Opt-out yang dilaporkan operator adalah hasil pengiriman `recipient_opted_out` yang terpisah. Ganti penanganan kode error Plivo `200` dengan jalur admisi dan pengiriman yang sesuai, dan buat ulang respons kustom sebagai [aturan keyword](/docs/guides/sms/opt-outs-and-keywords#campaign-keywords).

Ini penting lagi nanti, setelah lalu lintas mengalir. Alasan bertumpuk, bukan bergabung: pasangan yang Anda impor sebagai `manual` yang kemudian mengirim SMS `STOP` mendapat catatan kedua dengan alasan `keyword_stop`, dan pesan tetap dihentikan sampai setiap catatan untuk pasangan itu berakhir. Jadi memulihkan subscriber yang pernah Anda impor berarti menghapus keduanya, dan pemulihan yang hanya menghapus catatan keyword terlihat berhasil tetapi tidak mengubah apa pun.

## Terjemahkan status pengiriman

Gunakan tabel ini untuk membandingkan konsep siklus hidup, bukan untuk mengganti nama event secara mekanis. Bird memilih event kegagalan dari status dan alasan yang dilaporkan. Permintaan API yang ditolak tidak membuat pesan; penolakan setelah penerimaan dapat menghasilkan `sms.rejected`, termasuk penolakan operator. Bukti pengiriman yang hilang tetap tidak diketahui. Pertahankan status dan kode mentah dari provider di samping hasil yang dinormalisasi.

| Hasil                              | Plivo `message_state` | Bird              |
| ---------------------------------- | --------------------- | ----------------- |
| API menerima pesan                 | `queued`              | `sms.accepted`    |
| Diserahkan ke operator             | `sent`                | `sms.sent`        |
| Operator mengonfirmasi pengiriman  | `delivered`           | `sms.delivered`   |
| Operator melaporkan non-pengiriman | `undelivered`         | `sms.undelivered` |
| Kegagalan permanen                 | `failed`              | `sms.failed`      |
| Ditolak sebelum pengiriman         | `rejected`            | `sms.rejected`    |
| Jendela validitas habis            | (tidak ada)           | `sms.expired`     |

Dua mekanika berubah bersama namanya:

- **Endpoint menggantikan URL callback per pesan.** Plivo menerima `url` di setiap pengiriman, sehingga tujuan ditentukan oleh siapa pun yang menulis panggilan tersebut. Bird mengirim ke endpoint yang didaftarkan workspace Anda, masing-masing berlangganan tipe event yang diinginkan, sehingga konsumen baru adalah langganan baru, bukan perubahan di setiap titik panggilan.
- **Post JSON bertanda tangan menggantikan callback `GET`, jika itu yang Anda pilih.** `method` Plivo memilih `GET` atau `POST` untuk laporan pengiriman; Bird mengirim `POST` event JSON dan tidak menawarkan `GET`. Jika Anda menyetel `method=GET`, handler Anda membaca hasilnya dari parameter query string, dan handler itu perlu ditulis ulang, bukan hanya didaftarkan ulang. Hal yang sama berlaku satu panduan berikutnya, di jalur [Connectivity Platform](/docs/guides/sms/migrate/connectivity-platform).
- **Satu skema tanda tangan menggantikan tiga header.** Plivo menandatangani callback dengan `X-Plivo-Signature-V2`, `X-Plivo-Signature-Ma-V2`, dan `X-Plivo-Signature-V2-Nonce`. Bird mengirim JSON yang ditandatangani sesuai [Standard Webhooks](https://www.standardwebhooks.com), sehingga verifier diganti, bukan disesuaikan: tukar dengan resep di [Webhooks & events](/docs/guides/webhooks#verify-signatures).

Daftarkan endpoint sekali, sebutkan tipe event yang diinginkan handler Anda: event `sms.*` di atas adalah daftar yang perlu dilanggani, dan tidak ada wildcard yang menggantikannya. [Buat endpoint](/docs/guides/webhooks#create-an-endpoint) berisi perintahnya dan satu hal yang harus benar pada panggilan pertama, yaitu menyimpan signing secret yang ditampilkan respons tepat satu kali.

Nilai numerik `error_code` Plivo tidak memiliki peta satu-ke-satu. Bird melaporkan kegagalan dengan kode `error` standar seperti `invalid_destination`, `content_rejected`, `provider_unavailable`, atau `recipient_opted_out`; daftar lengkapnya ada di [halaman event](/docs/guides/sms/events#failure-events). Petakan alerting Anda ke kode-kode tersebut.

## Cutover

[Tujuan](/docs/guides/sms/migrate#1-enable-your-destination-countries), [pengirim](/docs/guides/sms/migrate#2-set-up-a-sender), dan [ramp lalu lintas](/docs/guides/sms/migrate#6-test-against-simulated-destinations) bersifat independen dari provider dan dibahas di panduan utama. Dua item khusus Plivo harus masuk dalam rencana cutover.

Brand dan kampanye 10DLC Anda terdaftar di The Campaign Registry melalui Plivo dan tidak otomatis menjadi registrasi Bird. Konfirmasi prosedur migrasi atau registrasi yang berlaku sebelum mengirimkan pekerjaan berbayar. **Rantainya lebih pendek di sini.** Plivo mendaftarkan profil terlebih dahulu lalu brand terhadapnya, di bawah `/v1/Account/{auth_id}/10dlc/`; Bird tidak memiliki objek profil, sehingga detail bisnis yang disimpan Plivo di profil diisi langsung pada brand itu sendiri. Mulai dari [Daftar untuk 10DLC](/docs/guides/sms/10dlc): halaman itu menjelaskan arti setiap field, tipe entitas yang dikenali registry, dan panggilan requirements yang memberi tahu apa yang harus Anda sediakan sebelum membuat brand, yang merupakan langkah berbayar.

Nomor yang Anda miliki di Plivo membutuhkan port yang diatur oleh dukungan, sesuai jadwal mereka, bukan Anda. Mulai lebih awal agar prosesnya berjalan bersamaan dengan perubahan kode.

## Langkah selanjutnya

- [Bandingkan Bird dan Plivo untuk SMS](/products/sms/compare/bird-vs-plivo): evaluasi produk dan pertimbangan migrasi

- [Mengirim SMS](/docs/guides/sms/sending-sms): payload tujuan porting Anda, secara lengkap
- [Opt-out dan keyword](/docs/guides/sms/opt-outs-and-keywords): cakupan keyword per negara dan manajemen supresi
- [Event SMS](/docs/guides/sms/events): kosakata event yang menjadi tujuan perpindahan callback handler Anda
- [Webhooks & events](/docs/guides/webhooks): pengaturan endpoint dan verifikasi Standard Webhooks

## 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)
