clickSomo

Funnel & pemicu

Funnel adalah graf. Run adalah baris. Wait adalah waktu.

Itulah keseluruhan modelnya, dan setiap sifat sulit yang dimiliki produk ini berasal dari tiga kalimat tersebut. Mengedit funnel yang sedang berjalan aman karena sifat itu. Retry tidak bisa mengirim dua kali karena sifat itu. Seseorang yang berhenti berlangganan pada hari Selasa tidak mendengar apa pun pada hari Kamis karena sifat itu.

Apa yang benar-benar terjadi saat dijalankan

Menerbitkan sebuah funnel menulis sebuah versi yang tidak dapat diubah. Seseorang masuk, dan sebuah baris muncul: satu run, untuk kontak ini, terkunci pada versi itu, menyimpan node saat ini, waktu bangun, dan konteksnya sendiri.

Sebuah worker menyewa (lease) run yang waktunya bangun telah lewat, mengklaimnya dengan SKIP LOCKED sehingga dua worker tidak dapat mengambil run yang sama. Ia mengeksekusi node sampai mencapai wait atau terminal, lalu menulis waktu bangun berikutnya dan melepaskannya.

Sebuah node adalah fungsi murni dari run, kontak, dan node itu sendiri — dan efeknya di-commit dalam transaksi yang sama dengan kemajuan run itu sendiri. Sifat tunggal inilah yang membuat retry aman. Worker yang mati dalam setengah detik antara "kirim" dan "maju" meninggalkan keduanya atau tidak keduanya, tidak pernah salah satu.

Dan karena aplikasi yang menyediakan waktu, bukan database, baris yang ditulis sekarang jatuh tempo sekarang. Kolom penjadwalan yang defaultnya memakai jam database belum jatuh tempo pada saat ia ditulis, dan melewatkan tick yang justru menciptakannya — bug yang tampak seperti tidak ada apa-apanya sampai sebuah pesan terlambat satu jam.

Satu tick dari workerEksekusi
  • 1Sewawake_at <= now(), FOR UPDATE SKIP LOCKED. Antrean tanpa lease secara default mengirim dua kali.
  • 2EksekusiNode secara berurutan sampai mencapai wait atau terminal. Masing-masing menulis sebuah langkah: apa yang diputuskan, apa yang dipancarkan.
  • 3KomitEfek dan kemajuan, satu transaksi. Inilah seluruh triknya.
  • 4Tidurwake_at berikutnya ditulis. Belum ada baris hilir, dan tidak ada yang perlu ada.

Satu run per kontak per versi

Empat belas pemicu

Apa yang dapat memulai sebuah run

Beberapa di antaranya adalah hal yang Anda lakukan. Sebagian besar adalah hal yang dilakukan — atau tidak dilakukan — oleh pelanggan Anda, dan ketiadaan sebuah aksi sama baiknya sebagai pemicu dengan aksinya sendiri.

Mereka datang

form_submit, list_join, contact_created, tag_added dan segment_enter. Segmen adalah predikat yang hidup, jadi "masuk ke segmen" mencakup setiap "telah menjadi" yang dapat Anda ungkapkan — tiga pesanan, sembilan puluh hari sunyi, belanja melewati ambang batas.

Mereka melakukan sesuatu

page_visit dari cuplikan situs, message_opened, link_clicked, booking_made dan payment_made. Pesan yang dibuka sendiri merupakan sebuah event pada kontak, jadi satu funnel dapat menunggu reaksi terhadap hal terakhir yang ia kirim.

Waktu, atau Anda

date_field dengan offset — ulang tahun, perpanjangan, "setahun sejak", tujuh hari sebelum atau tiga hari sesudah. schedule untuk yang berulang. manual untuk pengumuman yang Anda kirim karena Anda memutuskan demikian.

Aplikasi Anda sendiri

