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 регулює темп сплеску, щоб поштову скриньку з низьким лімітом частоти не завалили до призупинення. Тихі години утримують повідомлення до пристойного часу — це застосовується на рівні повідомлення, а не копіюється в кожну гілку графа.

Перевіряється, перш ніж його можна запустити

Валідатор відмовляє в одних і тих самих речах і вам, і ШІ

Граф перевіряється перед публікацією, і ця перевірка не є лише порадою. Це той самий код, чи намалював воронку людина, чи згенерувала модель — і саме тому згенеровані воронки взагалі можна довіряти.

Рівно один вхід

Два вхідні вузли — це неоднозначність, яку ніхто не помічає, доки неправильній половині списку не дійде неправильна послідовність.

Кожен вузол досяжний

Осиротіла гілка — це або помилка, або повідомлення, яке, як ви гадаєте, надсилається, а насправді ні. Про обидва варто дізнатися.

Цикл має містити очікування

Цикл без очікування — це нескінченний цикл із надсиланням посередині. Саме ця різниця відділяє воронку від інциденту.

У кожного надсилання є креатив

Вузол send_email без креативу й теми не можна опублікувати. Повідомлення з правильною темою й порожнім тілом — реальний режим відмови; тут його відхиляють.

Кожна змінна відома

Змінні злиття перевіряються під час публікації. {{frist_name}} — це одрук, який ви бачите під час редагування, а не «Вітаємо ,» у сорока тисячах поштових скриньок.

Тоді змоделюйте це

Запустіть тестовий прохід реального контакту через увесь граф і прочитайте обраний шлях і кожне повідомлення, яке було б надіслано, з його днем. Нічого не залишає межі системи.

Незручні випадки

Сім речей, які ламають наївний рушій

Кожен із них — це тест із детермінованим годинником, бо кожен ламає реалізацію, яка виглядає абсолютно правильною, доки не зіткнеться з реальністю.

На що тестується рушійФальсифікація
  • 1Воронка, що зациклюється на самій собіЛегітимно, поширено і нормально — за умови, що цикл містить очікування, чого наполягає валідатор.
  • 2Хтось відписується на півдорозіПридушення перевіряється під час надсилання, а не під час постановки в чергу. Перевірка при постановці надішле пошту тим, хто пішов під час очікування.
  • 3Воронку редагують, коли всередині десять тисяч людейВони продовжують проходити версію, на яку увійшли, до кінця. Нові учасники проходять нову.
  • 4Той самий тригер спрацьовує двічі за одну секундуОдин прохід, бо унікальність — це індекс, а не перевірка з наступною вставкою.
  • 5Контакт видаляють посеред проходуПроходження завершується. Видалення, після якого послідовність усе ще адресована комусь, — це не видалення.
  • 6Очікування охоплює перехід на літній час«Три дні о дев'ятій ранку» означає дев'яту ранку з обох боків зміни годинника.
  • 7Робочий процес убито між надсиланням і просуваннямЕфект і аванс — одна транзакція. Або відбулися обидва, або жоден.

Детермінований годинникКожен тест ламає правдоподібну реалізацію

Кампанії — це друга половина

Воронка реагує. Кампанія — це разова розсилка: аудиторія, розклад, обмеження темпу та відправлення. Це річ іншої форми, і її свідомо тримають окремо, а не видають за воронку з одним вузлом.

Два правила роблять це безпечним. Аудиторія матеріалізується один раз і відмовляється запускатися двічі — повторне визначення тихо додало б усіх, хто приєднався з початку розсилки, а індекс дедуплікації приховав би це, блокуючи саме ті дублікати, які сам і створив. І лічильники перераховуються з подій доставки, а не збільшуються на місці, тому повторний вебхук не може роздути звіт.

Що використовувати: якщо це відбувається через дію людини — це воронка. Якщо це відбувається через рішення, яке ви прийняли у вівторок, — це кампанія. Дивно багато маркетингової автоматизації ламається саме тому, що друге насильно втискають у форму першого.