clickSomo

Funkle i triggery

Funkel to graf. Przebieg to wiersz. Czekanie to czas.

To je cołki model, i kożdŏ trudnŏ własność tego produktu wychodzi z tyj trzech zdań. Edytowaniye żywego funkla je bezpieczne dziynki nim. Retry niy może posłać podwōjnie dziynki nim. Ôsoba, kera sie wypisŏ we wtorek, we czwartek niy usłyszy nic dziynki nim.

Co naprawdã sie robi, jak to leci

Publikowaniye funkla pisze niyzmiennōm wersyjõ. Ktoś wchodzi, i pojawio sie wiersz: jedyn przebieg, dlŏ tyj kontakty, przypniōny do tyj wersyje, trzymajōncy aktualny node, czas pobudki i wŏsny kōntekst.

Worker wynajmuje przebiegi, kerych czas pobudki minōł, przejmujōnc je z SKIP LOCKED, coby dwa workery niy mogły wziōńć tego samego. Wykōnuje nodes, ażeby dôjść do czekaniŏ abo terminala, potym pisze nastympny czas pobudki i puszczŏ.

Nod je czysto funkcyjům przebiegu, kontakta i noda — a jego efekty zapisujům sie we tyj samyj transakcyji co posunyńće przebiegu. Właśnie to jedno czyni powtōrka bezpiecznōm. Robotnik zabiōy we pōł sekundy miyndzy „wyślij” a „posuń” zostawio albo oba, albo żodny, nigdy ino jedyn.

A bo aplikacyjo podowo czas, a ni database, wiersz zapisany teroz je due teroz. Kolonna planowania z defaultym na zegar database niy je jeszcze due we chwili zapisu i gubi tyk, co go stworził — bug, co wyglōndo na nic, ażeby wiadomość niy przilazła godzina po czasie.

Jedyn tyk robotnikaWykōnanie
  • 1Leasawake_at <= now(), FOR UPDATE SKIP LOCKED. Kolejka bez leas podwōjnie wysyło po defaultzie.
  • 2WykōnejNody po koleji, ażeby czekanie abo kōniec. Kożdy zapisuje krok: co postanowił, co wyemitowoł.
  • 3PotwjierdzićEfekty i posunyńće, jedno transakcyjŏ. To je cały tryk.
  • 4ŚpiyńeZapisany nastympny wake_at. Rzodowych wierszōw jeszcze niy ma, a żodne niy sōm potrzebne.

Jedyn przebieg na kontakta na wersyjŏ

Cztorzy nastołce

Co może zaczynć przebieg

Niektōre z tych sōm rzeczy, co je robisz ty. Wiynkszość to rzeczy, co robi — abo niy robi — twōj klient, a brak akcyje je tak dobrym triggerym jak akcyjŏ sama.

Przilazōm

form_submit, list_join, contact_created, tag_added i segment_enter. Segment je żywym predykatym, wiync „wstōmpuje do segmentu” pokrywo kożde „stoł sie”, co umiesz wyrazić — trzi zamōwienia, dziewyndzyset dni ciszy, wydŏwki nad progiem.

Coś zrobōm

page_visit ze snipeta strōny, message_opened, link_clicked, booking_made i payment_made. Ôtwarcie wiadomości samo je eventym na kontakcie, wiync jedyn lejek może czekać na reakcyjŏ na ôstatniō rzecz, co posłoł.

Czas, abo ty

date_field z ôfsetym — urodziny, odnowienie, „rok ôd”, siedym dni przed abo trzi dni po. schedule na te cykliczne. manual na ôgłoszynie, co posyłosz, bo postanowiłes.

Twoja własno aplikacyjo

api_event to własny event, co go postujesz ze swojigo koda ze własnym tokenym. Wszystko, co twōj produkt wie, stŏwŏ sie triggerym: aktywowany, zaprosił kolegō, trzafil we limit, anulowoł, eksportowoł. To je te, co robi z narzyndzio do mailōw tajl twojigo produktu.

Powrōt, rozstrzygniynty jedyn rŏz

