clickSomo
Otwórz ClickSomo

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.

Jeden cykl procesu roboczegoWykonanie
  • 1Dzierżawawake_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.

Na czym testujemy silnikFalsyfikacja
  • 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

Ilustracje: Pixeltrue (pakiet Minimalistic).