Bird

Migrasi dari Resend

Ikuti panduan migrasi utama secara berurutan, dengan pemetaan khusus Resend di halaman ini untuk langkah 1, 3, dan 4. Nama field yang mirip tidak membuat integrasi dapat saling menggantikan: tinjau lampiran, validasi batch, default kategori dan pelacakan, cakupan pembatasan dan preferensi, retensi percobaan ulang, serta verifikasi webhook. Pertahankan rute lama sampai kondisi observasi dan rollback yang disepakati terpenuhi.

Serahkan ini ke agen Anda

Tempelkan ini ke Claude Code, Cursor, atau Codex. Agen akan mengerjakan halaman ini terhadap repositori Anda, menggunakan permukaan Bird mana pun yang sudah tersedia: server MCP jika sudah terhubung, atau CLI jika sudah terinstal dan sudah login.
Contoh kode
I am moving an email integration from Resend 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/resend.md for the payload, suppression and event mapping, and https://bird.com/docs/guides/email/migrate.md for the order the steps go in.
3. Find and list my Resend usage in this repository before you change anything: the POST /emails and batch call sites and any SDK wrappers around them, the webhook handler and the URL it is registered at, and every domain I send from.
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 my current provider 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 the source team's provider suppressions using Resend's documented suppression API or dashboard CSV export. Separately inventory Contacts' global unsubscribe state, topic definitions and each contact's topic subscriptions, segment memberships, and my application's consent evidence. Read this guide's export and mapping section before proposing an import. Show me each source, capture time, page coverage, counts, exceptions, and target-owner mapping. An incomplete or failed export remains unresolved and gives no permission to send. Keep provider suppression provenance separately because Bird's public add creates a manual suppression applying to every category. Show me the proposed restriction and preference changes before importing; do not grant consent, infer a topic mapping, or unblock an address. Reconcile changes since the snapshot before production traffic.
6. Port each single-send and batch call site using this guide's field limits, attachment and batch differences, and retry rules. For webhooks, configure the Bird endpoint's signing secret, webhook-* headers, raw-body verification, and timestamp checks using the maintained Webhooks procedure. Do not assume a header rename completes verification. Preserve source event identity and reason. Map recipient outcomes separately from contact or suppression lifecycle events, and keep both provider handlers while late or in-flight events remain. Read 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 Resend path is a separate step that comes later: ask me again and wait for me to reply with the words retire the Resend 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

FungsiResendBird
Pengirimfromfrom
Penerimato / cc / bccto / cc / bcc (array)
Subjeksubjectsubject
Isihtml / texthtml / text (minimal satu untuk konten inline)
Reply-toreply_toreply_to (array)
Header kustomheadersheaders (objek string → string; nama yang dicadangkan ditolak)
Label yang dapat difiltertags: pasangan {name, value}tags: bentuk sama, batas lebih ketat; lihat di bawah
Konteks bolak-balikKonteks aplikasi dibawa melalui tagmetadata: JSON bebas dalam batas ukurannya
Penjadwalanscheduled_atscheduled_at; tinjau batasan template dan penjadwalan
Pelacakan buka/klikPengaturan dashboard per domaintrack_opens / track_clicks per pesan; default true
KategoriTidak ada field pengiriman yang setaraKategori template untuk pengiriman template, selain itu marketing; transactional yang ditetapkan secara eksplisit tetap tunduk pada pembatasan
Identitas percobaan ulangIdempotency-KeyIdempotency-Key; retensi berbeda dan tidak ada deduplikasi lintas provider
Periksa referensi pengiriman Resend bersama batas dan default field pengiriman kami. Tangani perbedaan berikut secara eksplisit saat memigrasikan:
  • Tag dan metadata. Bird menerima maksimal 20 tag dengan nama unik, nama maksimal 32 karakter, dan nilai maksimal 64 karakter, menggunakan [A-Za-z0-9_-]. Resend mengizinkan 256 karakter untuk nama atau nilai. Jika sesuai, pindahkan data korelasi aplikasi yang terlalu besar ke metadata, dalam batas 2 KB setelah serialisasi. Jangan memotong pengenal tanpa pemberitahuan. Lihat tag vs metadata.
  • Pelacakan dan kategori. Tetapkan pelacakan per pesan. Pengiriman template menggunakan kategori template sebagai default; pengiriman lain menggunakan marketing. Pesan pemasaran diblokir oleh opt-out dan supresi yang berlaku. transactional dapat melewati opt-out nontransaksional atau keluhan native, tetapi supresi manual, supresi hard bounce, dan preferensi untuk seluruh traffic tetap memblokirnya. Tinjau kebijakan supresi sebelum mengubah kategori.
  • Penjadwalan dan React. Petakan scheduled_at mengikuti batasan pengiriman terjadwal. Untuk parameter react milik Resend, render template React Email menjadi HTML di aplikasi Anda dengan @react-email/render, lalu kirim hasilnya sebagai html.
  • Lampiran. Resend mendukung path yang dihosting atau konten lampiran. Bird membutuhkan filename dan content dalam base64, tanpa field jalur file yang dihosting. Ambil dan enkode file yang dihosting dalam batas aplikasi yang sudah ada, menggunakan kontrol akses URL-nya. Validasi tipe MIME dan content_id inline berdasarkan kontrak lampiran kami. Bird mengizinkan maksimal 20 lampiran dalam batas estimasi ukuran pesan hasil generasi sebesar 20 MB; Resend mendokumentasikan batas lampiran terenkode sebesar 40 MB. Periksa batas pesan lengkap yang dihasilkan dan penerima sebelum mengirimkannya.
  • Permintaan dan hasil batch. Referensi batch Resend menerima array tingkat teratas berisi maksimal 100 objek pengiriman dan mengembalikan array data berisi ID; lampiran tidak didukung. Bird menerima {"messages":[...]} dengan 1–100 objek pengiriman lengkap. Bird memvalidasi setiap item sebelum mengantrekan apa pun: item tidak valid atau pengirim yang belum diverifikasi membuat batch ditolak dengan 422. Pesan untuk penerima yang disupresi masih dapat diterima, lalu melaporkan penolakan penerima. Respons 202 yang berhasil mengembalikan ID pesan anak sesuai urutan untuk dilacak satu per satu; penerimaan tidak membuktikan pesan telah sampai. Bird mendukung lampiran dan penjadwalan per item, dengan batas per pesan dan batas body batch setelah serialisasi sebesar 20 MB. Gunakan validasi dan hasil batch; jangan menyimpulkan perilaku kegagalan atau hasil parsial Resend dari contoh respons berhasilnya.
