Реалізація аналітики чат-бота (воронки, конверсії) у мобільному додатку
Чат-бот без аналітики — це чорна скринька. Скільки користувачів пройшли воронку до кінця? На якому кроці відпадають? Який сценарій конвертує краще? Відповіді на ці питання — це аналітика бота, а мобільний додаток — зручний спосіб отримувати ці дані в будь-який час.
Воронка: як влаштована під капотом
Воронка в контексті чат-бота — це послідовність кроків (станів) сценарію. Користувач запустив бота → побачив привітання → відповів на питання кваліфікації → натиснув кнопку переходу → залишив контакт → отримав оффер.
На backend кожна подія в діалозі логується з user_id, conversation_id, step_name, timestamp. Воронка будується агрегацією: скільки унікальних користувачів досягло кожного кроку.
-- Приклад агрегації воронки
SELECT
step_name,
COUNT(DISTINCT user_id) as users,
LAG(COUNT(DISTINCT user_id)) OVER (ORDER BY step_order) as prev_step_users
FROM conversation_events
WHERE bot_id = $1 AND created_at BETWEEN $2 AND $3
GROUP BY step_name, step_order
ORDER BY step_order;
Конверсія кожного кроку = users / prev_step_users. Мобільний додаток отримує вже готові дані воронки через API.
Візуалізація воронки
Класична воронка — спадаючі горизонтальні смуги:
// Flutter — користувацький віджет воронки
class FunnelChart extends StatelessWidget {
final List<FunnelStep> steps;
@override
Widget build(BuildContext context) {
final maxUsers = steps.first.users;
return Column(
children: steps.map((step) {
final widthFraction = step.users / maxUsers;
final conversion = step.conversionFromPrev;
return Padding(
padding: const EdgeInsets.symmetric(vertical: 2),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(step.name, style: Theme.of(context).textTheme.labelMedium),
Row(
children: [
Expanded(
child: FractionallySizedBox(
widthFactor: widthFraction,
child: Container(
height: 36,
decoration: BoxDecoration(
color: _conversionColor(conversion),
borderRadius: BorderRadius.circular(4),
),
alignment: Alignment.centerRight,
padding: const EdgeInsets.only(right: 8),
child: Text(
'${step.users} (${(conversion * 100).toStringAsFixed(1)}%)',
style: const TextStyle(color: Colors.white, fontSize: 12),
),
),
),
),
],
),
],
),
);
}).toList(),
);
}
Color _conversionColor(double conversion) {
if (conversion > 0.7) return Colors.green;
if (conversion > 0.4) return Colors.orange;
return Colors.red;
}
}
Колір сегмента кодує конверсію кроку: зелений при > 70%, оранжевий при 40–70%, червоний при < 40%. Вузьке місце відразу видно.
Метрики та дашборд
Крім воронки, дашборд аналітики бота містить:
Операційні метрики (за вибраний період):
- Всього нових діалогів
- Середня тривалість діалогу
- % діалогів, передані на оператора
- % діалогів без відповіді користувача (відпали після першого повідомлення бота)
Конверційні метрики:
- Цільові события (залежать від бота: оформив заявку, залишив контакт, натиснув кнопку оффера)
- Конверсія по каналам: Telegram vs WhatsApp vs Web Widget
Retention:
- Скільки користувачів повернулися до бота через 7 днів, 30 днів
Період вибирається date picker'ом — last 7 days / last 30 days / custom range. Custom range на мобілі — showDateRangePicker (Flutter) або UICalendarView (iOS 16+).
Порівняння сценаріїв (A/B)
Якщо бот запускає A/B тест сценаріїв — показуємо паралельні воронки. Таблиця: рядки — кроки воронки, стовпці — варіант A та варіант B з конверсією кожного кроку. Ячейка з найкращим результатом — зелений фон.
| Крок | Варіант A | Варіант B |
|---|---|---|
| Запуск | 1,240 (100%) | 1,198 (100%) |
| Кваліфікація | 890 (71.8%) | 956 (79.8%) |
| Оффер | 320 (35.9%) | 412 (43.1%) |
| Заявка | 98 (30.6%) | 145 (35.2%) |
Що входить в роботу
- Дашборд з ключовими метриками та переключателем періоду
- Візуалізація воронки з кольоровою кодировкой конверсії
- Розбивка по каналам (Telegram, WhatsApp, Web)
- Таблиця порівняння A/B варіантів
- Drill-down: тап на крок воронки — список користувачів, зупинених на цьому кроці
Терміни
5–7 робочих днів. Вартість розраховується індивідуально після аналізу вимог.







