Воронкі і трыгеры
Воронка — гэта граф. Запуск — гэта радок. Чаканне — гэта час.
Гэта ўся мадэль, і ўсе складаныя ўласцівасці гэтага прадукту выцякаюць з гэтых трох сказаў. Дзякуючы ім бяспечна рэдагаваць дзеючую воронку. Дзякуючы ім паўторная адпраўка не можа адправіць двойчы. Дзякуючы ім чалавек, які адмовіўся ад падпіскі ў аўторак, не пачуе нічога ў чацвер.
Што сапраўды адбываецца пры запуску
Публікацыя варшлюта запісвае нязменную версію. Хтосьці ўваходзіць — і з'яўляецца радок: адзін запуск, для гэтага кантакту, прывязаны да той версіі, з бягучым вузлом, часам абуджэння і ўласным кантэкстам.
Воркер бярэ ў арэнду запускі, у якіх час абуджэння ўжо настаў, пазначаючы іх праз SKIP LOCKED, каб два воркеры не маглі ўзяць той самы. Ён выконвае вузлы да чакання ці тэрмінальнага вузла, затым запісвае наступны час абуджэння і вызваляе арэнду.
Вузел — гэта чыстая функцыя ад запуску, кантакту і вузла — і яго эфекты фіксуюцца ў той самай транзакцыі, што і прасоўванне запуску. Менавіта гэтая ўласцівасць робіць паўтор бяспечным. Воркер, забіты ў паўсекунды паміж «адправіць» і «прасунуць», пакідае альбо абодва эфекты, альбо ніводнага — ніколі адзін.
І паколькі час падае праграма, а не база даных, радок, запісаны зараз, тэрмінова зараз. Слупок планавання з прадвызначэннем на гадзіннік базы даных у момант запісу яшчэ не тэрміновы і прапускае самі тое тыка, што яго стварыў, — памылка, якія выглядае нічым, пакуль паведамленне не спазніцца на гадзіну.
- 1Арэнда
wake_at <= now(),FOR UPDATE SKIP LOCKED. Чарга без арэнды па змаўчанні адпраўляе ўсё двойчы. - 2ВыкананнеВузлы па парадку, пакуль не чаканне ці тэрмінальны вузел. Кожны запісвае крок: што вырашыў, што выклікаў.
- 3КамітЭфекты і прасоўванне — адна транзакцыя. У гэтым увесь трук.
- 4СпіцьНаступны
wake_atзапісаны. Даччыных радкоў яшчэ няма — і ніводны і не патрэбны.
Адзін запуск на кантакт на версію
Чатырнаццаць трыгераў
Што можа запусціць запуск
Некаторыя з іх — гэта тое, што робіце вы. Большасць — тое, што робіць ці не робіць ваш кліент, — і адсутнасць дзеяння такі ж добры трыгер, як і само дзеянне.
Яны прыходзяць
form_submit, list_join, contact_created, tag_added і segment_enter. Сегмент — гэта жывы прэдыкат, таму «уваходзіць у сегмент» пакрывае ўсё «стаў», што можна выказаць: тры заказы, цішыня девяноста дзён, выдаткі вышэй парога.
Яны нешта робяць
page_visit са сніпета сайта, message_opened, link_clicked, booking_made і payment_made. Адкрыццё паведамлення — само па сабе падзея на кантакце, таму адзін варшлут можа чакаць рэакцыі на апошняе дасланае.
Час, ці вы
date_field са зрушэннем — дзень нараджэння, падоўжанне, «год з таго часу», за сем дзён да ці праз тры дні пасля. schedule — для перыядычнага. manual — для аб'явы, якую дасылаеце, бо вы так вырашылі.
Ваша ўласная праграма
api_event — гэта ўласная падзея, якую вы дасылаеце са свайго кода са сваім токенам. Усё, што ведае ваш прадукт, становіцца трыгерам: актываваўся, запрасіў калегу, дасягнуў ліміту, адмяніў, экспартаваў. Менавіта гэта ператварае інструмент рассылак у частку вашага прадукту.
Паўторны ўваход, вырашаны аднойчы
Варшлут альбо дапускае паўторны ўваход, альбо не, і база даных гэта забяспечвае: адзін запуск на кантакт на варшлут, калі вы не сказалі іншае. Адзін і той жа трыгер, спрацаваны двойчы ў адну секунду, не можа выпадкова стварыць два запуску.
Умовы ўваходу
Трыгер спрацоўвае, і спецыфікацыя ўваходу вырашае, ці мае права гэты канкрэтны кантакт увайсці — прэдыкат сегмента перад дзвярыма. Танней, чым вузел умовы на першым кроку, і граф застаецца пра тое, што адбываецца, а не пра тое, каму дазволена ўвайсці.