Percobaan ulang lintas panggilan SDK. Simpan secara persisten ID operasi aplikasi dan kunci idempotensi eksplisit untuk setiap pengiriman logis. SDK kami membuat kunci dalam satu panggilan dan memakainya kembali untuk percobaan ulang internal panggilan itu. Memanggil pengiriman lagi tanpa kunci eksplisit semula membuat pemanggilan dan kunci baru.
Bird menyimpan respons yang sudah selesai selama tiga jam; Resend mendokumentasikan jendela 24 jam. Setelah kedaluwarsa, percobaan ulang Bird dapat mengeksekusi operasi lagi. Kunci tidak melakukan deduplikasi lintas provider. Bird tidak menyimpan respons 5xx, dan operasi dapat berlaku sebelum responsnya tersimpan. Timeout, respons yang hilang, atau kedaluwarsanya penguncian operasi yang sedang berjalan membuat hasil pengiriman tidak pasti.
Rekonsiliasi catatan aplikasi dan ID pesan provider sebelum mengganti provider atau mencoba lagi pekerjaan yang hasilnya tidak pasti. Tangani konflik operasi yang sedang berlangsung dan permintaan yang berubah melalui prosedur idempotensi, opsi kunci eksplisit lintas panggilan, serta panduan percobaan ulang SDK.

Ekspor supresi