api_event adalah event kustom yang Anda kirim dari kode Anda sendiri dengan token Anda sendiri. Apa pun yang diketahui produk Anda menjadi pemicu: diaktifkan, mengundang kolega, mencapai batas, dibatalkan, diekspor. Inilah yang mengubah alat surat-menyurat menjadi bagian dari produk Anda.

Masuk kembali, diputuskan sekali

Sebuah funnel bersifat re-entrant atau tidak, dan database menegakkannya: satu run per kontak per funnel kecuali Anda mengatakan sebaliknya. Pemicu yang sama menyala dua kali dalam detik yang sama tidak dapat menghasilkan dua run secara tidak sengaja.

Syarat masuk

Sebuah pemicu menyala dan spesifikasi masuk memutuskan apakah kontak khusus ini memenuhi syarat — sebuah predikat segmen di depan pintu. Lebih murah daripada node kondisi pada langkah pertama, dan menjaga graf tetap berbicara tentang apa yang terjadi, bukan tentang siapa yang boleh masuk.

Empat belas hal dapat memulainya. Enam belas hal dapat terjadi berikutnya.

Enam belas aksi dan tujuh node alur

Apa yang dapat dilakukan sebuah funnel, dan bagaimana ia memutuskan

Kirim sesuatu

send_email, send_sms, send_push, send_letter — empat kanal, satu graf — ditambah notify_team ketika orang yang perlu diberi tahu bekerja untuk Anda.

Ubah kontaknya

add_tag, remove_tag, add_to_list, remove_from_list, set_field. Menandai seseorang sambil berjalan itulah yang membuat segmen funnel berikutnya menjadi sederhana.

Menjangkau ke luar

http_request ke mana pun Anda mau, create_payment ke akun terhubung Anda sendiri, dan book_slot ke sumber daya pemesanan. Pembayarnya tetap milik Anda; tidak ada yang menjadi pelanggan kami.

Berpindah antar funnel

enter_funnel dan exit_funnel. Bangun satu rangkaian sambutan dan panggil dari empat tempat, alih-alih memelihara empat salinan yang saling menyimpang pada bulan Maret.

Dibuat saat pengiriman

ai_generate mengisi variabel merge per kontak, diukur terhadap kuota Anda dan di-cache berdasarkan hash kreatif dan atribut kontak — jika tidak, Anda akan membayar per penerima pada setiap pengiriman.

Tunggu, cabang, pisah, gabung

wait menerima durasi, tanggal-waktu, hari dalam seminggu beserta jam, atau kolom tanggal dengan offset. condition adalah predikat segmen dengan jalur ya dan tidak. split adalah A/B/n dengan bobot. join menyatukan kembali cabang-cabang.

goal — yang paling penting

Sebuah tujuan mengakhiri jalannya alur bagi siapa pun yang mencapainya. Mereka memesan, membeli, membalas: sisa rangkaian dibatalkan khusus untuk mereka. Tidak ada yang menerima pesan "kami merindukan Anda" sehari setelah mereka kembali, dan inilah node yang mencegahnya.

throttle dan quiet_hours

Throttle mengatur laju lonjakan agar kotak surat dengan batas laju rendah tidak dibombardir hingga ditangguhkan. Quiet hours menahan pesan hingga waktu yang pantas — diterapkan di lapisan pesan, bukan disalin ke setiap cabang grafik.

Diperiksa sebelum dapat dijalankan

Validator menolak hal yang sama untuk Anda maupun untuk AI

Sebuah grafik diperiksa sebelum dapat dipublikasikan, dan pemeriksaan itu tidak bersifat sekadar saran. Jalur kodenya sama baik funnel digambar oleh manusia maupun dibuat oleh model, dan itulah satu-satunya alasan funnel buatan model bisa dipercaya.

Tepat satu pintu masuk

Dua node pintu masuk adalah ambiguitas yang tidak disadari siapa pun sampai separuh daftar yang salah menerima rangkaian yang salah.

Setiap node dapat dijangkau

Cabang yang terisolasi adalah kesalahan, atau pesan yang Anda kira terkirim padahal tidak. Keduanya layak Anda ketahui.

