Migrasi dari Brevo
Halaman ini memetakan payload pengiriman transaksional, blocklist, dan webhook Brevo ke Bird. Ikuti panduan migrasi utama secara berurutan, dan gunakan pemetaan ini untuk langkah 1, 3, dan 4.
Brevo menyimpan supresi di dua tempat yang tidak saling terkait, satu untuk email transaksional dan satu untuk marketing. Baca Ekspor supresi sebelum Anda merencanakan langkah 3: mengekspor yang satu tanpa yang lain adalah kesalahan yang sering terjadi dalam migrasi ini.
Serahkan ini ke agen Anda
Tempel ini ke Claude Code, Cursor, atau Codex. Agen akan mengerjakan halaman ini terhadap repositori Anda, menggunakan surface Bird mana pun yang sudah tersedia: server MCP jika sudah terhubung, atau CLI jika sudah terinstal dan login.
Contoh kode
I am moving an email integration from Brevo to Bird. Route through it with me.
1. Check what you already have before setting anything up. If Bird's MCP server is connected, use its tools. If the Bird CLI is installed and signed in, use that. Either one is enough, and every step below is an action you take with whichever you have. Only if neither is present, follow https://bird.com/docs/ai/set-up-your-agent.md to set one up and sign me in. Every Bird docs page serves Markdown at its own URL with `.md` appended, so fetch that rather than the HTML.
2. Read https://bird.com/docs/guides/email/migrate/brevo.md for the payload, suppression and webhook mapping, and https://bird.com/docs/guides/email/migrate.md for the order the steps go in.
3. Find and list my Brevo usage in this repository before you change anything: calls to /v3/smtp/email and any SDK wrappers around them, whether I send with templateId or with htmlContent, the webhook handler and the URL it is registered at, and every domain I send from. Tell me the list before you edit anything.
4. Register each of those sending domains with Bird and give me the DNS records to publish, following https://bird.com/docs/guides/email/sending-domains.md. Leave every DNS record Brevo uses exactly as it is: Bird's records are published alongside them and both providers authenticate side by side until I switch traffic. Publishing DNS affects mail for the whole domain, so show me the records and let me publish them.
5. Export my suppressions and import them into Bird before any production traffic goes through Bird, so my first sends do not reach addresses that already bounced or complained. Brevo holds these in two separate places and I need both: GET /v3/smtp/blockedContacts for transactional blocks and unsubscribes, and the marketing blocklist, which lives on the contact records as emailBlacklisted rather than on a suppression endpoint. Page through both. The Bird import takes one address per request and is idempotent, so a partial re-run is safe. https://bird.com/docs/guides/email/suppressions.md has the reason taxonomy.
6. Port the send call and the webhook handler using the mapping tables on the provider page. Brevo's webhook security page documents credentials I configure on the endpoint rather than a payload signature, so check what my endpoint actually relies on today: if it is a username and password in the webhook URL, take them out and tell me to rotate that pair rather than reusing it, because a credential that has lived in a URL should be treated as exposed. Bird signs every delivery instead. https://bird.com/docs/guides/webhooks.md and https://bird.com/docs/guides/email/events.md.
7. Run my whole integration against Bird's mail sandbox before any production traffic, following https://bird.com/docs/guides/email/testing-sandbox.md. Sandbox sends run the real pipeline without reaching an inbox or touching my sending reputation.
8. Stop and ask me wherever a step needs a decision. Do not point production traffic at Bird until I have seen the sandbox results and replied with the words cut over to Bird. Retiring the Brevo path is a separate step that comes later: ask me again and wait for me to reply with the words retire the Brevo path. A reply that agrees without naming what it is authorising is not authorisation. Finish by telling me what is left that only a person can do.Petakan panggilan pengiriman
POST /v3/smtp/email milik Brevo dan POST /v1/email/messages kami memiliki struktur yang mirip. Sebagian besar pekerjaan adalah membuka objek alamat Brevo menjadi string biasa.
| Fungsi | Brevo | Bird |
|---|---|---|
| Auth | Header api-key | Authorization: Bearer |
| Pengirim | sender ({email, name}) | from |
| Penerima | to / cc / bcc (array berisi {email, name}) | to / cc / bcc (array berisi alamat) |
| Subjek | subject | subject |
| Isi | htmlContent / textContent | html / text (minimal satu) |
| Reply-to | replyTo ({email, name}) | reply_to (array) |
| Header kustom | headers (key Title-Case) | headers (objek string → string) |
| Label yang dapat difilter | tags (array berisi string) | Pasangan tags: {name, value} |
| Template tersimpan | templateId + params | template + template.parameters |
| Lampiran | attachment (url atau base64 content) | attachments (hanya base64, lihat di bawah) |
| Penjadwalan | scheduledAt | scheduled_at |
| Handle batch | batchId | (tidak ada padanan, lihat di bawah) |
| Salinan per penerima | messageVersions | satu pengiriman per versi, atau batch |
| Kategori | (tidak ada) | category: marketing (default) atau transactional |
Batas field dan nilai default kami (jumlah penerima, batas tag dan metadata) ada di Mengirim email.
Catatan porting:
- Alamat adalah objek di Brevo dan string di sini. {"email": "a@x.com", "name": "A"} menjadi "A <a@x.com>" atau cukup "a@x.com". Pembukaan yang sama berlaku untuk sender dan replyTo.
- tags adalah string biasa. Tag kami adalah pasangan. Tag seperti "welcome" menjadi {"name": "category", "value": "welcome"}. Pilih name yang stabil agar filter dasbor Anda bekerja seperti statistik tag Brevo sebelumnya.
- params adalah data template, bukan konteks bolak-balik. Ini menjadi template.parameters. Jika Anda juga menggunakannya untuk membawa identifier Anda sendiri ke event, pindahkan ke metadata, yang kami kirim kembali di setiap event webhook bersama email_id/recipient_id.
- messageVersions tidak memiliki padanan dalam satu panggilan. Setiap versi adalah kumpulan penerima dan payload yang berbeda, sehingga menjadi pengiriman terpisah atau satu entri dalam batch.
- batchId tidak memiliki padanan. batchId milik Brevo mengelompokkan pesan terjadwal sehingga Anda dapat membatalkan atau menjadwalkan ulang semuanya sekaligus. Pengiriman terjadwal di sini dialamatkan secara individual berdasarkan message id; tidak ada handle grup untuk dikirimkan atau dibatalkan.
- Lampiran melalui URL tidak didukung. Brevo menerima entri attachment sebagai URL untuk diambil. Ambil file sendiri dan kirim dalam format base64; lihat lampiran.
Ekspor supresi
Brevo membagi supresi ke dua sistem yang tidak berbagi endpoint maupun skema paginasi, dan migrasi yang hanya menarik yang pertama diam-diam kehilangan semua unsubscribe marketing:
- Blok dan unsubscribe transaksional: GET /v3/smtp/blockedContacts, dipaginasi (50 per halaman secara default, maksimal 100), setiap entri menyertakan alasan pemblokiran.
- Blocklist marketing: bukan endpoint supresi sama sekali. Ini ada di catatan kontak sebagai emailBlacklisted, jadi paginasi GET /v3/contacts (hingga 1000 per halaman dengan offset) dan simpan kontak yang flag-nya bernilai true.
Jalankan keduanya melalui loop impor. Alasan blokir Brevo dipetakan ke alasan hard_bounce, complaint, dan manual kami; Supresi memiliki taksonomi lengkapnya.
Terjemahkan event webhook
| Hasil | Brevo | Bird |
|---|---|---|
| Diterima/diproses | request | email.accepted → email.processed |
| Terkirim | delivered | email.delivered |
| Kegagalan sementara | deferred / soft_bounce | email.deferred |
| Bounce permanen | hard_bounce | email.bounced / email.out_of_band_bounce |
| Keluhan spam | spam | email.complained |
| Diblokir/disupresi | blocked / invalid_email | email.rejected |
| Dibuka | opened / unique_opened | email.opened |
| Klik | click | email.clicked |
| Unsubscribe | unsubscribed | email.unsubscribed / email.list_unsubscribed |
Dua perbedaan menentukan seberapa banyak handler Anda perlu berubah.
Periksa apa yang endpoint Anda andalkan saat ini sebelum Anda memindahkannya. Halaman keamanan webhook Brevo mendokumentasikan kredensial yang Anda konfigurasi pada endpoint: username dan password yang ditambahkan ke URL sebagai https://username:password@example.com/, bearer token, header permintaan kustom, dan rentang IP-nya. Kami menandatangani setiap pengiriman sesuai skema HMAC Standard Webhooks, sehingga verifikasi berpindah dari sesuatu yang dibawa pemanggil menjadi sesuatu yang dihitung handler Anda. Jika endpoint Anda saat ini menyimpan kredensial di URL-nya, hapus dan rotasi pasangan itu daripada menggunakannya kembali: kredensial yang pernah berada di URL sudah masuk ke log akses, ekspor konfigurasi, dan konsol vendor. Resepnya ada di Webhook dan event.
Brevo membedakan open dan klik dari varian uniknya. Kami tidak. opened dan unique_opened keduanya tiba sebagai email.opened, sehingga handler yang hanya menghitung varian unik perlu melakukan deduplikasi pada recipient_id sendiri. Event pengiriman kami berskala per penerima, sehingga pengiriman ke tiga penerima menghasilkan tiga hasil pengiriman, bukan satu.
Cutover
Ikuti langkah domain dan DNS serta uji coba sandbox di panduan utama. Keduanya tidak bergantung pada provider tertentu.
Langkah selanjutnya
- Domain pengiriman: registrasi, siklus verifikasi, dan catatan DNS yang Anda publikasikan
- Webhook dan event: pengaturan endpoint dan verifikasi Standard Webhooks
- Sandbox pengujian: uji coba integrasi baru sebelum cutover
- Supresi: konfirmasi daftar impor Anda dan cara kami mengelolanya selanjutnya
Sumber daya terkait
Lanjutkan dengan dokumentasi, panduan, dan contoh untuk topik ini. Sumber daya tersedia dalam bahasa Inggris.
Tonton panduannyaGetting started with emailJelajahi kemampuannyaEmailIkuti jalur pembelajaranBuild your first integrationPanduan implementasiSend your first email
Coba praktiknya dan dapatkan ringkasan implementasi