Product

Solusi

Sumber Daya

Company

Product

Solusi

Sumber Daya

Company

Menempatkan Sinyal untuk On-Premises: Integrasi PowerMTA

Burung

30 Agu 2019

Email

1 min read

Menempatkan Sinyal untuk On-Premises: Integrasi PowerMTA

Burung

30 Agu 2019

Email

1 min read

Menempatkan Sinyal untuk On-Premises: Integrasi PowerMTA

Mari kita menjelajahi rincian pengaturan PowerMTA untuk SparkPost Signals.

Mari kita membahas secara rinci tentang mengatur PowerMTA untuk SparkPost Signals. Anda akan membutuhkan:

  • Sebuah host untuk menjalankan versi terbaru dari PowerMTA – baik mesin baru, atau mesin yang sudah ada

  • Akun SparkPost dengan izin kunci API untuk “Incoming Events: Write” seperti dijelaskan di sini

Kita akan mengatur PowerMTA untuk mengalirkan peristiwa ke akun SparkPost Anda, lalu Anda akan dapat menggunakan yang berikut ini:

Pertama, instal (atau tingkatkan) ke PowerMTA 5.0 r4 atau yang lebih baru, mengikuti petunjuk instalasi v5.0 biasa yang cukup mudah. Kemudian kita akan melalui langkah-langkah berikut:

  • Konfigurasi PowerMTA connector ke SparkPost Signals

  • Siapkan Engagement Tracking dengan domain pelacakan kustom

  • Pilih aliran lalu lintas PowerMTA mana yang akan dilaporkan ke Signals

  • Menguji bahwa acara Anda mencapai Signals

  • Tinjauan cara menggunakan nama yang bermakna yang ditampilkan dengan baik dalam pelaporan.

Kita juga akan membahas aspek pengaturan PowerPMTA spesifik lainnya yang digunakan dalam demo Signals kami:

  • FBL events (Keluhan Spam) dan remote (out-of-band) bounces

  • Konfigurasi injeksi, termasuk DKIM

  • Konfigurasi FBL dan OOB

  • Pengaturan dan penamaan VirtualMTA (dan bagaimana ini muncul dalam laporan SparkPost Signals Anda)

Akhirnya, ada “fitur tambahan” dengan kode untuk memastikan nama kampanye Anda kompatibel dengan konvensi nama PowerMTA X-Job.

Konfigurasikan PowerMTA connector

Konfigurasi Signals dijelaskan dalam 5.0 User Guide bagian 10.1. Di sini kita akan mulai dengan “Use Case #2”, yang mengaktifkan Signals untuk semua lalu lintas dari host PowerMTA ini, dan mengaktifkan SparkPost engagement tracking.

# # SparkPost Signals # <signals> api-key ##my ingest API key here## upload-url https://api.sparkpost.com/api/v1/ingest/events log-verbose true min-free-space 1G engagement-tracking sparkpost # ini menghidupkan pelacakan open dan click di PowerMTA customer-id 123 # Nomor akun SparkPost Anda di sini </signals> enable-signals true

Berikut adalah penjelasan setiap atribut:

api-key

Ini unik untuk akun SparkPost Anda, ini adalah nilai yang Anda dapatkan dari SparkPost sebelumnya.

upload-url

Ini harus sesuai dengan alamat layanan API SparkPost Anda, apakah itu US atau EU. Untuk info lebih lanjut lihat di sini. Nilai umum adalah:

SparkPost (US): https://api.sparkpost.com/api/v1/ingest/events

SparkPost EU:    https://api.eu.sparkpost.com/api/v1/ingest/events

log-verbose

Direktif ini opsional dan ketika diaktifkan, memberikan sedikit lebih banyak info dalam file pmta.log, yang dapat berguna selama pengaturan untuk memastikan bahwa semuanya berfungsi dengan benar. Setiap menit, bahkan ketika tidak ada lalu lintas, Anda akan melihat:

2019-07-26 11:47:57 Signals: Menemukan 0 file

Dengan lalu lintas, Anda akan melihat sesuatu seperti:

2019-07-26 11:50:57 Signals: Menemukan sp1-0000000000003FBD.json 2019-07-26 11:50:57 Signals: Mentransfer sp1-0000000000003FBD.json dengan sukses. 2019-07-26 11:50:57 Signals: Menemukan 1 file, mentransfer 1 file dengan sukses

min-free-space

