Реализация аналитики чат-бота (воронки, конверсии) в мобильном приложении
Чат-бот без аналитики — это чёрный ящик. Сколько пользователей прошли воронку до конца? На каком шаге отваливаются? Какой сценарий конвертирует лучше? Ответы на эти вопросы и есть аналитика бота, и мобильное приложение — удобный способ получать эти данные в любое время.
Воронка: как устроена под капотом
Воронка в контексте чат-бота — это последовательность шагов (состояний) сценария. Пользователь запустил бота → увидел приветствие → ответил на вопрос квалификации → нажал кнопку перехода → оставил контакт → получил оффер.
На бэкенде каждое событие в диалоге логируется с 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 рабочих дней. Стоимость рассчитывается индивидуально после анализа требований.







