← усі кейси
E-commerce, продукти харчування E-commerce / Утримання клієнтів ·

Система рахує, коли в клієнта закінчиться товар, і нагадує сама

Замість розсилки «всім і про все» - розрахунок циклу споживання кожної купленої позиції. Повідомлення приходить тоді, коли товар справді закінчується, а ефект міряється проти контрольної групи.

  • Підняття конверсії у 2,2-2,9 раза проти контрольної групи на основному сценарії
  • Повернення близько 9 разів на вкладене в канал, підтверджене двома незалежними способами підрахунку
  • Контрольна група 10% з першого дня: без неї цифри розсилки нічого не означають
  • Один із трьох двигунів вимкнено за результатами вимірювання - він не окупався
Python 3.12FastAPIAPSchedulerSQLiteDocker Compose

Масова розсилка по базі має коротке життя. Перші рази вона працює, далі люди відписуються, а канал вигорає. Причина проста: повідомлення приходить тоді, коли зручно магазину, а не тоді, коли воно потрібне людині.

Тому ця система не робить розсилок «усім». Вона знає, що саме клієнт купив, і рахує, коли ця конкретна позиція в нього закінчиться. За кілька днів до цього моменту приходить коротке нагадування з картками того самого товару.

У сусідньому кейсі реактивації канал - пошта, тригер - «клієнт заснув», а лист пише LLM; тут канал - месенджер, тригер - розрахунок циклу споживання конкретної позиції, а тексти детерміновані.

2,2-2,9×
підняття конверсії проти контрольної групи
10%
бази постійно в контролі, щоб міряти чесно
~9×
повернення на вкладене в канал

Проблема: розсилка по базі майже завжди робиться навпаки

Власник дивиться на базу клієнтів і бачить актив. Маркетолог бачить список адрес. Між цими двома поглядами і губиться результат: замість роботи з конкретною людиною виходить залп по списку.

Провалюється це не через тексти. Провалюється через три речі, які видно тільки на цифрах.

Три причини, чому «розсилка по базі» не працює

⏰ Не той момент

  • Дата розсилки обирається за календарем магазину
  • У клієнта товар або ще не закінчився, або закінчився два тижні тому
  • В обох випадках повідомлення сприймається як спам

🎯 Не той товар

  • Пропозиція однакова для всієї бази
  • Людина отримує те, чого ніколи не купувала й не купить
  • Кожен такий дотик знижує довіру до наступного

📊 Немає з чим порівняти

  • Після кампанії рахують продажі тих, кому написали
  • Але частина з них купила б і без повідомлення
  • Без контрольної групи будь-яка цифра нічого не доводить

Третій пункт найнеприємніший. Без нього можна роками платити за канал, який нічого не додає, і бути впевненим у зворотному.

Як автоматизація це вирішує

Система щодня перебирає пари «клієнт - товар», рахує для кожної момент, коли позиція має закінчитись, і формує чергу на день. Далі черга проходить фільтри, з неї відрізається контрольна група, і решта йде картками в месенджер.

Через кілька днів той самий сервіс порівнює покупки тих, кому написали, з покупками контролю. Тільки ця різниця вважається результатом.

Від історії покупок до повідомлення
Історія замовлень цикл споживання позиції момент нагадування фільтри й контрольна група
черга на день модерація картки в месенджер замір проти контролю

Як рахується момент

Для кожної пари «клієнт - товар» система знає історію покупок і виводить з неї цикл споживання. Повідомлення йде у вікні від 0,7 до 1,2 цього циклу: раніше - клієнт ще не витратив куплене, пізніше - він уже дозамовив деінде.

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

Разові кампанії: аудиторія рахується, а не вигадується

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

Гіпотеза «покупці товарів без цукру зацікавляться цією акцією» виглядала очевидною. Вимір дав підняття 0,98 - тобто рівно нуль, і сегмент не використали. Інша гіпотеза на тому самому товарі дала 2,2, і саме її взяли в роботу.

Що це дало бізнесу

