Funnelek és triggerek
A funnel egy gráf. A futás egy sor. A várakozás egy időpont.
Ez a teljes modell, és ennek a terméknek minden nehéz tulajdonsága ebből a három mondatból ered. Élő funnel szerkesztése miattuk biztonságos. Egy újrapróbálkozás miattuk nem küld duplán. Aki kedden leiratkozik, miattuk csütörtökön semmit sem kap.
Mi történik valójában futáskor
Egy funnel közzététele egy módosíthatatlan verziót ír. Valaki belép, és megjelenik egy sor: egy futás, ehhez a kontakthoz, ahhoz a verzióhoz rögzítve, amely tartalmazza az aktuális csomópontot, az ébresztési időt és a saját kontextusát.
Egy worker kibérli azokat a futásokat, amelyek ébresztési ideje lejárt, és SKIP LOCKED zárolással foglalja le őket, így két worker nem veheti fel ugyanazt. Addig hajtja végre a csomópontokat, amíg várakozáshoz vagy végcsomóponthoz nem ér, majd kiírja a következő ébresztési időt, és elengedi.
Egy csomópont a futás, a kontakt és a csomópont tiszta függvénye — és a hatásai ugyanabban a tranzakcióban kerülnek véglegesítésre, mint magának a futásnak a léptetése. Ez az egyetlen tulajdonság teszi biztonságossá az újrapróbálást. A „küldés” és a „léptetés” közötti fél másodpercben leállított worker vagy mindkettőt, vagy egyiket sem hagyja hátra, soha nem csak az egyiket.
És mivel az időt az alkalmazás szolgáltatja, nem az adatbázis, az most írt sor most esedékes. Az adatbázis órájára alapértelmezett ütemezési oszlop abban a pillanatban, amikor kiírják, még nem esedékes, és épp azt a ketyegést hagyja ki, amely létrehozta — ez a hiba semminek tűnik, amíg egy üzenet egy órával később nem érkezik meg.
- 1Bérlés
wake_at <= now(),FOR UPDATE SKIP LOCKED. A bérlés nélküli sor alapértelmezés szerint duplán küld. - 2VégrehajtásCsomópontok sorban, várakozásig vagy végcsomópontig. Mindegyik lépést ír: mit döntött, mit bocsátott ki.
- 3VéglegesítésHatások és léptetés, egyetlen tranzakcióban. Ez az egész trükk.
- 4AlvásA következő
wake_atkiírva. Még nincsenek lefelé irányuló sorok, és nem is kellenek.
Egy futás kontaktonként, verziónként
Tizennégy trigger
Mi indíthat futást
Néhány ezek közül az, amit Ön tesz. A legtöbb az, amit az Ön ügyfele tesz, vagy nem tesz — és egy cselekvés elmarása ugyanolyan jó trigger, mint maga a cselekvés.
Megérkeznek
form_submit, list_join, contact_created, tag_added és segment_enter. A szegmens élő predikátum, így az „belép a szegmensbe” minden kifejezhető „lett valamivé”-t lefed — három rendelés, kilencven nap csend, küszöb feletti költés.
Cselekszenek
page_visit a weboldali kódrészletből, message_opened, link_clicked, booking_made és payment_made. Az üzenet megnyitása önmagában is esemény a kontakton, így egy funnel várhatja a legutóbb elküldött dologra adott reakciót.
Idő, vagy Ön
date_field eltolással — születésnap, megújítás, „egy éve”, hét nappal előtte vagy három nappal utána. schedule az ismétlődőhöz. manual ahhoz a bejelentéshez, amelyet azért küld el, mert úgy döntött.
Az Ön saját alkalmazása
Az api_event egy egyéni esemény, amelyet a saját kódjából, a saját tokenjével küld. Bármi, amit az Ön terméke tud, triggerré válik: aktiválás, kolléga meghívása, a limit elérése, lemondás, exportálás. Ez az, amely egy levelezőeszközből az Ön termékének részét teszi.
Újbóli belépés, egyszer eldöntve
Egy funnel vagy újra beléphető, vagy nem, és ezt az adatbázis kikényszeríti: egy futás kontaktonként, funnel-enként, hacsak Ön másképp nem rendelkezik. Ugyanaz a trigger, amely ugyanabban a másodpercben kétszer aktiválódik, nem okozhat véletlenül két futást.
Belépési feltételek
Egy trigger aktiválódik, és a belépési specifikáció dönti el, hogy ez az adott kontakt jogosult-e — egy szegmenspredikátum az ajtó előtt. Olcsóbb, mint egy feltételcsomópont az első lépésben, és a gráfot arról szólva tartja, hogy mi történik, nem arról, hogy ki léphet be.

