Funnel a triggery
Funnel je graf. Průběh je řádek. Čekání je čas.
To je celý model a všechny složité vlastnosti tohoto produktu z těchto tří vět vyplývají. Díky nim je bezpečné upravovat běžící funnel. Díky nim nemůže opakovaný pokus odeslat zprávu dvakrát. Díky nim člověk, který se v úterý odhlásí, ve čtvrtek nic neobdrží.
Co se skutečně stane při spuštění
Publikování funnelu zapíše neměnnou verzi. Někdo vstoupí a objeví se řádek: jeden průběh, pro tento kontakt, přiřazený k té verzi, obsahující aktuální uzel, čas probuzení a vlastní kontext.
Worker si pronajme průběhy, jejichž čas probuzení už nastal, a zabere je pomocí SKIP LOCKED, takže dva workeri si nemohou vzít tentýž. Provádí uzly, dokud nedojde k čekání nebo k terminálu, pak zapíše další čas probuzení a pustí se.
Uzel je čistá funkce průběhu, kontaktu a uzlu — a jeho efekty se potvrdí ve stejné transakci jako samotný posun průběhu. Právě tato jediná vlastnost dělá opakovaný pokus bezpečným. Worker zabitý v půlsekundě mezi „odeslat“ a „posunout“ zanechá buď obojí, nebo nic — nikdy jen jedno.
A protože aplikace dodává čas, nikoli databáze, je řádek zapsaný teď splatný teď. Sloupec plánování s výchozí hodnotou podle databázových hodin není v okamžiku zápisu ještě splatný a mine právě ten tik, který ho vytvořil — chyba, která nevypadá jako vůbec nic, dokud zpráva nedorazí o hodinu později.
- 1Pronájem
wake_at <= now(),FOR UPDATE SKIP LOCKED. Fronta bez pronájmů odesílá dvakrát ve výchozím stavu. - 2VykonáníUzly postupně, dokud nenarazí na čekání nebo terminál. Každý zapíše krok: co rozhodl, co vyslal.
- 3PotvrditEfekty a posun v jedné transakci. V tom je celý trik.
- 4SpánekZapíše se další
wake_at. Žádné následné řádky ještě neexistují a žádné nejsou potřeba.
Jeden průběh na kontakt na verzi
Čtrnáct triggerů
Co může spustit průběh
Některé z nich jsou věci, které uděláte vy. Většina jsou věci, které udělá — nebo neudělá — váš zákazník, a nepřítomnost akce je stejně dobrý trigger jako akce sama.
Přijdou
form_submit, list_join, contact_created, tag_added a segment_enter. Segment je živý predikát, takže „vstoupí do segmentu“ pokrývá všechno „se stal“, co umíte vyjádřit — tři objednávky, devadesát dní ticha, útraty nad prahem.
Něco udělají
page_visit ze snippetu webu, message_opened, link_clicked, booking_made a payment_made. Samotné otevření zprávy je událost na kontaktu, takže jeden funnel může čekat na reakci na poslední věc, kterou poslal.
Čas, nebo vy
date_field s posunem — narozeniny, obnova, „rok od“, sedm dní před nebo tři dny po. schedule pro opakovaný. manual pro oznámení, které pošlete, protože jste se tak rozhodli.
Vaše vlastní aplikace
api_event je vlastní událost, kterou pošlete ze svého kódu se svým tokenem. Cokoli váš produkt ví se stane triggerem: aktivace, pozvání kolegy, dosažení limitu, zrušení, export. Právě tohle z nástroje na rozesílání udělá součást vašeho produktu.
Opětovný vstup, rozhodnuto jednou
Funnel buď umožňuje opětovný vstup, nebo ne, a databáze to vynucuje: jeden průběh na kontakt na funnel, pokud jste neurčili jinak. Stejný trigger spuštěný dvakrát ve stejné sekundě nemůže omylem vytvořit dva průběhy.
Vstupní podmínky
Trigger se spustí a vstupní specifikace rozhodne, zda je tento konkrétní kontakt způsobilý — predikát segmentu před dveřmi. Levnější než uzel podmínky na prvním kroku a graf se pak týká toho, co se stane, nikoli toho, kdo smí dovnitř.