На основному сценарії підняття конверсії склало від 2,2 до 2,9 раза проти контрольної групи. Повернення на вкладене в канал - близько девʼяти разів, і воно порахувалось двома незалежними способами, які зійшлись.

Але найдорожче тут інше: система дозволяє вимкнути те, що не працює. З трьох запущених двигунів у проді лишилось два.

Три двигуни, з яких вижили два
ПрацюєПоповнення запасу - основний сценарій. Нагадування про конкретну куплену позицію в момент, коли вона має закінчитись. Підняття 2,2-2,9 раза
ПрацюєДруга покупка - окрема невелика квота на тих, хто купував лише один раз. Мета не в обсязі, а в тому, щоб перевести людину з разової в постійні
ВимкненоПовернення тих, хто зник: виміряне підняття 1,24 раза не окуповувало сам канал. Двигун вимкнено, а не залишено «нехай працює». Повернемось, коли зʼявиться промокод, який дасть сенс окремій пропозиції

Чесно про межі. Механіка працює лише для витратних позицій з історією повторних покупок - для разових товарів вона не вмикається взагалі. І кожен новий сценарій спершу коштує грошей, а вже потім показує, чи має право на життя: третій двигун ми оплатили, щоб дізнатись, що він не потрібен.

Як це влаштовано всередині

Далі - інженерна частина

Наступний розділ пояснює, як система влаштована. Якщо вас цікавить лише результат, його можна пропустити - нижче є розділ про те, кому це підходить.

Фільтри, які стоять перед відправкою

Розрахунок моменту дає кандидата, а не повідомлення. Між ними стоїть черга перевірок, і кожна з них зʼявилась після конкретної помилки.

Кандидат стає повідомленням тільки після всіх перевірок
НаявністьТовар є на складі. Нагадування про те, чого не можна купити, гірше за відсутність нагадування
ВитратністьПозиція належить до тих, що купують повторно. Решта відсікається на вході
ВиключенняСписок клієнтів і товарів, яким не пишемо ніколи
ЧастотаОбмеження кількості дотиків на одного клієнта за період
Відкриті замовленняТому, хто вже щось замовив і чекає, не пишемо взагалі
Контроль10% кандидатів відрізаються в контрольну групу до відправки, а не після
Час і стеляВікно робочих годин і денна стеля на кількість повідомлень

Чому контрольна група - не формальність

Виміряти розсилку без контролю неможливо: частина клієнтів купила б і так. Ми зустріли дві помилки, і кожна з них перевертає висновок у протилежний бік.

Перша: у пул потрапляють ті, хто вже купив після відправки, і вибірка забруднюється заднім числом. Друга: контрольна група замала для разової кампанії, і різниця тоне в шумі. Тому контроль тримається на рівні 10% від першого дня, а разові кампанії міряються окремо від регулярного двигуна.

Дрібниці, що коштують грошей

Три речі, які видно тільки в проді
Заборонені словаКожне повідомлення перевіряється до відправки: згадка сторонніх майданчиків у цьому каналі відхиляється на стороні провайдера, а тарифікується як надіслане
Зворотні статусиСтатуси доставки збираються назад. У кого месенджера немає - автоматично потрапляє в список виключень, і більше ми на нього не витрачаємось
Ручна модераціяЧерга проходить перегляд людиною на окремій сторінці, доки не набереться статистика. Це тимчасовий запобіжник, а не постійний процес

Кому це підходить

Усьому, що купують повторно: продукти, косметика, побутова хімія, корми, витратні матеріали. Головна умова - у вас є історія замовлень з позиціями, а не тільки з сумами.

Ознака, за якою легко перевірити, чи це про вас: якщо ви знаєте, що клієнт купує цю банку раз на місяць, але нічого не робите на тридцятий день - так, це про вас.

Різниця між розсилкою і сервісом - один розрахунок: чи потрібне це людині саме сьогодні.

Потрібне схоже рішення?

Опишіть задачу - підберу архітектуру під ваш бюджет і дані.