Setiap siklus harus memuat wait

Perulangan tanpa wait adalah perulangan tak terbatas dengan pengiriman di tengahnya. Aturan inilah pembeda antara funnel dan insiden.

Setiap pengiriman punya kreatifnya

Node send_email tanpa kreatif dan subjek tidak dapat dipublikasikan. Pesan dengan subjek yang tepat dan isi kosong adalah mode kegagalan nyata; ditolak di sini.

Setiap variabel dikenal

Variabel merge divalidasi saat publikasi. {{frist_name}} adalah salah ketik yang Anda lihat saat menyunting, bukan "Halo ," yang tiba di empat puluh ribu kotak masuk.

Lalu simulasikan

Jalankan uji coba kontak nyata melalui seluruh grafik dan baca kembali jalur yang dilalui serta setiap pesan yang akan dikirim, beserta harinya. Tidak ada yang keluar dari sistem.

Kasus-kasus yang merepotkan

Tujuh hal yang merusak mesin naif

Setiap satu dari ini adalah pengujian dengan jam deterministik di belakangnya, karena masing-masing merusak implementasi yang tampak sempurna benar hingga bertemu kenyataan.

Apa yang diuji pada mesinFalsifikasi
  • 1Funnel yang berulang ke dirinya sendiriSah, umum, dan tidak masalah — asalkan siklusnya memuat wait, yang diwajibkan oleh validator.
  • 2Seseorang berhenti berlangganan di tengah alurSupresi diperiksa saat pengiriman, bukan saat masuk antrean. Memeriksa saat antrean berarti mengirim surat kepada orang-orang yang keluar selama masa tunggu.
  • 3Funnel disunting saat sepuluh ribu orang berada di dalamnyaMereka tetap menempuh versi yang mereka masuki, sampai selesai. Pendatang baru menempuh versi yang baru.
  • 4Pemicu yang sama menyala dua kali dalam satu detikSatu jalannya alur, karena keunikan adalah indeks, bukan pemeriksaan yang diikuti penyisipan.
  • 5Sebuah kontak dihapus di tengah alurProses berakhir. Penghapusan yang masih menyisakan urutan yang ditujukan kepada seseorang bukanlah penghapusan.
  • 6Jeda yang melintasi perubahan waktu musim panas"Tiga hari pukul sembilan pagi" berarti pukul sembilan pagi di kedua sisi perubahan jam.
  • 7Seorang worker dimatikan di antara pengiriman dan kemajuanEfek dan kemajuan adalah satu transaksi. Keduanya terjadi, atau tidak keduanya.

Jam deterministikSetiap pengujian meruntuhkan satu implementasi yang tampak masuk akal

Kampanye adalah separuh yang lain

Sebuah funnel bereaksi. Sebuah kampanye adalah siaran sekali jalan: audiens, jadwal, pembatasan laju, dan satu pengiriman. Ini bentuk benda yang berbeda dan sengaja dipisahkan, alih-alih berpura-pura menjadi funnel dengan satu simpul.

Dua aturan membuatnya aman. Audiens dimaterialisasi sekali dan menolak berjalan dua kali — memecahkan ulang akan diam-diam menambahkan semua orang yang bergabung sejak pengiriman dimulai, dan indeks deduplikasi akan menyembunyikannya dengan mencegah duplikat yang ia ciptakan sendiri. Dan penghitung dihitung ulang dari peristiwa pengiriman, tidak pernah ditambah di tempat, sehingga webhook yang dicoba ulang tidak dapat menggelembungkan laporan.

Mana yang dipakai: jika terjadi karena sesuatu yang dilakukan orang tersebut, itu adalah funnel. Jika terjadi karena sesuatu yang Anda putuskan pada hari Selasa, itu adalah kampanye. Jumlah otomasi pemasaran yang gagal karena memaksa yang kedua ke dalam bentuk yang pertama cukup mengejutkan.