Čtrnáct věcí to může spustit. Šestnáct věcí může nastat potom.
Šestnáct akcí a sedm uzlů toku
Co funnel umí a jak se rozhoduje
Poslat něco
send_email, send_sms, send_push, send_letter — čtyři kanály, jeden graf — plus notify_team, když ten, koho je třeba upozornit, pracuje pro vás.
Změnit kontakt
add_tag, remove_tag, add_to_list, remove_from_list, set_field. Označování cestou je to, co dělá segment dalšího funnelu jednoduchým.
Dosáhnout ven
http_request na cokoli chcete, create_payment proti vašemu vlastnímu propojenému účtu a book_slot proti rezervačnímu zdroji. Platící zůstává váš; nikdo se nestává naším zákazníkem.
Přecházení mezi funnely
enter_funnel a exit_funnel. Sestavte jednu uvítací sekvenci a volejte ji ze čtyř míst, místo abyste udržovali čtyři kopie, které se do března rozejdou.
Generování v okamžiku odeslání
ai_generate vyplňuje slučovací proměnné pro každý kontakt, účtuje se proti vaší kvótě a ukládá do mezipaměti podle hashe kreativy a atributů kontaktu — jinak byste platili za každého příjemce při každém jednotlivém odeslání.
Čekání, větvení, rozdělení, spojení
wait přijímá dobu, datum a čas, den v týdnu s časem, nebo pole s datem a posunem. condition je predikát segmentu s větví ano a ne. split je A/B/n s váhami. join opět spojuje větve dohromady.
goal — ten jediný, na kterém záleží
Cíl ukončí běh pro každého, kdo ho dosáhne. Rezervovali si, nakoupili, odpověděli: zbytek sekvence se pro ně konkrétně zruší. Nikdo nedostane „chybí nám vám“ den poté, co se vrátil, a právě tento uzel tomu brání.
throttle a quiet_hours
Throttle zpomalí náraz, aby schránka s nízkým limitem rychlosti nebyla zatížena až do pozastavení. Tiché hodiny zadrží zprávu do slušné doby — aplikuje se na úrovni zprávy, nikoli zkopírováním do každé větve grafu.
Kontrola před spuštěním
Validátor odmítá pro vás i pro AI totéž
Graf se kontroluje před publikováním a kontrola není pouze doporučení. Jde o stejnou cestu kódu, ať funnel nakreslil člověk, nebo ho vygeneroval model — a právě proto lze generovaným funnelům vůbec věřit.
Právě jeden vstup
Dva vstupní uzly jsou nejednoznačnost, které si nikdo nevšimne, dokud špatná polovina seznamu nedostane špatnou sekvenci.
Každý uzel je dosažitelný
Osamocená větev je buď chyba, nebo zpráva, o které si myslíte, že odchází, a neodchází. Obojí stojí za to vědět.
Každý cyklus musí obsahovat wait
Smyčka bez čekání je nekonečná smyčka s odesláním uprostřed. Toto pravidlo je rozdíl mezi funnelem a incidentem.
Každé odeslání má svou kreativu
Uzel send_email bez kreativy a předmětu nelze publikovat. Zpráva se správným předmětem a prázdným tělem je reálný způsob selhání; zde je odmítnuta.
Každá proměnná je známá
Slučovací proměnné se validují při publikování. {{frist_name}} je překlep, který uvidíte při úpravě, nikoli „Dobrý den ,“ dorazivší do čtyřiceti tisíc schránek.
Pak to simulujte
Proveďte testovací běh reálného kontaktem celým grafem a přečtěte si zvolenou cestu a každou zprávu, která by byla odeslána, včetně dne. Nic neopustí budovu.
Nepříjemné případy
Sedm věcí, které rozbijí naivní engine
Každá z nich je test s deterministickými hodinami v pozadí, protože každá rozbije implementaci, která vypadá dokonale správně, dokud se nesetká s realitou.
- 1Funnel, který se smyčkuje sám do sebeLegitimní, běžné a v pořádku — pokud cyklus obsahuje wait, na čemž validátor trvá.
- 2Někdo se odhlásí během běhuPotlačení se kontroluje při odeslání, nikoli při zařazení do fronty. Kontrola při zařazení zašle zprávy lidem, kteří odešli během čekání.
- 3Funnel se upraví, když je uvnitř deset tisíc lidíTi stávající dojdou verzi, kterou nastoupili, až do konce. Noví nastupující jdou tou novou.
- 4Stejný trigger se spustí dvakrát během jedné sekundyJeden běh, protože jedinečnost je index, nikoli kontrola následovaná vložením.
- 5Kontakt se smaže během běhuBěh končí. Vymazání, po kterém zůstává sekvence stále adresovaná někomu, není vymazání.
- 6Čekání zahrnuje změnu času (letní/zimní čas)„Tři dny v devět ráno“ znamená devět ráno na obou stranách změny času.
- 7Pracovník je ukončen mezi odesláním a posunemEfekty a posun jsou jedna transakce. Buď se staly obě věci, nebo žádná.
Deterministické hodinyKaždý test rozbije věrohodnou implementaci
Kampaně jsou tou druhou polovinou
Funnel reaguje. Kampaň je jednorázové vysílání: publikum, plán, omezení rychlosti a odeslání. Je to jiný typ věci a záměrně se drží odděleně, místo aby předstírala, že je funnel s jedním uzlem.
Dvě pravidla to dělají bezpečným. Publikum je materializováno jednou a odmítá běžet dvakrát — opětovné rozřešení by potichu přidalo všechny, kdo se připojili od začátku odesílání, a index deduplikace by to skryl tím, že zabránil duplicitám, které sám vytvořil. A počítadla se přepočítávají z událostí doručení, nikdy se nezvyšují na místě, takže opakovaný webhook nemůže nafouknout report.
Kdy co použít: pokud se to stane kvůli něčemu, co osoba udělala, je to funnel. Pokud se to stane kvůli něčemu, co jste rozhodli v úterý, je to kampaň. Překvapivé množství marketingové automatizace se pokazí tím, že druhou věc nutí do podoby té první.