Mga funnel at trigger
Ang funnel ay isang graph. Ang run ay isang row. Ang wait ay isang oras.
Iyon ang buong modelo, at ang bawat mahirap na katangian ng produktong ito ay nagmumula sa tatlong pangungusap na iyon. Ligtas ang pag-edit ng live na funnel dahil sa mga ito. Hindi maaaring magpadala nang dalawang beses ang isang retry dahil sa mga ito. Ang taong nag-unsubscribe noong Martes ay walang marinig noong Huwebes dahil sa mga ito.
Ano talaga ang nangyayari kapag tumatakbo ito
Ang pag-publish ng funnel ay sumusulat ng hindi mababagong bersyon. May pumasok, at lumilitaw ang isang row: isang run, para sa contact na ito, nakakabit sa bersyong iyon, hawak ang kasalukuyang node, isang oras ng paggising, at sarili nitong context.
Nagpa-paupa ang isang worker ng mga run na lumipas na ang oras ng paggising, kinukuha ang mga ito gamit ang SKIP LOCKED para hindi makuha ng dalawang worker ang pareho. Isinasagawa nito ang mga node hanggang umabot sa wait o terminal, pagkatapos ay isusulat ang susunod na oras ng paggising at bibitaw.
Ang node ay purong function ng run, ng contact at ng node — at ang mga epekto nito ay naka-commit sa parehong transaction ng pag-usad ng run. Ang iisang katangiang iyon ang nagpapa ligtas sa retry. Ang worker na pinatay sa kalahating segundo sa pagitan ng "send" at "advance" ay nag-iiwan ng pareho o wala, hindi kailanman isa.
At dahil ang app ang nagbibigay ng oras at hindi ang database, ang row na isinulat ngayon ay due ngayon. Ang scheduling column na default sa orasan ng database ay hindi pa due sa sandaling isinulat ito, at naliligaw sa mismong tick na lumikha dito — isang bug na parang wala lang hanggang ang isang mensahe ay mahuli nang isang oras.
- 1Paupa
wake_at <= now(),FOR UPDATE SKIP LOCKED. Ang queue na walang paupa ay nagpapadala nang dalawang beses bilang default. - 2PagsasagawaMga node sa sunod-sunod hanggang sa isang wait o terminal. Bawat isa ay sumusulat ng isang step: ano ang napagdesisyunan nito, ano ang inilabas nito.
- 3I-commitMga epekto at pag-usad, iisang transaction. Ito ang buong trick.
- 4TulogSusunod na
wake_atay isinulat. Wala pang mga downstream row, at wala namang kailangan.
Isang run kada contact kada bersyon
Labing-apat na trigger
Ano ang maaaring magsimula ng run
Ang ilan sa mga ito ay mga ginagawa mo. Karamihan ay mga ginagawa ng iyong customer, o hindi ginagawa — at ang kawalan ng aksyon ay kasing-ganda ng aksyon mismo bilang trigger.
Dumarating sila
form_submit, list_join, contact_created, tag_added at segment_enter. Ang segment ay isang live na predicate, kaya ang "papasok sa segment" ay sumasaklaw sa bawat "naging" na maipapahayag mo — tatlong order, siyamnaput araw na tahimik, gumagastos lampas sa threshold.
May ginagawa sila
page_visit mula sa site snippet, message_opened, link_clicked, booking_made at payment_made. Ang pagbukas ng mensahe ay mismong event sa contact, kaya ang isang funnel ay maaaring maghintay ng reaksyon sa huling bagay na ipinadala nito.
Oras, o ikaw
date_field na may offset — isang kaarawan, isang renewal, "isang taon mula noon", pitong araw bago o tatlong araw pagkatapos. schedule para sa paulit-ulit. manual para sa anunsyong ipapadala mo dahil nagdesisyon ka.
Ang sarili mong application
Ang api_event ay isang custom event na ipinapadala mo mula sa sarili mong code gamit ang sarili mong token. Anumang alam ng iyong product ay maaaring maging trigger: na-activate, inimbita ang isang kasamahan, naabot ang limitasyon, kinansela, nag-export. Ito ang nagpapagawa sa isang mailing tool na bahagi ng iyong product.
Muling pagpasok, isang beses na pinagpapasyahan
Ang isang funnel ay maaaring muling pasukan o hindi, at ipinapatupad ito ng database: isang run kada contact kada funnel maliban kung sinabi mong iba. Ang parehong trigger na tumuturok nang dalawang beses sa parehong segundo ay hindi maaaring makabuo ng dalawang run nang aksidente.
Mga kundisyon ng pagpasok
Kapag tumuturok ang isang trigger, ang entry spec ang nagpapasya kung kwalipikado ang partikular na contact na ito — isang segment predicate sa harap ng pinto. Mas mura kaysa sa condition node sa unang hakbang, at pinapanatili nitong nakatuon ang graph sa kung ano ang mangyayari, hindi sa kung sino ang pinapayagang pumasok.