Ini memberitahu PowerMTA ambang ruang disk setelah itu harus mulai menghapus file event JSON SparkPost paling lama untuk membuat ruang bagi file baru ketika ruang disk berkurang.

enable-signals

Ini memberi tahu PowerMTA untuk mengunggah ke Signals, dalam hal ini secara global untuk semua lalu lintas (info lebih lanjut di sini, untuk v5.0). Anda dapat lebih selektif tentang aliran lalu lintas mana yang ingin Anda unggah jika Anda mau.

Anda juga dapat menandai lalu lintas PowerMTA tertentu agar dilaporkan sebagai milik subaccount SparkPost – ini adalah cara lain untuk membedakan satu aliran lalu lintas dari yang lain.

engagement-tracking, customer-id
Solusi Engagement Tracking PowerMTA secara default ke domain pelacakan untuk layanan yang dihosting di SparkPost US. Anda menetapkan ID pelanggan numerik SparkPost Anda; berikut adalah instruksi untuk menemukannya.

tracking-domain

Untuk akun SparkPost EU, tambahkan baris berikut:

tracking-domain pmta.eu.spgo.io # ini adalah endpoint untuk SparkPost EU

Custom Tracking domain

Jika Anda lebih memilih untuk menggunakan domain pelacakan Anda sendiri (ini lebih baik dari segi keterkiriman), lakukan hal berikut:

  • Buat domain pelacakan dengan penyedia DNS Anda dengan membuat record CNAME. Ini biasanya akan menjadi subdomain dari domain tingkat atas Anda, mis. track.mycompany.com .

track.mycompany.com CNAME pmta.spgo.io # jika Anda memiliki akun SparkPost US track.mycompany.com CNAME pmta.eu.spgo.io # jika Anda memiliki akun SparkPost EU

Anda juga dapat menggunakan domain pelacakan HTTPS, meskipun ini lebih rumit (lihat langkah konfigurasi SparkPost untuk domain pelacakan HTTPS).

  • Daftarkan domain pelacakan di akun SparkPost Anda, dan verifikasi. Tunggu beberapa menit sebelum mencoba ini, untuk memungkinkan perubahan DNS Anda menyebar melalui Internet, tergantung pada penyedia DNS Anda.

  • Konfigurasi PowerMTA untuk menggunakan domain tersebut sebagai pengganti yang default, dengan

tracking-domain yourdomain.com # Masukkan domain Anda sendiri di sini

Anda dapat memeriksa bahwa email yang dikirimkan memiliki “open pixels” yang ditambahkan dan tautan yang dibungkus, dengan melihat ke dalam dari email (di Gmail, gunakan menu di kanan atas dan pilih “Tampilkan Asli”).

Show original option highlighted


Anda akan melihat piksel terbuka di awal dan akhir HTML dalam email. Setiap tautan HTML juga diubah untuk memiliki REF menunjuk ke domain pelacakan.

HTML code highlighted


Itu semua yang Anda butuhkan untuk membuat SparkPost Signals bekerja dengan Engagement Tracking bawaan PowerMTA.

Mencegah tautan tertentu dalam email html Anda untuk dilacak

Anda dapat mencegah PowerMTA melacak tautan tertentu, dengan mengatur atribut kustom data-msys-clicktrack ke “0”  :

<a href="#" data-msys-clicktrack="0">Contoh</a>

PowerMTA tidak akan membungkus tautan tersebut. Itu juga akan menghapus atribut itu sebelum mengirim pesan ke penerima Anda.

Pilih aliran lalu lintas PowerMTA mana yang akan dilaporkan ke Signals

Anda dapat memilih Sinyal untuk aktif:

  • Secara global (ini yang kami gunakan dalam contoh di atas)

  • Untuk beberapa Virtual MTAs dan tidak lainnya

  • Untuk beberapa kolam Virtual MTA dan tidak lainnya

  • Untuk alamat "Pengirim" atau "Dari" tertentu yang diteruskan oleh PowerMTA, dalam kombinasi dengan pilihan Virtual MTA / kolam Virtual MTA

Konfigurasi ini sangat kuat dan diilustrasikan melalui serangkaian contoh penggunaan (v5.0) dalam Panduan Pengguna.

