Phễu & kích hoạt
Phễu là một đồ thị. Một lần chạy là một dòng. Một lần chờ là một khoảng thời gian.
Đó là toàn bộ mô hình, và mọi đặc tính khó của sản phẩm này đều xuất phát từ ba câu đó. Chỉnh sửa một phễu đang chạy an toàn nhờ chúng. Một lần thử lại không thể gửi trùng nhờ chúng. Một người hủy đăng ký vào thứ Ba không nghe gì vào thứ Năm nhờ chúng.
Điều gì thực sự xảy ra khi nó chạy
Việc xuất bản một funnel sẽ tạo ra một phiên bản bất biến. Ai đó tham gia, và một dòng xuất hiện: một lần chạy, cho liên hệ này, gắn với phiên bản đó, giữ node hiện tại, thời điểm thức dậy và ngữ cảnh riêng của nó.
Một worker thuê các lần chạy đã đến thời điểm thức dậy, chiếm chúng bằng SKIP LOCKED để hai worker không thể lấy cùng một lần chạy. Nó thực thi các node cho đến khi gặp một điểm chờ hoặc điểm kết thúc, rồi ghi thời điểm thức dậy tiếp theo và buông ra.
Một node là một hàm thuần túy của lần chạy, liên hệ và node — và các hiệu ứng của nó được commit trong cùng một giao dịch với bước tiến của chính lần chạy. Chính đặc tính này khiến việc thử lại an toàn. Một worker bị giết trong nửa giây giữa "gửi" và "tiến" sẽ để lại cả hai hoặc không cái nào, không bao giờ chỉ một.
Và vì ứng dụng cung cấp thời gian thay vì cơ sở dữ liệu, một dòng được ghi bây giờ là đến hạn ngay bây giờ. Một cột lịch mặc định theo đồng hồ cơ sở dữ liệu chưa đến hạn ngay tại thời điểm được ghi, và bỏ lỡ đúng nhịp đã tạo ra nó — một lỗi trông chẳng có gì cho đến khi một tin nhắn trễ một tiếng.
- 1Thuê
wake_at <= now(),FOR UPDATE SKIP LOCKED. Một hàng đợi không có cơ chế thuê sẽ gửi trùng theo mặc định. - 2Thực thiCác node theo thứ tự cho đến khi gặp điểm chờ hoặc điểm kết thúc. Mỗi node ghi một bước: nó quyết định gì, nó phát ra gì.
- 3Gửi commitHiệu ứng và bước tiến, trong một giao dịch. Đây là toàn bộ mẹo.
- 4NgủGhi
wake_attiếp theo. Chưa có dòng nào ở phía sau tồn tại, và cũng không cần.
Một lần chạy cho mỗi liên hệ mỗi phiên bản
Mười bốn trình kích hoạt
Điều gì có thể bắt đầu một lần chạy
Một số trong những thứ này là việc bạn làm. Phần lớn là việc khách hàng của bạn làm, hoặc không làm — và sự vắng mặt của một hành động cũng là một trình kích hoạt tốt như chính hành động đó.
Họ đến
form_submit, list_join, contact_created, tag_added và segment_enter. Một phân khúc là một vị từ trực tiếp, nên "vào phân khúc" bao phủ mọi "đã trở thành" mà bạn có thể diễn đạt — ba đơn hàng, im lặng chín mươi ngày, chi tiêu vượt một ngưỡng.
Họ làm gì đó
page_visit từ đoạn mã trên trang web, message_opened, link_clicked, booking_made và payment_made. Việc một tin nhắn được mở tự nó là một sự kiện trên liên hệ, nên một funnel có thể chờ phản ứng với thứ cuối cùng nó đã gửi.
Thời gian, hoặc bạn
date_field với một khoảng lệch — sinh nhật, gia hạn, "một năm kể từ", bảy ngày trước hoặc ba ngày sau. schedule cho cái định kỳ. manual cho thông báo bạn gửi vì bạn quyết định vậy.
Ứng dụng của chính bạn
api_event là một sự kiện tùy chỉnh bạn đăng từ mã của mình với token của riêng bạn. Bất cứ điều gì sản phẩm của bạn biết đều trở thành trình kích hoạt: kích hoạt, mời một đồng nghiệp, chạm giới hạn, hủy, xuất dữ liệu. Đây là thứ biến một công cụ gửi thư thành một phần của sản phẩm của bạn.
Tái tham gia, quyết định một lần
Một funnel hoặc cho phép tái tham gia hoặc không, và cơ sở dữ liệu thực thi điều đó: một lần chạy cho mỗi liên hệ mỗi funnel trừ khi bạn nói khác. Cùng một trình kích hoạt kích hoạt hai lần trong cùng một giây không thể vô tình tạo ra hai lần chạy.
Điều kiện tham gia
Một trình kích hoạt kích hoạt và đặc tả tham gia quyết định liên hệ cụ thể này có đủ điều kiện hay không — một vị từ phân khúc trước cửa. Rẻ hơn một node điều kiện ở bước đầu tiên, và nó giữ cho đồ thị nói về điều gì xảy ra thay vì ai được phép vào.