Чатырнаццаць рэчаў могуць яго запусціць. Шаснаццаць рэчаў могуць адбыцца далей.
Шаснаццаць дзеянняў і сем вузлоў плыні
Што ўмее варшлут і як ён вырашае
Даслаць нешта
send_email, send_sms, send_push, send_letter — чатыры каналы, адзін граф — плюс notify_team, калі той, каго трэба паведаміць, працуе на вас.
Змяніць кантакт
add_tag, remove_tag, add_to_list, remove_from_list, set_field. Пазначэнне кантакту на хадзе — тое, што робіць сегмент наступнага варшлута простым.
Выйсці вонкі
http_request да чаго заўгодна, create_payment на ваш уласны падключаны рахунак і book_slot на рэсурс броніравання. Плацельшчык застаецца вашым; ніхто не становіцца нашым кліентам.
Перасоўванне паміж варшлутамі
enter_funnel і exit_funnel. Пабудаваць адну прывітальную серыю і выклікаць яе з чатырох месцаў, а не трымаць чаты копіі, якія да сакавіка разыдуцца.
Генерацыя ў момант дасылання
ai_generate запаўняе переменныя злічэння для кожнага кантакту, улічваецца ў вашай квоте і кэшуецца па хэшу твору і атрыбутаў кантакту — інакш вы плацілі б за кожнага атрымальніка пры кожным дасыланні.
Чаканне, галінаванне, раздзяленне, злучэнне
wait прымае працягласць, дату-час, дзень тыдня з часам або поле даты з зрушэннем. condition — гэта предыкат сегмента з адказам «так» і «не». split — гэта A/B/n з вагамі. join зноў злучае галіны разам.
goal — той, што мае значэнне
Мэта завяршае выкананне для ўсіх, хто яе дасягае. Яны забраніравалі, купілі, адказалі: астатняя частка паслядоўнасці для іх канкрэтна адмяняецца. Ніхто не атрымае «мы па вам скучылі» на наступны дзень пасля вяртання, і менавіта гэты вузел гэта прадухіляе.
throttle і quiet_hours
Throttle рэгулюе тэмп выбросу, каб паштовая скрыня з нізкай лімітам хуткасці не была забіта да прыпынку. Ціхія гадзіны ўтрымліваюць паведамленне да прыстойнага часу — гэта ўжываецца на ўзроўні паведамлення, а не капіруецца ў кожную галіну графа.
Праверка перад запускам
Валідатар адмаўляе адны і тыя ж рэчы і вам, і ІІ
Граф правяраецца перад публікацыяй, і праверка не з'яўляецца рэкамендацыяй. Гэта адзін і той жа код незалежна ад таго, ці намаляваў варонку чалавек, ці згенеравала мадэль, — і гэта адзіная прычына, чаму згенераваныя варонкі ўвогуле можно давяраць.
Раўна адзін уваход
Два ўваходныя вузлы — гэта неадназначнасць, якую ніхто не заўважае, пакул няправільная палова спісу не атрымае няправільную паслядоўнасць.
Кожны вузел даступны
Ізаляваная галіна — гэта або памылка, або паведамленне, якое вы лічыце адпраўленым, а яно не адпраўлена. Пра абодва выпадкі варта даведацца.
Цыкл павінен утрымліваць wait
Цыкл без wait — гэта бясконцая пятля з адпраўкай пасярэдзіне. Гэта правіла — розніца паміж варонкай і інцыдэнтам.
Кожная адпраўка мае свой крэатыў
Вузел send_email без крэатыва і тэмы не можа быць апублікаваны. Паведамленне з правільнай темай і пустым целам — рэальны рэжым адмовы; яно адхіляецца тут.
Кожная зменная вядомая
Зменныя для падстановы правяраюцца пры публікацыі. {{frist_name}} — гэта апечатка, якую вы бачыце падчас рэдагавання, а не «Вітаю ,» у сарака тысячах паштовых скрынь.
Тады змадэлюйце гэта
Прагоніце рэальны кантакт праз увесь граф і прачытайце пройдзены шлях і кожнае паведамленне, якое будзе адпраўлена, з яго днём. Нішто не пакідае будынак.
Нязручныя выпадкі
Сем рэчаў, якія ломяць наіўны рухавік
Кожнае з гэтых рэчаў — гэта тэст з дэтэрмініраваным гадзіннікам, бо кожнае з іх ломіць рэалізацыю, якая выглядае цалкам правільнай, пакуль не сутыкнецца з рэальнасцю.
- 1Варонка, якая цыклічна замыкаецца на сябеЛегітымна, распаўсюджана і нармальна — пры ўмове, што цыкл утрымлівае wait, на чым настойвае валідатар.
- 2Нехта адпісваецца на паўдарозеВыключэнне правяраецца пры адпраўцы, а не пры пастаноўцы ў чаргу. Праверка пры пастаноўцы адправіць пошту тым, хто сышоў падчас чакання.
- 3Варонка рэдагуецца, калі ўнутры дзесяць тысяч чалавекЯны працягваюць ісці па версіі, у якую ўвайшлі, да канца. Новыя ўдзельнікі ідуць па новай.
- 4Адзін і той жа трыгер спрацоўвае двойчы за адну секундуАдзін запуск, бо ўнікальнасць — гэта індэкс, а не праверка з наступнай устаўкай.
- 5Кантакт выдаляецца падчас выкананняВыкананне завяршаецца. Сціранне, якое пакідае паслядоўнасць, адрасаваную камусьці, — не сціранне.
- 6Wait ахоплівае пераход на летні час«Тры дні а дзявятай раніцы» азначае дзявятую раніцы па абодва бакі пераходу гадзінніка.
- 7Работнік забіты паміж адпраўкай і прасоўваннемЭфекты і прасоўванне — адна транзакцыя. Або адбылося і тое, і другое, або нічога.
Дэтэрмінаваны гадзіннікКожны тэст руйнуе праўдападобную рэалізацыю
Кампаніі — гэта другая палова
Воронка рэагуе. А кампанія — гэта аднаразовая рассылка: аўдыторыя, расклад, абмежаванне тэмпу і адпраўка. Гэта рэч іншай формы, і яна наўмысна трымаецца асобна, а не прытвараецца, што гэта варонка з адным вузлом.
Два правілы робяць гэта бяспечным. Аўдыторыя матэрыялізуецца адзін раз і адмаўляецца выконвацца двойчы — паўторнае вырашэнне цішкам дадало б усіх, хто далучыўся з пачатку рассылкі, а індэкс дэдублікацыі гэта хаваў бы, прадухіляючы дублікаты, якія сама ж стварыла. І лічильні перлічваюцца з падзей дастаўкі, а ніколі не павялічваюцца на месцы, таму паўтораны вэбхук не можа надзмухаць справаздачу.
Што выкарыстоўваць: калі гэта адбываецца з-за таго, што зрабіў чалавек, — гэта варонка. Калі гэта адбываецца з-за таго, што вы вырашылі ў аўторак, — гэта кампанія. Дзіўна шмат маркетынгавай аўтаматызацыі ідзе крывым шляхам, запіхваючы другое ў форму першага.