Anda dapat memilih Sinyal untuk aktif:

  • Secara global (ini yang kami gunakan dalam contoh di atas)

  • Untuk beberapa Virtual MTAs dan tidak lainnya

  • Untuk beberapa kolam Virtual MTA dan tidak lainnya

  • Untuk alamat "Pengirim" atau "Dari" tertentu yang diteruskan oleh PowerMTA, dalam kombinasi dengan pilihan Virtual MTA / kolam Virtual MTA

Konfigurasi ini sangat kuat dan diilustrasikan melalui serangkaian contoh penggunaan (v5.0) dalam Panduan Pengguna.

Anda dapat memilih Sinyal untuk aktif:

  • Secara global (ini yang kami gunakan dalam contoh di atas)

  • Untuk beberapa Virtual MTAs dan tidak lainnya

  • Untuk beberapa kolam Virtual MTA dan tidak lainnya

  • Untuk alamat "Pengirim" atau "Dari" tertentu yang diteruskan oleh PowerMTA, dalam kombinasi dengan pilihan Virtual MTA / kolam Virtual MTA

Konfigurasi ini sangat kuat dan diilustrasikan melalui serangkaian contoh penggunaan (v5.0) dalam Panduan Pengguna.

Menguji bahwa acara Anda mencapai Signals

Berikut adalah tampilan dari SparkPost Signals, terhubung ke PowerMTA. Anda dapat melihat bahwa skor kesehatan bervariasi.

Health score dashboard


Nama Kampanye tersedia sebagai aspek pelaporan, bersama dengan Subaccount, IP Pool, Mailbox Provider, dan Sending Domain.

Sambil melihat log PowerMTA, Anda dapat memeriksa bahwa data peristiwa mencapai SparkPost dengan melihat layar Integrasi Signals.

Signals integration screen

Di layar Pencarian Peristiwa SparkPost Anda, Anda harus melihat peristiwa muncul dalam beberapa menit. Ini akan mencakup peristiwa Inject dan Delivery, serta Bounce, dan mungkin Out-of-Band Bounce dan Spam Complaint jika Anda telah mengonfigurasi PowerMTA untuk menangani itu untuk Anda.
Jika Anda mengaktifkan Pelacakan Keterlibatan, Anda juga akan melihat peristiwa open, initial_open, dan click.

Menggunakan nama yang berarti agar terlihat baik dalam pelaporan

Mengatur nama PowerMTA VirtualMTA Pool dan nama Pekerjaan agar bermakna dan mudah dibaca oleh manusia sangat berharga untuk dilakukan. Ini muncul secara langsung dalam aspek SparkPost Signals Anda dan laporan Ringkas.

Seperti yang disebutkan sebelumnya, Anda tidak perlu membuat kolam ini di akun SparkPost Anda. SparkPost mengambilnya dari konfigurasi PowerMTA Anda.

Berikut cara konfigurasi PowerMTA diterjemahkan ke istilah SparkPost.

Istilah PowerMTAIstilah SparkPost Reports / SignalsDomain Penerima
(bagian domain dari bidang "rcpt" dalam file Akuntansi).Domain PenerimaBagian domain dari header "Sender" atau "From" dalam pesan yang diteruskan oleh PowerMTA.
(bagian domain dari "orig" dalam file Akuntansi).Domain PengirimVirtualMTA (nama)—Kolam VirtualMTA (nama)
("vmtaPool" dalam file akuntansi)Kolam IP (nama)smtp-source-host a.b.c.d
("dlvSourceIp" dalam file akuntansi)Mengirim IP a.b.c.dPekerjaan (nama)
("jobId" dalam file akuntansi)ID Kampanye (nama)—Template (nama)"Subaccount" bukanlah konsep bawaan PowerMTA.

Namun, PowerMTA dapat menandai virtualMTAs, Kolam MTA virtual, atau domain Sender-or-From dengan ID subaccount untuk keperluan pelaporan SparkPost.

ID Subaccount (nomor)FBL (event)Keluhan Spam (event)Remote Bounce (event)Out-of-Band bounce (event)

Mengatur setidaknya satu alamat smtp-source-host juga memungkinkan SparkPost untuk mengidentifikasi alamat IP pengiriman secara benar sehingga muncul pada acara Injection dan Deliveri, serta dalam tampilan laporan Ringkas.

Nama pekerjaan diatur di PowerMTA melalui header dalam pesan yang diinjeksikan. Selain memungkinkan kontrol pekerjaan individu (jedah/lanjutkan dll) yang bermanfaat dengan sendirinya, PowerMTA meneruskan nama-nama tersebut ke laporan SparkPost Signals sebagai "ID kampanye". Lihat Panduan Pengguna v5.0 bagian 12.8 “Melacak kampanye di PowerMTA dengan JobID”.

