Lejki i wyzwalacze
Lejek to graf.Przebieg to wiersz.Oczekiwanie to godzina.
To cały model, a każda trudna właściwość tego produktu wynika z tych trzech zdań. Edycja żywego lejka jest bezpieczna przez nie. Ponowienie nie może wysłać dwa razy przez nie. Osoba, która wypisze się we wtorek, nie usłyszy nic w czwartek przez nie.
Co naprawdę dzieje się przy uruchomieniu.
Publikacja lejka zapisuje niezmienną wersję. Ktoś wchodzi i pojawia się wiersz: jeden przebieg, dla tego kontaktu, przypięty do tej wersji, z bieżącym węzłem, godziną pobudki i własnym kontekstem.
Proces roboczy dzierżawi przebiegi, którym minęła godzina pobudki, przejmując je z SKIP LOCKED, żeby dwa procesy nie wzięły tego samego. Wykonuje węzły aż do oczekiwania albo końca, po czym zapisuje kolejną godzinę pobudki i puszcza.
Węzeł jest funkcją czystą przebiegu, kontaktu i węzła — a jego skutki zatwierdzają się w tej samej transakcji co przesunięcie przebiegu. Ta jedna właściwość sprawia, że ponowienie jest bezpieczne. Proces ubity w pół sekundy między „wyślij” a „przesuń” zostawia albo jedno i drugie, albo nic — nigdy połowę.
A ponieważ czas podaje aplikacja, a nie baza, wiersz zapisany teraz jest teraz wymagalny. Kolumna terminu z domyślną wartością z zegara bazy nie jest wymagalna w chwili zapisu i przegapia dokładnie ten cykl, który ją stworzył — błąd, który wygląda jak nic, dopóki wiadomość nie wyjdzie godzinę za późno.
- 1Dzierżawa
wake_at <= now(),FOR UPDATE SKIP LOCKED. Kolejka bez dzierżaw domyślnie wysyła dwa razy. - 2WykonanieWęzły po kolei aż do oczekiwania albo końca. Każdy zapisuje krok: co postanowił, co wysłał.
- 3ZatwierdzenieSkutki i przesunięcie, jedna transakcja. Na tym polega cała sztuczka.
- 4SenZapisany kolejny
wake_at. Nic dalszego jeszcze nie istnieje i nie musi.
Jeden przebieg na kontakt i wersję
Czternaście wyzwalaczy
Co może uruchomić przebieg.
Część z nich to rzeczy, które robisz Ty. Większość to rzeczy, które robi — albo których nie robi — Twój klient, a brak działania jest wyzwalaczem równie dobrym jak działanie.
Pojawiają się
form_submit, list_join, contact_created, tag_added i segment_enter. Segment jest żywym predykatem, więc „wchodzi do segmentu” obejmuje każde „stał się”, które da się wyrazić — trzy zamówienia, dziewięćdziesiąt dni ciszy, wydatki powyżej progu.
Coś robią
page_visit ze snippetu na stronie, message_opened, link_clicked, booking_made i payment_made. Otwarcie wiadomości jest zdarzeniem na kontakcie, więc jeden lejek może czekać na reakcję na to, co sam przed chwilą wysłał.
Czas albo Ty
date_field z przesunięciem — urodziny, odnowienie, „rok od”, siedem dni przed albo trzy dni po. schedule dla cyklicznych. manual dla ogłoszenia, które wysyłasz, bo tak postanowiłeś.
Twoja własna aplikacja
api_event to zdarzenie, które wysyłasz z własnego kodu własnym tokenem. Wszystko, co wie Twój produkt, staje się wyzwalaczem: aktywował się, zaprosił kolegę, uderzył w limit, zrezygnował, wyeksportował dane. To ten wyzwalacz zamienia narzędzie do mailingu w część Twojego produktu.
Ponowne wejście, ustalone raz
Lejek albo pozwala na ponowne wejście, albo nie, i pilnuje tego baza: jeden przebieg na kontakt i lejek, chyba że powiedziałeś inaczej. Ten sam wyzwalacz odpalony dwa razy w tej samej sekundzie nie stworzy przypadkiem dwóch przebiegów.
Warunki wejścia
Wyzwalacz odpala, a specyfikacja wejścia rozstrzyga, czy ten konkretny kontakt jest kwalifikowany — predykat segmentu ustawiony przed drzwiami. Taniej niż węzeł warunku na pierwszym kroku i sprawia, że graf mówi o tym, co się dzieje, a nie o tym, kogo wolno wpuścić.
Czternaście rzeczy może to uruchomić.
Szesnaście może się potem wydarzyć.
Szesnaście akcji i siedem węzłów przepływu
Co lejek potrafi zrobić i jak decyduje.
Wyślij coś
send_email, send_sms, send_push, send_letter — cztery kanały, jeden graf — plus notify_team, gdy osobą, którą trzeba powiadomić, jest ktoś od Ciebie.
Zmień kontakt
add_tag, remove_tag, add_to_list, remove_from_list, set_field. Oznaczanie ludzi po drodze jest tym, co sprawia, że segment następnego lejka jest prosty.
Sięgnij na zewnątrz
http_request do czegokolwiek, create_payment na Twoim własnym podpiętym koncie i book_slot na zasobie rezerwacyjnym. Płacący zostaje Twój; nikt nie staje się naszym klientem.
Przechodź między lejkami
enter_funnel i exit_funnel. Zbuduj jedną sekwencję powitalną i wołaj ją z czterech miejsc, zamiast utrzymywać cztery kopie, które do marca się rozjadą.
Generuj przy wysyłce
ai_generate wypełnia zmienne personalizacji per kontakt, rozliczany z limitu i buforowany po kreacji i skrócie atrybutów kontaktu — inaczej płaciłbyś za generowanie dla każdego odbiorcy przy każdej wysyłce.
Czekaj, rozgałęziaj, dziel, łącz
wait przyjmuje czas trwania, konkretną datę, dzień tygodnia z godziną albo pole daty z przesunięciem. condition to predykat segmentu z gałęzią tak i nie. split to A/B/n z wagami. join zbiera gałęzie z powrotem.
goal — ten najważniejszy
Cel kończy przebieg każdemu, kto go osiągnie. Zarezerwował, kupił, odpisał: reszta sekwencji jest dla niego anulowana. Nikt nie dostaje „tęsknimy” dzień po tym, jak wrócił — i to ten węzeł temu zapobiega.
throttle i quiet_hours
Dławik rozkłada nagły ruch, żeby skrzynka z niskim limitem nie została zajechana do zawieszenia. Godziny ciszy wstrzymują wiadomość do cywilizowanej pory — na warstwie wysyłki, a nie kopiowane do każdej gałęzi grafu.
Sprawdzane, zanim ruszy
Walidator odmawia tego samego Tobie
i sztucznej inteligencji.
Graf jest sprawdzany, zanim da się go opublikować, a sprawdzenie nie jest poradą. To ta sama ścieżka kodu niezależnie od tego, czy lejek narysował człowiek, czy wygenerował model — i tylko dlatego generowanym lejkom w ogóle można ufać.
Dokładnie jedno wejście
Dwa węzły wejściowe to niejednoznaczność, której nikt nie zauważa, dopóki zła połowa listy nie dostanie złej sekwencji.
Każdy węzeł osiągalny
Osierocona gałąź to albo pomyłka, albo wiadomość, o której myślisz, że wychodzi, a która nie wychodzi. O obu warto wiedzieć.
Cykl musi zawierać oczekiwanie
Pętla bez oczekiwania to nieskończona pętla z wysyłką w środku. Ta reguła jest różnicą między lejkiem a incydentem.
Każda wysyłka ma kreację
Węzeł send_email bez kreacji i tematu nie da się opublikować. Wiadomość z dobrym tematem i pustą treścią to realny tryb awarii; tutaj jest odrzucany.
Każda zmienna znana
Zmienne personalizacji sprawdzamy przy publikacji. {{imei}} zamiast {{imie}} to literówka widoczna w edytorze, a nie „Cześć ,” w czterdziestu tysiącach skrzynek.
Potem symulacja
Przepuść prawdziwy kontakt przez cały graf na sucho i przeczytaj ścieżkę oraz każdą wiadomość, która by poszła, wraz z dniem. Nic nie opuszcza budynku.
Niewygodne przypadki
Siedem rzeczy,
które psują naiwny silnik.
Za każdą stoi test z deterministycznym zegarem, bo każda z nich rozkłada implementację, która wygląda całkiem poprawnie, dopóki nie spotka rzeczywistości.
- 1Lejek zapętlony w siebieZasadny, częsty i w porządku — pod warunkiem, że cykl zawiera oczekiwanie, czego pilnuje walidator.
- 2Ktoś wypisuje się w locieWykluczenia sprawdzamy przy wysyłce, nie przy kolejkowaniu. Sprawdzanie przy kolejkowaniu wysyła do tych, którzy odeszli w trakcie oczekiwania.
- 3Lejek zmieniony, gdy w środku jest dziesięć tysięcy osóbIdą do końca wersją, na którą weszli. Nowi wchodzą na nową.
- 4Ten sam wyzwalacz dwa razy w jednej sekundzieJeden przebieg, bo unikalność jest indeksem, a nie sprawdzeniem i wstawieniem po nim.
- 5Kontakt usunięty w trakcie przebieguPrzebieg się kończy. Usunięcie, po którym zostaje sekwencja wciąż zaadresowana do kogoś, nie jest usunięciem.
- 6Oczekiwanie przez zmianę czasu„Trzy dni o dziewiątej rano” znaczy dziewiąta rano po obu stronach zmiany zegara.
- 7Proces ubity między wysyłką a przesunięciemSkutki i przesunięcie to jedna transakcja. Albo oba się zdarzyły, albo żadne.
Deterministyczny zegarKażdy test łamie prawdopodobną implementację
Kampanie to druga połowa.
Lejek reaguje. Kampania to jednorazowa wysyłka masowa: odbiorcy, harmonogram, dławik i wysyłka. To inny kształt rzeczy i celowo trzymamy go osobno, zamiast udawać, że to lejek z jednym węzłem.
Bezpieczne czynią ją dwie zasady. Grupa odbiorców jest materializowana raz i odmawia ponownego uruchomienia — ponowne wyliczenie po cichu dodałoby wszystkich, którzy zapisali się od startu wysyłki, a indeks deduplikacji ukryłby to, blokując duplikaty, które sam stworzył. I liczniki są przeliczane ze zdarzeń doręczenia, nigdy inkrementowane w miejscu, więc ponowiony webhook nie napompuje raportu.
Czego użyć: jeśli dzieje się to z powodu czegoś, co zrobił człowiek — to lejek. Jeśli z powodu czegoś, co postanowiłeś we wtorek — to kampania. Zaskakująco dużo automatyzacji marketingu psuje się przez wciskanie tego drugiego w kształt pierwszego.
Napisz, co dziś wysyłasz i do ilu osób.
Pokażemy, jak to wygląda tutaj — zwykle z narysowanym lejkiem, bo to szybsze niż akapit o nim.
Otwórz ClickSomo Porozmawiaj z człowiekiem