Resend mendokumentasikan API daftar supresi dan ekspor CSV melalui dashboard. Pastikan akses pada tim sumber dan telusuri setiap halaman hasil. Simpan ID sumber, asal, dan referensi sumber setiap alamat, beserta waktu pengambilan, cakupan halaman, jumlah, serta pengecualian. Contoh dokumentasi tidak membuktikan ketersediaan untuk akun Anda.
Gunakan event tersimpan untuk merekonsiliasi perubahan sejak snapshot. Ekspor yang tidak tersedia atau tidak lengkap tetap belum terselesaikan. Ekspor catatan berikut secara terpisah: daftar supresi kosong, keanggotaan audiens, atau pembatasan yang dihapus tidak membuktikan persetujuan.
Catatan sumberPenanganan dan batasan target
Supresi provider: email, asal, dan referensi sumberPOST /v1/email/suppressions publik milik Bird membuat manual, yang memblokir setiap kategori. Simpan alasan asli dan asal-usulnya dalam catatan migrasi aplikasi Anda; API ini tidak mengimpor alasan sumber. Tinjau kebijakan yang lebih ketat sebelum mengimpor.
unsubscribed kontakCatat opt-out email global yang telah ditinjau melalui pengelola preferensi, dengan bukti status dan cakupan sebenarnya. Flag sumber bernilai false tidak cukup sebagai bukti untuk membalikkan opt-out Bird yang sudah ada.
Definisi topik, default, dan langganan topik setiap kontakPertahankan definisi dan pilihan yang tercatat. Skema penulisan preferensi publik Bird tidak memiliki field topik; preferensi email berlaku untuk seluruh kanal. Simpan pembatasan khusus tujuan pada pengelola izin dan pemilihan penerima aplikasi yang sudah ada sampai Anda menyepakati pemetaan eksplisit. Jangan memperluas kelayakan.
Keanggotaan segmenPetakan pengelompokan yang telah ditinjau ke audiens statis Bird dan ID kontak sebenarnya, sambil merekonsiliasi penambahan dan penghapusan. Keanggotaan tidak memberikan persetujuan; perubahan properti tidak menghitung ulang audiens statis.
Bukti persetujuan aplikasiSimpan tujuan, asal-usul, dan stempel waktu pada pengelolanya yang sudah ada. Jangan mengarang waktu persetujuan dari waktu ekspor atau default provider. Keluarkan kelompok yang belum terselesaikan dari uji coba terbatas.
Untuk ekspor sumber, gunakan Kontak, definisi topik, topik kontak, dan segmen kontak Resend. Untuk pemetaan target, tinjau preferensi, penanganan berhenti berlangganan, Kontak, Audiens, dan sinkronisasi keanggotaan.
Ikuti impor supresi satu alamat publik, periksa setiap respons, dan rekonsiliasi ID serta jumlah yang dikembalikan dengan catatan sumber. Catatan manual baru mengembalikan 201; catatan manual yang sudah ada mengembalikan 200 tanpa perubahan. Mengimpor keluhan secara manual juga memblokir email transaksional. Baca kembali kecocokan alamat lengkap secara persis di setiap halaman: filter email Bird mencocokkan prefiks. Selesainya loop shell saja tidak membuktikan keberhasilan impor. Rekonsiliasi delta snapshot lagi sebelum mengalihkan traffic dan sebelum rollback. Rute massal khusus dashboard bukan endpoint migrasi publik.
Penulisan preferensi merupakan upsert dengan aturan kewenangan dan pengurutan. Periksa applied dan catatan yang tetap berlaku meskipun responsnya 200. Membalikkan opt-out yang tersimpan membutuhkan bukti persetujuan nyata yang lebih baru; izin yang dinyatakan atas nama seseorang tidak dapat mengesampingkan opt-out orang itu sendiri. Menghapus supresi tidak menghapus preferensi. Lihat pengelolaan supresi dan kontrak penulisan preferensi.

Terjemahkan event webhook

Gunakan tabel ini untuk menafsirkan event sumber dan menemukan pengelolanya di Bird. Ini bukan penggantian nama event yang berlaku universal. Lihat referensi event Resend dan event email kami.
Event sumber ResendInterpretasi dan pengelola di Bird
email.sentPenerimaan atau kemajuan upaya pengiriman, tanpa bukti pesan telah sampai. email.accepted dan email.processed milik Bird merupakan pengamatan siklus hidup penerima yang berbeda.
email.deliveredPenerimaan oleh server penerima; Bird email.delivered.
email.delivery_delayedKegagalan pengiriman sementara; Bird email.deferred.
email.bouncedBounce permanen; Bird email.bounced atau email.out_of_band_bounce, bergantung pada waktu terjadinya.
email.complainedKeluhan spam; Bird email.complained.
email.failedSimpan kesalahan dan identitas sumber. Tentukan apakah Bird menolak permintaan secara sinkron atau menolak penerima dengan alasan tertentu. Jangan menggolongkan setiap kegagalan sebagai email.rejected atau alamat yang mengalami bounce.
email.suppressedHasil pengiriman yang diblokir. Hasil penerima yang sebanding di Bird adalah email.rejected dengan recipient_suppressed; alasan itu mencakup preferensi yang berlaku serta catatan supresi.
email.openedPemuatan piksel pelacakan; Bird email.opened.
email.clickedPermintaan tautan yang dilacak; Bird email.clicked.
suppression.addedSiklus hidup pembatasan, terpisah dari pengiriman. Rekonsiliasi asal-usul dan kebijakan; Bird mencatat penambahan sebagai email_suppression.created.
suppression.removedPembatasan berubah; ini tidak membuktikan persetujuan. Tinjau pembatasan dan preferensi yang tersisa sebelum menghapus apa pun di Bird. Jangan mengarang event Bird yang setara atau otomatis membuka blokir alamat.
contact.updated dan status preferensi yang telah diperiksaPembaruan dapat membawa unsubscribed; periksa nilainya sebelum mencatat opt-out. Rekonsiliasi status dan asal-usul secara terpisah dari event penerima email.unsubscribed dan email.list_unsubscribed milik Bird. Periksa status topik melalui sumbernya sendiri.
Resend menggunakan svix-id, svix-timestamp, dan svix-signature. Bird menggunakan webhook-id, webhook-timestamp, dan webhook-signature. Ikuti Webhook dan event dengan kunci rahasia penandatanganan endpoint Bird, body permintaan mentah, dan pemeriksaan toleransi stempel waktu. Mengganti nama header saja tidak membuktikan verifikasi yang benar.
Lakukan deduplikasi berdasarkan provider dan identitas event. Simpan stempel waktu sumber, alasan asli, ID pesan, dan ID penerima Bird. Event pengiriman Resend memiliki cakupan pesan; event pengiriman Bird membawa recipient_id bersama email_id. Lacak hasil penerima yang diamati tanpa mengarangnya dengan menggandakan event pesan sumber. Uji kasus terlambat, duplikat, dan tanda tangan tidak valid pada handler Anda, serta pertahankan handler kedua provider selama pekerjaan terlambat masih ada.