Ada beberapa hal yang perlu diperhatikan mengenai penamaan pekerjaan. Sementara SparkPost (dengan format JSON dan escape JSON) mengizinkan karakter seperti <SPACE> dalam nama kampanye, header mail lebih ketat. Karakter valid yang diperbolehkan dalam header X-Job adalah:

A-Za-z0-9!#$%&'()*+,-./:;<=>?@[\]^_{|}~ 

Dengan kata lain, karakter yang tidak diperbolehkan termasuk <SPACE>, tanda petik dua “ dan backtick `. Jika Anda terbiasa bekerja dengan nama X-Job, ini tidak mengejutkan, dan nama ID kampanye Anda akan “berfungsi begitu saja” dalam pelaporan SparkPost. Jika seperti saya, Anda belajar SparkPost terlebih dahulu, Anda mungkin ingin alat untuk memastikan nilai X-Job Anda aman; lihat fitur bonus di akhir artikel ini.

Acara FBL (Spam Complaints) dan remote (out-of-band) bounces

PowerMTA dapat menerima dan memproses acara FBL (dikenal di SparkPost sebagai acara Keluhan Spam) dan pantulan jarak jauh (dikenal di SparkPost sebagai pantulan di luar jalur, karena balasan datang beberapa waktu kemudian, bukan selama percakapan SMTP).

Ada artikel di Forum Dukungan Port25 tentang cara mengatur Bounce Processor dan FBL Processor. Jika Anda adalah pengguna PowerMTA yang sudah ada, Anda mungkin sudah memiliki ini.

Berikut adalah konfigurasi yang saya buat untuk demo, berdasarkan artikel-artikel ini dan berorientasi untuk hosting PowerMTA di Amazon EC2.

Jika Anda sudah terbiasa dengan konfigurasi PowerMTA di area ini, Anda bisa melewati bagian ini, hingga ke garis horizontal berikutnya.

Konfigurasi Injection

Kami akan menggunakan port 587 untuk pesan-pesan yang disuntikkan, yang akan datang melalui Internet publik dari host lain. Kami perlu mencegah pelaku jahat menemukan dan menyalahgunakan layanan ini, jadi kami menerapkan autentikasi nama pengguna/sandi dan TLS opsional, mirip dengan endpoint injeksi SMTP SparkPost.

Kami ingin dapat mengirim pesan dari sumber yang terautentikasi dengan benar ke tujuan mana pun. Kami juga menginginkan listener terpisah pada port 25 untuk respons FBL dan bounce jarak jauh yang tidak memerlukan autentikasi.

# # Alamat IP dan port di mana untuk mendengarkan koneksi SMTP masuk # smtp-listener 0.0.0.0:587 smtp-listener 0.0.0.0:25

Dalam deklarasi <source> berikut, kami menggunakan autentikasi nama pengguna/sandi dan TLS opsional untuk melindungi dari injeksi pesan jahat. Kami juga menetapkan batasan kecepatan pada koneksi yang gagal mencoba sandi.

Pengaturan Anda mungkin berbeda; misalnya, jika Anda memiliki jaringan pribadi antara injektor dan PowerMTA, Anda tidak memerlukan autentikasi sandi.

# Satu aturan sumber untuk semua injeksi, internal atau eksternal. Terapkan autentikasi, kecuali untuk bounced dan FBL # <source 0/0> log-connections false log-commands false # PERINGATAN: sangat detail! hanya untuk pengembangan log-data false # PERINGATAN: lebih detail lagi! smtp-service true # izinkan layanan SMTP smtp-max-auth-failure-rate 1/menit allow-unencrypted-plain-auth false allow-starttls true rewrite-list mfrom </source> <source {auth}> selalu izinkan penyampaian ya # hanya jika autentikasi berhasil default-virtual-mta default process-x-job true </source>

Deklarasi <source {auth}> (lihat di sini. v5.0) diterapkan setelah autentikasi berhasil. Di sini, itu memungkinkan penyampaian selanjutnya, menyiapkan grup virtual MTA default yang akan digunakan, dan menambahkan header X-Job (yang akan dilaporkan oleh SparkPost Signals sebagai campaign_id).

Daftar ulang menghubungkan pesan yang disuntikkan agar menggunakan domain MAIL FROM tertentu (alias domain bounce atau Return-Path:).

# # Ubah alamat MAIL FROM agar sesuai dengan domain bounce # <rewrite-list mfrom> mail-from *@pmta.signalsdemo.trymsys.net *@bounces.pmta.signalsdemo.trymsys.net </rewrite-list>

Kemudian kami menyiapkan konfigurasi TLS dan nama pengguna / sandi SMTP, sesuai dengan rekomendasi saat ini.

# # Amankan layanan masuk dengan nama pengguna, sandi dan TLS. SMT 2020-06-15 # smtp-server-tls-certificate /etc/pmta/pmtasignalsdemo.pem smtp-server-tls-allow-tlsv1 false smtp-server-tls-allow-tlsv1.1 false smtp-server-tls-allow-tlsv1.2 true smtp-server-tls-allow-tlsv1.3 true # # Pengguna SMTP (diautentikasi melalui SMTP AUTH) # <smtp-user SMTP_Injection> password ##MASUKKAN KATA SANDI ANDA DI SINI## authentication-method password </smtp-user>

Kami dapat memeriksa bahwa TLS v1.0 yang tidak aman (dihapus) tidak diterima menggunakan alat uji SMTP favorit saya, swaks.

swaks --server pmta.signalsdemo.trymsys.net --port 587 --to test@trymsys.net --from any@sparkpost.com --tls --tls-protocol tlsv1

Kami melihat:

*** Startup TLS gagal (connect(): error:00000000:lib(0):func(0):reason(0)) *** STARTTLS dicoba tetapi gagal

Sama juga untuk –tls-protocol tlsv1_1.

Marilah kita juga menerapkan penandatanganan DKIM pada pesan keluar kami, karena ini adalah praktik yang baik (Saya mengikuti instruksi ini untuk mengatur kunci).

# # DKIM # domain-key mypmta, pmta.signalsdemo.trymsys.net, /etc/pmta/mypmta.pmta.signalsdemo.trymsys.net.pem

FBL dan OOB configuration

Sekarang .. akhirnya .. kami menyatakan domain spesifik mana yang terbuka untuk bouncing remote dan respons FBL. Kami tidak ingin menyampaikan itu ke mana pun (untuk mencegah serangan backscatter), cukup memproses respons tersebut secara internal.

# # Aktifkan pemrosesan Bounce dan FBL pada domain tertentu # relay-domain pmta.signalsdemo.trymsys.net relay-domain bounces.pmta.signalsdemo.trymsys.net relay-domain fbl.pmta.signalsdemo.trymsys.net <bounce-processor> deliver-unmatched-email no deliver-matched-email no <address-list> domain pmta.signalsdemo.trymsys.net domain bounces.pmta.signalsdemo.trymsys.net </address-list> </bounce-processor> <feedback-loop-processor> deliver-unmatched-email no deliver-matched-email no <address-list> domain fbl.pmta.signalsdemo.trymsys.net </address-list> </feedback-loop-processor>

Anda dapat melihat saya telah mengatur dua domain bounce, saat saya bermain-main dengan menggunakan/menggunakan aturan Rewrite mfrom.

Domain FBL biasanya kemudian terdaftar dengan layanan eksternal seperti Microsoft SNDS; lihat artikel ini untuk informasi lebih lanjut. Untuk demo ini, FBL akan berasal dari Bouncy Sink, jadi tidak perlu mendaftar.

Menguji pendengar SMTP

Hal ini penting untuk menguji bahwa listener SMTP Anda memerlukan otorisasi untuk tujuan umum apa pun, menolak pesan apa pun yang tidak secara khusus ditujukan ke domain FBL dan remote-bounce.

swaks --server pmta.signalsdemo.trymsys.net --port 25 --to test@strange.pmta.signalsdemo.trymsys.net --from any@sparkpost.com

Tanggapan, seperti yang diharapkan, menunjukkan bahwa penyampaian ditolak:

550 5.7.1 penyampaian ditolak untuk penerima dalam "RCPT TO:<test@strange.pmta.signalsdemo.trymsys.net>

(Akhir dari deskripsi pengaturan demo).

Pengaturan dan penamaan VirtualMTA

PowerMTA VirtualMTAs (dan kolam VirtualMTA) adalah fitur yang kuat untuk mengelola aliran pesan, dan fitur pelaporan PowerMTA / SparkPost Signals bekerja paling baik dengan ini aktif.

# # Arahkan semua lalu lintas keluar melalui virtual mta / pool ini. # Deklarasikan alamat IP pengiriman di sini, sehingga SparkPost signals menyerap injeksi (dikenal sebagai "penerimaan") acara # akan membawa atribut sending_IP yang benar # <virtual-mta mta1>     smtp-source-host 172.31.25.101 pmta.signalsdemo.trymsys.net </virtual-mta> <virtual-mta-pool default>     virtual-mta mta1     <domain *>         max-smtp-out    20       # maksimal koneksi *per domain*         bounce-after    4d12h    # 4 hari, 12 jam         retry-after     10m      # 10 menit         dkim-sign       ya     </domain> </virtual-mta-pool>

Pengaturan virtual-mta-pool dilaporkan di SparkPost sebagai “IP Pool”, dan tersedia sebagai aspek pelaporan SparkPost Signals (menu drop-down di bawah grafik).

Health score dashboard


Laporan Ringkasan juga menunjukkan IP Pool sebagai aspek pelaporan “Group By”.

Summary report dashboard


Seperti yang disebutkan sebelumnya dalam artikel ini, mengatur setidaknya satu alamat smtp-source-host juga memungkinkan SparkPost untuk mengidentifikasi alamat IP pengiriman dengan benar, sehingga muncul pada acara Injection dan Delivery, serta pada Laporan Ringkasan:

Summary report with the group by filter set to "Sending IP"

Itulah semua yang Anda butuhkan untuk mendapatkan integrasi dasar yang bekerja antara PowerMTA dan SparkPost Signals. Anda akan menemukan contoh file konfigurasi lengkap di sini.

Sebelum Anda pergi, berikut adalah fitur bonus yang saya sebutkan.

Fitur bonus: pengecekan/penyaringan nama X-Job

Untuk memastikan string karakter aman digunakan sebagai nama PowerMTA X-Job, berikut adalah fungsi Python sederhana untuk memetakan karakter yang tidak aman ke garis bawah "_"

import re def pmtaSafeJobID(s):    """    :param s: str    :return: str    Memetakan string ID kampanye sembarang ke karakter yang diizinkan untuk header PMTA X-Job.    Lihat https://download.port25.com/files/UsersGuide-5.0.html#tracking-a-campaign-in-powermta-with-a-jobid    Khususnya tidak mengizinkan <sp> " ` tetapi mengizinkan sebagian besar karakter lainnya.    """    # Catatan harus melarikan diri ' - [ ] dan double-melarikan diri \ - lihat https://docs.python.org/3/library/re.html    disallowedChars = '[^A-Za-z0-9!#$%&\'()*+,\-./:;<=>?@\[\\\\\]^_{|}~]'    kembalikan re.sub(disallowedChars, '_', s)

Ini menggunakan ekspresi reguler Python dengan cara tertentu. Ini mendeklarasikan serangkaian karakter yang tidak diizinkan menggunakan operator “set complement” ^ daripada mencantumkan semua karakter yang diizinkan. Itu berarti kita menangkap (dan membuat aman) karakter di luar set 7-bit biasa. Kita bisa menunjukkannya menggunakan fragmen uji ini:

s='' for i in range(32, 256): s += chr(i) print(pmtaSafeJobID(s))

Menghasilkan

_!_#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^__abcdefghijkl mnopqrstuvwxyz{|}~___________________________________________________________ ______________________________________________________________________

Anda dapat melihat bahwa <SPACE>, tanda kutip ganda “, dan backtick `, serta semua karakter di luar ~ dipetakan ke garis bawah.

A person is standing at a desk while typing on a laptop.

Platform AI-native lengkap yang dapat beradaptasi dengan pertumbuhan bisnis Anda.

Product

Solusi

Sumber Daya

Company

Pengaturan privasi

Segera hadir

Sosial

Newsletter

Tetap terinformasi dengan Bird melalui pembaruan mingguan ke kotak masuk Anda.

Daftar

© 2025 Bird

A person is standing at a desk while typing on a laptop.

Platform AI-native lengkap yang dapat beradaptasi dengan pertumbuhan bisnis Anda.

Product

Solusi

Sumber Daya

Company

Pengaturan privasi

Sosial

Newsletter

Tetap terinformasi dengan Bird melalui pembaruan mingguan ke kotak masuk Anda.

Daftar

© 2025 Bird