clickSomo
Отворете ClickSomo

Фунии и тригери

Фунията е граф. Изпълнението е ред. Изчакването е време.

Това е целият модел, и всяко трудно свойство на този продукт произтича от тези три изречения. Редактирането на жива фуния е безопасно благодарение на тях. Повторен опит не може да изпрати двойно благодарение на тях. Човек, който се е отписал във вторник, не чува нищо в четвъртък благодарение на тях.

Какво действително се случва при изпълнение

Публикуването на фуннел записва неизменима версия. Някой влиза и се появява ред: едно изпълнение, за този контакт, закачено за тази версия, съдържащо текущия възел, време за събуждане и собствен контекст.

Работник наема изпълненията, чието време за събуждане е изтекло, като ги заявява с 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 разпределя по време един изблик, така че пощенска кутия с нисък лимит да не бъде заляна до спиране. Quiet hours задържат съобщение до приличен час — прилага се на ниво съобщение, а не се копира във всяко разклонение на графа.

Проверено, преди да може да се изпълни

Валидаторът отказва едни и същи неща и за Вас, и за ИИ

Графът се проверява, преди да може да бъде публикуван, и проверката не е съвет. Това е един и същ кодов път независимо дали човек е нарисувал фунията или модел я е генерирал — и само затова генерираните фунии изобщо могат да се доверят.

Точно един вход

Два входни възела са двусмислие, което никой не забелязва, докато грешната половина от списъка не получи грешната последователност.

Всеки възел е достижим

Изоставено разклонение е или грешка, или съобщение, което мислите, че излиза, а не излиза. И в двата случая си струва да Ви уведомят.

Всеки цикъл трябва да съдържа изчакване

Цикъл без изчакване е безкраен цикъл с изпращане в средата. Това правило е разликата между фуния и инцидент.

Всяко изпращане има своето съдържание

Възел send_email без съдържание и тема не може да бъде публикуван. Съобщение с правилната тема и празно тяло е реален сценарий на отказ; той се отхвърля тук.

Всяка променлива е известна

Променливите за сливане се валидират при публикуване. {{frist_name}} е печатна грешка, която Виждате докато редактирате, а не „Здравейте ,“ пристигащо в четиридесет хиляди пощенски кутии.

После го симулирайте

Пуснете пробно реален контакт през целия граф и прочетете изминатия път и всяко съобщение, което би било изпратено, с неговия ден. Нищо не излиза навън.

Неудобните случаи

Седем неща, които чупят наивен двигател

Всяко от тях е тест с детерминиран часовник зад него, защото всяко чупи имплементация, която изглежда съвършено правилна, докато не срещне реалността.

Срещу какво се тества двигателътОпровержение
  • 1Фуния, която се завърта в себе сиЛегитимно, често и напълно наред — стига цикълът да съдържа изчакване, което валидаторът настоява за.
  • 2Някой се отписва по средата на изпълнениетоИзключването се проверява при изпращане, а не при поставяне в опашка. Проверката при поставяне в опашка изпраща писма на хората, които са си отишли по време на изчакването.
  • 3Фунията се редактира, докато в нея има десет хиляди душиТе продължават да минават през версията, в която са влезли, до края. Новите постъпващи минават през новата.
  • 4Същият тригер се задейства два пъти в една секундаЕдно изпълнение, защото уникалността е индекс, а не проверка, последвана от вмъкване.
  • 5Контакт се изтрива по средата на изпълнениетоИзпълнението приключва. Изтриване, което оставя последователност, все още адресирана до някого, не е изтриване.
  • 6Изчакване обхваща смяна на лятното/зимното време„Три дни в девет сутринта“ означава девет сутринта и от двете страни на смяната на часовника.
  • 7Работник е убит между изпращането и напредванетоЕфектът и напредването са една транзакция. Или и двете са се случили, или нито едно.

Детерминиран часовникВсеки тест чупи правдоподобна имплементация

Кампаниите са другата половина

Фунията реагира. Кампанията е еднократното излъчване: аудитория, график, ограничение и изпращане. Тя е нещо с различна форма и е умишлено държана отделно, вместо да се преструва, че е фуния с един възел.

Две правила го правят безопасно. Аудиторията се материализира веднъж и отказва да се изпълни втори път — повторното ѝ изчисляване би добавило тихо всички, които са се присъединили след началото на изпращането, а индексът за дедупликация би скрил това, като попречи на дубликатите, които сам той е създал. И броячите се преизчисляват от събитията за доставка, никога не се увеличават на място, така че повторен уебхук не може да надуе отчет.

Кое да използвате: ако се случва заради нещо, което човекът е направил, това е фуния. Ако се случва заради нещо, което Вие сте решили във вторник, това е кампания. Изненадващо голяма част от маркетинг автоматизацията се проваля, като принуждава второто да приеме формата на първото.