Mười bốn thứ có thể bắt đầu nó. Mười sáu thứ có thể xảy ra tiếp theo.
Mười sáu hành động và bảy node luồng
Một funnel có thể làm gì, và nó quyết định thế nào
Gửi thứ gì đó
send_email, send_sms, send_push, send_letter — bốn kênh, một đồ thị — cộng thêm notify_team khi người cần được báo làm việc cho bạn.
Thay đổi liên hệ
add_tag, remove_tag, add_to_list, remove_from_list, set_field. Việc đánh dấu ai đó trên đường đi là điều khiến phân khúc của funnel tiếp theo trở nên đơn giản.
Vươn ra bên ngoài
http_request đến bất cứ đâu bạn muốn, create_payment qua tài khoản kết nối của chính bạn, và book_slot qua một tài nguyên đặt lịch. Người trả tiền vẫn thuộc về bạn; không ai trở thành khách hàng của chúng tôi.
Di chuyển giữa các funnel
enter_funnel và exit_funnel. Xây dựng một chuỗi chào mừng và gọi nó từ bốn nơi, thay vì duy trì bốn bản sao dần lệch nhau vào tháng Ba.
Tạo tại thời điểm gửi
ai_generate điền các biến hợp nhất theo từng liên hệ, tính vào hạn mức của bạn và được lưu cache theo mã băm của nội dung sáng tạo và thuộc tính liên hệ — nếu không bạn sẽ phải trả tiền cho từng người nhận ở mỗi lần gửi.
Chờ, rẽ nhánh, tách, hợp nhất
wait nhận một khoảng thời gian, một ngày giờ, một ngày trong tuần kèm giờ, hoặc một trường ngày kèm độ lệch. condition là một vị từ phân khúc với nhánh có và nhánh không. split là A/B/n với trọng số. join gom các nhánh trở lại với nhau.
goal — điểm đến quan trọng nhất
Một mục tiêu kết thúc luồng chạy cho bất kỳ ai đạt được nó. Họ đã đặt lịch, đã mua hàng, đã trả lời: phần còn lại của chuỗi bị hủy riêng cho họ. Không ai nhận được dòng "chúng tôi nhớ bạn" vào ngày hôm sau khi họ vừa quay lại, và đây chính là nút ngăn điều đó.
throttle và quiet_hours
Throttle điều tiết một đợt gửi dồn dập để hộp thư có giới hạn tần suất thấp không bị dội liên tục đến mức bị tạm khóa. Quiet hours giữ lại tin nhắn đến một giờ hợp lý — áp dụng ở tầng tin nhắn, chứ không phải sao chép vào từng nhánh của đồ thị.
Được kiểm tra trước khi có thể chạy
Trình kiểm tra tính hợp lệ từ chối những điều giống nhau với cả bạn và AI
Một đồ thị được kiểm tra trước khi có thể xuất bản, và việc kiểm tra này không mang tính tham khảo. Đó là cùng một đường dẫn mã dù người vẽ phễu hay mô hình sinh ra nó — và đó là lý do duy nhất khiến phễu do AI sinh ra đáng tin.
Đúng một điểm vào
Hai nút điểm vào là một sự mơ hồ mà chẳng ai để ý cho đến khi nửa sai của danh sách nhận nhầm chuỗi.
Mọi nút đều với tới được
Một nhánh mồ côi hoặc là một sai sót, hoặc là một tin nhắn bạn tưởng đã gửi đi nhưng thực tế thì không. Cả hai đều đáng để được thông báo.
Một chu trình phải chứa một bước chờ
Một vòng lặp không có bước chờ là một vòng lặp vô hạn với một lệnh gửi nằm giữa. Quy tắc này là ranh giới giữa một phễu và một sự cố.
Mỗi lệnh gửi đều có nội dung sáng tạo
Một nút send_email thiếu nội dung sáng tạo và tiêu đề sẽ không thể xuất bản. Tin nhắn có đúng tiêu đề nhưng phần thân trống trống là một lỗi thất bại có thật; nó bị từ chối ngay tại đây.
Mọi biến đều được nhận diện
Các biến hợp nhất được kiểm tra tính hợp lệ khi xuất bản. {{frist_name}} là một lỗi chính tả bạn nhìn thấy khi đang chỉnh sửa, chứ không phải dòng "Chào ," đổ vào bốn mươi nghìn hộp thư.
Sau đó, mô phỏng nó
Chạy thử một liên hệ thật xuyên qua toàn bộ đồ thị và đọc lại đường đi đã chọn cùng mọi tin nhắn sẽ được gửi, kèm ngày gửi. Không có gì rời khỏi hệ thống.
Những trường hợp khó chịu
Bảy thứ làm gãy một engine ngây thơ
Mỗi trường hợp trong số này là một bài kiểm tra với đồng hồ xác định phía sau, vì mỗi cái đều làm gãy một bản triển khai trông hoàn toàn đúng cho đến khi chạm vào thực tế.
- 1Một phễu tự lặp vào chính nóHợp lệ, phổ biến và hoàn toàn ổn — miễn là chu trình chứa một bước chờ, điều mà trình kiểm tra bắt buộc.
- 2Có người hủy đăng ký giữa chừngViệc loại trừ được kiểm tra lúc gửi, không phải lúc xếp hàng. Kiểm tra lúc xếp hàng nghĩa là vẫn gửi thư cho những người đã rời đi trong thời gian chờ.
- 3Phễu được chỉnh sửa khi có mười nghìn người đang bên trongHọ tiếp tục đi trên phiên bản mà họ đã vào, đến cùng. Người vào mới đi trên phiên bản mới.
- 4Cùng một trình kích hoạt kích hoạt hai lần trong một giâyChỉ một luồng chạy, vì tính duy nhất là một chỉ mục chứ không phải một bước kiểm tra rồi mới chèn.
- 5Một liên hệ bị xóa giữa luồng chạyLuồng chạy kết thúc. Một việc xóa dữ liệu mà vẫn để lại một chuỗi tin nhắn còn đánh tên ai đó thì không phải là xóa dữ liệu.
- 6Một bước chờ trải qua thời điểm thay đổi giờ mùa hè"Ba ngày lúc chín giờ sáng" nghĩa là chín giờ sáng ở cả hai phía của mốc đổi giờ.
- 7Một worker bị giết giữa lúc gửi và lúc chuyển bướcHiệu ứng và bước tiến là một giao dịch duy nhất. Hoặc cả hai đều xảy ra, hoặc không cái nào.
Đồng hồ xác địnhMỗi bài kiểm tra phá vỡ một cách triển khai có vẻ hợp lý
Chiến dịch là nửa còn lại
Phễu phản ứng. Một chiến dịch là lần phát sóng một-lần: một đối tượng, một lịch trình, một giới hạn tốc độ và một lần gửi. Đó là một dạng khác biệt và được cố ý tách riêng thay vì giả vờ là một phễu chỉ có một nút.
Hai quy tắc làm cho nó an toàn. Đối tượng được hiện thực hóa một lần và từ chối chạy lần thứ hai — việc phân giải lại sẽ lặng lẽ thêm vào tất cả những người tham gia sau khi lần gửi bắt đầu, và chỉ số khử trùng lặp sẽ che điều đó bằng cách chặn chính các bản trùng lặp mà nó tạo ra. Và các bộ đếm được tính toán lại từ sự kiện gửi thư, không bao giờ tăng tại chỗ, nên một webhook được thử lại không thể làm phồng báo cáo.
Dùng cái nào: nếu nó xảy ra vì điều gì đó người đó làm, đó là phễu. Nếu nó xảy ra vì điều gì đó bạn quyết định vào một ngày thứ Ba, đó là chiến dịch. Một lượng đáng ngạc nhiên tự động hóa tiếp thị đi sai vì ép dạng thứ hai vào hình dạng của dạng thứ nhất.