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.
- 1Leasa
wake_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.
- 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.