Lakukan cutover

Selesaikan domain dan DNS serta smoke test sandbox dalam panduan utama. Sebelum mengubah routing produksi, tinjau catatan migrasi di bawah. Tetapkan penanggung jawab routing, persetujuan, dan rollback, kelompok yang memenuhi syarat, baseline, interval observasi, dan ambang penghentian. Konfirmasikan rekonsiliasi pembatasan dan preferensi, delta snapshot, autentikasi pengirim, verifikasi webhook, serta kasus representatif untuk rendering, lampiran, dan pesan terjadwal.
Pertahankan record pengiriman lama dan tinjau MX penerimaan secara terpisah. Kelulusan sandbox memberikan bukti untuk keputusan cutover; tunggu persetujuan eksplisit dalam prompt agen sebelum mengarahkan traffic produksi.
Alihkan kelompok yang disetujui dan memenuhi syarat melalui satu pengelola routing tanpa pengiriman ganda. Jika ambang penghentian tercapai, hentikan routing baru dan rekonsiliasi pekerjaan yang diterima, sedang berjalan, terjadwal, dan tidak pasti, beserta pembatasan baru. Konfirmasikan pembatalan jadwal sebelum memindahkan pekerjaan itu. Kembalikan operasi yang memenuhi syarat dan belum dikirim ke rute lama tanpa mengulang pengiriman yang ambigu secara membabi buta lintas provider. Pertahankan kedua konsumen event dan autentikasi sampai pekerjaan terlambat selesai. Menonaktifkan jalur Resend membutuhkan otorisasi eksplisit yang terpisah.
Catatan migrasi yang dapat disalin. Isi dengan referensi ke catatan aplikasi Anda yang sudah ada. Field kosong tidak memberikan persetujuan; catatan aplikasi yang sudah ada tetap menjadi sumber otoritatif. Jangan masukkan kredensial ke dalam catatan.
Contoh kode
Migration owner / routing owner / rollback owner / approver:
Source team / target workspace and region:
Application operation-record location:
Send and batch call sites / SDK wrappers / templates / React rendering:
Category and tracking decisions / attachment and batch adjustments:
Sending domains / side-by-side DNS / separate receiving MX decision:

For each source below: capture time, page/cursor coverage, counts, errors,
source-to-target mapping, imported or preserved counts, and delta watermark:
- Provider suppressions, original reasons, and source references:
- Contacts' global unsubscribe state:
- Topic definitions/defaults and each contact's subscriptions:
- Segment memberships and target contact IDs:
- Application purpose, consent evidence, and timestamps:
Unresolved mappings / excluded cohort / review owner:
Snapshot delta reconciliation before traffic and rollback:

Stable application operation IDs and explicit keys / provider message IDs:
Uncertain outcomes / reconciliation evidence / retry-window decisions:
Sandbox accepted, suppressed, bounce, complaint, and invalid-request evidence:
Representative rendering / attachments / scheduled-message evidence:
Raw-body signature / timestamp / duplicate / delayed / invalid-event evidence:

Eligible pilot cohort / baseline / observation interval / stop thresholds:
Explicit cut over to Bird approval (person, time, and record):
Observed recipient outcomes and event lag:

Rollback stop and routing owner / accepted, in-flight, or uncertain work:
Scheduled cancellation confirmations / eligible unsent operations:
New restriction and preference reconciliation / remaining exceptions:
Late-event consumers / retained DNS and authentication / drain evidence:
Separate retire the Resend path approval (person, time, and record):

Langkah berikutnya

  • Domain pengiriman: pendaftaran, siklus hidup verifikasi, dan record DNS yang Anda arahkan ulang
  • Webhook & event: penyiapan endpoint dan verifikasi Standard Webhooks
  • Sandbox pengujian: lakukan smoke test integrasi baru sebelum cutover
  • Supresi: konfirmasikan daftar yang Anda impor dan cara kami memeliharanya setelah itu
Lihat perbandingan Bird dan Resend untuk menentukan pilihan produk, atau lanjutkan ke sumber daya email untuk panduan implementasi dan operasional.