Lejek je abo niy je powrōtny, a database tego pilnuje: jedyn przebieg na kontakta na lejek, jeźli niy powiedziołes inakszy. Ten sam trigger, co strzeli dwōm razy we tyj samyj sekundzie, niy zrobi dwōch przebiegōw przypodkowo.

Warunki wejścia

Trigger strzelo, a spec wejścia rozstrzygo, czy ten konkretny kontakt ma prawo — predykat segmentu przed drzwiami. Tańsze niż węzeł warunku na piyrszym kroku, a graf ôstŏwŏ ô tym, co sie stŏwŏ, a niy ô tym, kto może wejść.

Cztorzy nastołce mogą go zaczynć. Szesnŏście rzeczy może sie stŏć potym.

Szesnŏście akcyji i siedym węzłōw przepływu

Co lejek może zrobić i jak rozstrzygo

Coś posyj

send_email, send_sms, send_push, send_letter — sztyry kanały, jedyn graf — a do tego notify_team, jak ta ôsoba, co musisz powiedzieć, robi u ciebie.

Zmiyn kontakt

add_tag, remove_tag, add_to_list, remove_from_list, set_field. Ôznaczanie kogoś po drodze je tym, co robi segment nastynpnego lejka prostym.

Siōngnij na zewniōtrz

http_request do czego chcesz, create_payment na twoje własne podpiōnte konto i book_slot na zasōb rezerwacyji. Płacōncy ôstŏwŏ twōj; nikt niy stŏwŏ sie naszym klientym.

Przejid miyndzy lejkami

enter_funnel i exit_funnel. Zbuduj jedyn sekwyncyjŏ powitalnō i wywołej jōm z sztyrych placōw, a niy utrzymuj sztyry kopie, co sie rozjadōm do marca.

Generuj we chwili wysyłki

ai_generate wypełnio zmiynne merge na kontakta, mierzone na twojim kwocie i cacheowane po hashu kreacyje i atrybutōw kontakta — inakszy płaciłbyś za kożdego ôdbiorcŏ przy kożdyj wysyłce.

Czekaj, rozgaj, potnij, połōncz

wait bierze czas trwaniŏ, datetime, dziyń tygodnia i godzinŏ, abo pole daty z ôfsetym. condition to predykat segmentu z tak i niy. split to A/B/n z wagami. join sprowadzo gale z powrotem do kupy.

goal — ta, co sie liczy

Cyl zokōńczŏ przebieg kożdymu, kery do niego dojdzie. Zarezerwowali, kupili, ôdpisali: reszta sekwyncyje je anulowanŏ ino dlŏ nich. Nikt niy dostŏwŏ „tobŏzie ci” dziyń po tym, jak wrōcił, a to je węzeł, kerymu to zapobiygŏ.

throttle i quiet_hours

Throttle reguluje tempŏ wybuchu, coby skrzynka z niskim limitem niy bōła zasztajfowanŏ ażeby do zawieszyniŏ. Quiet hours trzimajōm wiadomość do cywilizowanego czasu — stosowane na poziomie wiadomości, niy kopiowane do kożdyj gŏrzy grafu.

Sprŏwdzane, zanim może śe zrychtować

Walidator ôdmŏwio to samo tobie i AI

Graf je sprŏwdzany, zanim może być publikowany, a sprŏwdka niy je ino doradzajōncŏ. To ta sama ścieżka kōdu, czy czowiek narychtowoł lejek, czy model go wygenerowoł — i to je jedyny powōd, dlŏczego generowane lejki sōm w ogōle godne zaufaniŏ.

Dokładnie jedyn wchōd

Dwa węzły wejściowe to wieloznaczność, keryj nikt niy zauważŏ, ażeby zŏłŏ połowa listy niy dostŏwŏ zŏłŏ sekwyncyjŏ.

Kożdy węzeł ôsiyngalny

Ôsieroconŏ gŏrzy to abo feler, abo wiadomość, keryj myślisz, iże idzie, a niy idzie. Ôba sōm warte tego, coby śe dowiedzieć.

Kożdy cykl musi zawiyrać czekanie