Tizennégy dolog indíthatja el. Tizenhat dolog történhet ezután.
Tizenhat művelet és hét folyamatábra-csomópont
Mit tehet egy funnel, és hogyan dönt
Küldjön valamit
send_email, send_sms, send_push, send_letter — négy csatorna, egy gráf —, plusz notify_team, ha az értesítendő személy az Ön alkalmazottja.
Módosítsa a kontaktot
add_tag, remove_tag, add_to_list, remove_from_list, set_field. Az útközbeni megjelölés az, ami a következő funnel szegmensét egyszerűvé teszi.
Nyúljon kifelé
http_request bármilyen célra, create_payment a saját összekapcsolt fiókjára, és book_slot egy foglalási erőforrásra. A fizető az Öné marad; senki nem válik a mi ügyfelünkké.
Váltás funnel-ek között
enter_funnel és exit_funnel. Építsen egy üdvözlő sorozatot, és hívja négy helyről, ahelyett hogy négy, márciusra szétcsúszó másolatot tartana karban.
Generálás a küldés időpontjában
A ai_generate a merge-változókat kontaktonként tölti ki, a kvótájába számolódik, és a kreatív és a kontaktattribútum-hash alapján gyorsítótárazódik – különben minden egyes küldésnél címzettenként fizetne.
Várakozás, elágazás, szétosztás, összefuttatás
A wait időtartamot, dátum-időt pontot, hét napját és időpontját, vagy dátummezőt eltéréssel fogad el. A condition egy szegmenspredikátum igen és nem ággal. A split A/B/n súlyozással. A join visszafuttja az ágakat egybe.
goal – a fontos
A cél befejezi a futást mindenkinek, aki eléri. Lefoglalta, megvásárolta, válaszolt: a sorozat többi része kifejezetten neki törlődik. Senki nem kap „hiányzol” üzenetet a visszatérése után egy nappal, és pontosan ez a csomópont akadályozza meg.
throttle és quiet_hours
A throttle ütemezi a csomagot, hogy egy alacsony küldési limitű postafiók ne fulladjon felfüggesztésbe. A quiet hours addig visszatart egy üzenetet, amíg civilizált időpont nem lesz – üzenetszinten alkalmazva, nem minden ágba bemásolva.
Ellenőrizve, mielőtt futni kezdhet
A validátor ugyanazokat a dolgokat utasítja el Öntől és az AI-tól is
A gráf ellenőrzésen megy keresztül, mielőtt közzétehető lenne, és az ellenőrzés nem tanácsadás. Ugyanaz a kódút fut, akár egy ember rajzolta a tölcsért, akár egy modell generálta – ez az egyetlen ok, amiért a generált tölcsérek egyáltalán megbízhatók.
Pontosan egy belépési pont
Két belépési csomópont olyan kétértelműség, amelyet senki nem vesz észre, amíg a lista rossz fele a rossz sorozatot nem kapja meg.
Minden csomópont elérhető
Egy árva ág vagy hiba, vagy egy üzenet, amelyről azt hiszi, kimegy, de nem megy ki. Mindkettőről érdemes tudomást szerezni.
Minden ciklusnak tartalmaznia kell várakozást
Egy várakozás nélküli hurok végtelen ciklus, közepén egy küldéssel. Ez a szabály a különbség egy tölcsér és egy incidens között.
Minden küldéshez tartozik kreatív
Egy send_email csomópont kreatív és tárgy nélkül nem tehető közzé. A helyes tárgyú, de üres törzsű üzenet valós hibamód; itt utasítjuk el.
Minden változó ismert
A merge-változókat közzétételkor validáljuk. A {{frist_name}} elírás, amelyet szerkesztés közben lát, nem pedig egy „Kedves ,” negyvenezer postaládában.
Aztán szimulálja
Futtasson le egy valós kontaktot a teljes gráfon, és olvassa vissza a bejárt útvonalat és minden elküldendő üzenetet a napjával együtt. Semmi nem hagyja el a rendszert.
A kellemetlen esetek
Hét dolog, ami megtöri egy naiv motort
Mindegyik mögött determinisztikus órájú teszt áll, mert mindegyik megtör egy implementációt, amely tökéletesen helyesnek tűnik, amíg találkozik a valósággal.
- 1Egy önmagába hurkolódó tölcsérLegitim, gyakori és rendben van – feltéve, hogy a ciklus tartalmaz várakozást, amit a validátor megkövetel.
- 2Valaki leiratkozik menet közbenA tiltás ellenőrzése küldéskor történik, nem sorba állításkor. A sorba állításkori ellenőrzés levelet küld azoknak, akik a várakozás alatt távoztak.
- 3A tölcsért szerkesztik, miközben tízezer ember van benneŐk tovább haladnak azon a verzión, amelyre beléptek, a végéig. Az újak az újat járják.
- 4Ugyanaz a trigger másodpercen belül kétszer indulEgy futás, mert az egyediség index, nem pedig ellenőrzés utána beszúrás.
- 5Egy kontakt törlődik a futás közbenA futás befejeződik. Egy törlés, amely után a sorozat még mindig valakinek címzett, nem törlés.
- 6Egy várakozás átnyúlik a nyári időszámítás váltásánA „három nap reggel kilenckor” azt jelenti, hogy reggel kilenc az óraátállás mindkét oldalán.
- 7Egy worker megszakad a küldés és a léptetés közöttA hatás és az előleg egyetlen tranzakció. Vagy mindkettő megtörtént, vagy egyik sem.
Determinisztikus óraMinden teszt megtör egy hihető megvalósítást
A kampányok a másik fele
A tölcsér reagál. A kampány az egyszeri sugárzás: egy célközönség, egy ütemterv, egy átvitelkorlát és egy küldés. Ez más alakú dolog, és szándékosan külön tartjuk, ahelyett hogy egyetlen csomópontú tölcsérnek adnánk ki.
Két szabály teszi biztonságossá. A célközönség egyszer materializálódik, és megtagadja a kétszeri futást — az újra feloldás csendben hozzáadná mindazokat, akik a küldés kezdete óta csatlakoztak, és a deduplikációs index elrejtené ezt azáltal, hogy megakadályozza a saját maga által létrehozott duplikátumokat. A számlálók pedig a kézbesítési eseményekből számítódnak újra, soha nem növekednek helyben, így egy újrapróbált webhook nem tud felfújni egy jelentést.
Melyiket használja: ha azért történik, mert a személy valamit tett, az tölcsér. Ha azért történik, mert Ön egy kedden eldöntötte, az kampány. Meglepően sok marketingautomatizálás megy tönkre azzal, hogy a másodikat az első alakjába kényszerítik.