Aplabing-apat na bagay ang maaaring magsimula nito. Labing-anim na bagay ang maaaring mangyari pagkatapos.
Labing-anim na action at pitong flow node
Ang kayang gawin ng isang funnel, at kung paano ito nagpapasya
Magpadala ng something
send_email, send_sms, send_push, send_letter — apat na channel, isang graph — pati na ang notify_team kapag ang taong kailangang malaman ay nagtatrabaho para sa iyo.
Baguhin ang contact
add_tag, remove_tag, add_to_list, remove_from_list, set_field. Ang pagmamarka sa isang tao habang nagpapatuloy ka ang nagpapaging simple ng segment ng susunod na funnel.
Lumabas sa labas
http_request sa anumang nais mo, create_payment laban sa sarili mong nakakonektang account, at book_slot laban sa isang booking resource. Ang nagbabayad ay nananatiling sa iyo; walang nagiging customer namin.
Paglipat sa pagitan ng mga funnel
enter_funnel at exit_funnel. Gumawa ng isang welcome sequence at tawagin ito mula sa apat na lugar, sa halip na panatilihin ang apat na kopya na magkakalayo pagsapit ng Marso.
Gumawa sa oras ng pagpapadala
Ang ai_generate ay nagpupuno ng merge variables kada contact, sinusukat laban sa iyong quota at naka-cache ayon sa creative at contact-attribute hash — kung hindi, magbabayad ka kada recipient sa bawat isang pagpapadala.
Maghintay, mag-branch, mag-split, mag-join
Ang wait ay tumatanggap ng tagal, datetime, araw ng linggo at oras, o date field na may offset. Ang condition ay isang segment predicate na may oo at hindi. Ang split ay A/B/n na may mga timbang. Ang join ay nagpapabalik ng mga branch nang magkakasama.
goal — ang pinakamahalaga
Ang isang goal ay nagtatapos ng run para sa sinumang nakakamtan nito. Nag-book sila, bumili sila, sumagot sila: ang natitirang bahagi ng sequence ay kinakansela para sa kanila. Walang makakatanggap ng "namimiss ka namin" kinabukasan pagkatapos nilang bumalik, at ito ang node na pumipigil dito.
throttle at quiet_hours
Ang throttle ay nagtatakda ng bilis ng isang burst para hindi masira ang isang mailbox na may mababang rate cap. Ang quiet hours ay nagpapatigil ng mensahe hanggang sa sibilisadong oras — inilalapat sa layer ng mensahe, hindi kinokopya sa bawat branch ng graph.
Tinitingnan bago maaaring tumakbo
Tinatanggihan ng validator ang parehong mga bagay para sa iyo at para sa AI
Tinitingnan ang isang graph bago ito ma-publish, at ang pagsusuri ay hindi payo lamang. Iisa ang code path kahit ang isang tao ang gumuhit ng funnel o isang model ang gumawa nito, at ito lamang ang dahilan kung bakit mapagkakatiwalaan ang mga ginawang funnel.
Tumpak na isang entry
Ang dalawang entry node ay isang kalabuan na walang napapansin hanggang sa makuha ng maling kalahati ng listahan ang maling sequence.
Lahat ng node ay naaabot
Ang isang naiwang branch ay isang pagkakamali o isang mensahe na inaakala mong ipapadala ngunit hindi. Parehong sulit na malaman.
Ang bawat cycle ay dapat may wait
Ang isang loop na walang wait ay isang walang-hanggang loop na may pagpapadala sa gitna. Ang panuntunang ito ang pagitan ng isang funnel at ng isang insidente.
Ang bawat pagpapadala ay may creative
Ang isang send_email node na walang creative at subject ay hindi maaaring i-publish. Ang mensahe na may tamang subject at walang laman ang katawan ay isang tunay na mode ng pagkabigo; tinatanggihan ito dito.
Lahat ng variable ay kilala
Bini-validate ang mga merge variable sa pag-publish. Ang {{frist_name}} ay isang typo na nakikita mo habang nag-e-edit, hindi isang "Hi ," na dumarating sa apatnapung libong inbox.
Pagkatapos, i-simulate ito
Gumawa ng dry-run ng isang tunay na contact sa buong graph at basahin ang path na tinakbo at bawat mensaheng ipapadala, kasama ang araw nito. Walang lumalabas sa gusali.
Ang mga mahihirap na kaso
Pitong bagay na sumisira sa isang napakadaling engine
Bawat isa sa mga ito ay isang test na may deterministikong orasan sa likod nito, dahil bawat isa ay sumisira sa isang implementasyon na tila perpektong tama hanggang sa makaharap nito ang totoong buhay.
- 1Isang funnel na umiikot sa sarili nitoLehitimo, karaniwan, at okay — basta't may paghihintay sa loob ng cycle, na ipinipilit ng validator.
- 2May nag-unsubscribe habang tumatakboAng suppression ay sinusuri sa pagpapadala, hindi sa pag-enqueue. Ang pagsusuri sa enqueue ay nagpapadala pa rin sa mga taong umalis habang naghihintay.
- 3Binago ang funnel habang sampung libong tao ang nasa loobPatuloy silang dadaan sa bersiyon na pinasok nila, hanggang dulo. Ang mga bagong papasok ay dadaan sa bago.
- 4Ang parehong trigger ay pumindot nang dalawang beses sa loob ng isang segundoIsang run lamang, dahil ang uniqueness ay isang index at hindi isang pagsusuri na sinusundan ng insert.
- 5Binura ang isang contact habang tumatakboMatatapos ang run. Ang pagbura na nag-iiwan ng sequence na nakalaan pa rin sa isang tao ay hindi pagbura.
- 6Ang isang paghihintay ay tumatagos sa pagbabago ng daylight savingAng "tatlong araw alas-nuwebe ng umaga" ay nangangahulugang alas-nuwebe ng umaga sa magkabilang panig ng pagbabago ng orasan.
- 7Pinatay ang isang worker sa pagitan ng pagpapadala at pag-usadAng mga epekto at pag-usad ay iisang transaksyon. Alinman sa pareho nangyari o wala.
Deterministikong orasanBawat test ay sumisira sa isang maaaring totoong implementasyon
Ang mga campaign ang kabilang kalahati
Ang funnel ay tumutugon. Ang campaign ay ang isang-beses na broadcast: isang audience, isang iskedyul, isang throttle, at isang pagpapadala. Iba ang hugis nito at sadyang pinaghihiwalay ito sa halip na ituring na parang funnel na may iisang node.
Dalawang tuntunin ang nagpapa-safe dito. Ang audience ay ginagawang materyal nang isang beses at tumatangging tumakbo nang dalawang beses — ang muling pag-resolve ay tahimik na magdaragdag ng lahat ng sumali mula nang magsimula ang pagpapadala, at itatago ito ng deduplication index sa pamamagitan ng pagpigil sa mga duplicate na ginawa nito. At ang mga counter ay muling kinukwenta mula sa mga delivery event, hindi dinadagdagan nang direkta, kaya hindi kayang palakihin ng isang muling webhook ang isang report.
Alin ang gagamitin: kung nangyayari ito dahil sa ginawa ng tao, ito ay funnel. Kung nangyayari ito dahil sa desisyon mo noong Martes, ito ay campaign. Napakaraming marketing automation ang nagkakamali sa sapilitang pagpapasya ng pangalawa sa hugis ng una.