Pętla bez czekaniŏ to niyskōńczōnŏ pętla z wysyłkym w strzodku. Ta reguła to roznica miyndzy lejkiym a awaryjōm.

Kożdŏ wysyłka mŏ swojŏ kreacyjŏ

Węzeł send_email bez kreacyje i tytułu niy może być publikowany. Wiadomość z dobrym tytułym i pustym ciałym to realny feler; tu je ôdmŏwiany.

Kożdŏ zmiynnŏ je znōmŏ

Zmienne scalaniŏ sōm walidowane przy publikacyje. {{frist_name}} to literōwka, kerŏ widzisz przy edytowaniu, a niy „Cześć ,” przichodzōncŏ do czterdzieści tysięcy skrzynek.

Potym to zasymuluj

Przetestuj realny kōntakt bez całego grafu i przeczytaj zŏzŏ ścieżkã i kożdŏ wiadomość, kerŏ by ôstała wysłanŏ, ze jej dniym. Nic niy wychodzi na zew.

Niewygodne przypadki

Siedym rzeczy, kere łomiotōm naiwny silnik

Kożdŏ z tych rzeczy to test z deterministycznym zegarkiym, bo kożdŏ łamie implementacyję, kera wyglŏdŏ idealnie poprawnie, ażeby niy spotko reality.

Na czym silnik je testowanyFalsyfikacyjo
  • 1Lejek, kery zapetlŏ sie we siebieLegitimny, pospolity i w porzōndku — pod warunkiem, iże cykl zawiyro czekanie, na czym walidator upartŏ sie.
  • 2Nōś kōntakt sie wypisuje w połowie bieguSupresyjo je sprŏwdzanŏ przy wysyłce, niy przy kolejkowaniu. Sprŏwdzanie przy kolejkowaniu wysyło pocztã ludziom, kery ôdeszli podczas czekaniŏ.
  • 3Lejek je edytowany, jak w nim je dziesiync tysiyncy ludziÔni idōm dalij wersyjōm, na kerŏ weszli, do kōńca. Nowi wchodzōncy idōm nowōm.
  • 4Ten sam trigger ôdpŏłŏ dwa razy w jednyj sekundzieJeden przebieg, bo unikalność to indeks, a niy sprŏwdka połōnczōnŏ z wstawianym.
  • 5Kōntakt je usuniynty w połowie bieguPrzebieg sie kōńczy. Wymazanie, kere ôstawiŏ sekwyncyjŏ wciąż adresowanŏ kōmuś, niy je wymazaniym.
  • 6Czekanie przecinŏ zmianã czasu„Trzi dni ô dziewiōntym rano” znaczy dziewiōntŏ rano po ôbōch stronach zmiany zegarka.
  • 7Worker je zabity miyndzy wysyłkym a przesuniyncymEfekty i przesuniyncie to jedna transakcyjo. Albo ôbŏ sie stōy, albo nic.

Deterministyczny zegarekKożdŏ test łamie wiarygodnŏ implementacyjo

Kampanje sōm drugo połowa

Lejek reaguje. Kampanjo to jednorozowe nadanie: publiko, plan, throttle i wysyłka. To inkszo forma rzeczy i je celowo trzimano osobno, zamiast udować, iże to lejek z jednym węzłym.

Dwa regry to robiōm bezpiecznym. Publiko je zmaterializowano jedyn roz i ôdmowo sie drugi roz zrychtować — przeliczynie by cicho dodowo wszyskich, co dolozli ôd poczōntku wysyłki, a indeks deduplikacyje by to skrył, blokujōnc duplikaty, kere sam stworził. A liczniki sōm przeliczane ze zdarzyń doroczyń, nigdy niy inkrementowane na miejscu, coby sprōbowany webhook niy mōgł napompować raportu.

Kedy użyć czego: jak sie stowo, bo człowiek coś zrobił, to lejek. Jak sie stowo, bo ty coś postanowiył we wtorek, to kampanjo. Zaskakujōnco wiela marketingowej automatyzacyje sie psuje, wciskajōnc drugo w kształt piyrszyj.