← Назад к вопросам

Что делать дальше аналитику с данными о звонках и чатах и целевыми сценариями для создания метрики сделки?

2.7 Senior🔥 61 комментариев
#Метрики продукта#Процессы и планирование

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как использовать данные о звонках и чатах для создания метрики сделки

Проблема

У вас есть данные:

  • Звонки: дата, длительность, исход (успешно/отклонено)
  • Чаты: дата, количество сообщений, статус (closed/unresolved)
  • Целевые сценарии: последовательность действий которая ведёт к сделке

Нужно понять: когда произошла сделка и что её вызвало.

Подход: Event-based attribution

Шаг 1: Определить что такое "сделка"

Сначала нужно согласовать определение:

Вариант A: Payment received
- Простой
- Но может быть refund или спор

Вариант B: Lead generated
- Человек дал контакты
- Но ещё не купил

Вариант C: Lead + Follow-up call booked
- Более сильный сигнал
- Person активно interested

Вариант D: Contract signed
- Самый сильный сигнал
- Но может быть медленно

Рекомендация: Выберите Вариант C или D в зависимости от цикла продаж.

Шаг 2: Структурируйте данные

Таблица звонков:

CREATE TABLE calls (
  call_id UUID,
  user_id UUID,
  agent_id UUID,
  call_date TIMESTAMP,
  duration_minutes INT,
  outcome VARCHAR (success, no_answer, declined),
  reason VARCHAR (pricing_inquiry, complaint, sales),
  PRIMARY KEY (call_id)
);

Таблица чатов:

CREATE TABLE chats (
  chat_id UUID,
  user_id UUID,
  agent_id UUID,
  start_time TIMESTAMP,
  end_time TIMESTAMP,
  message_count INT,
  status VARCHAR (resolved, unresolved, escalated),
  PRIMARY KEY (chat_id)
);

Таблица целевых сценариев:

CREATE TABLE deal_events (
  event_id UUID,
  user_id UUID,
  event_type VARCHAR (call_success, chat_resolved, contact_submitted),
  event_date TIMESTAMP,
  sequence_order INT,
  PRIMARY KEY (event_id)
);

Шаг 3: Привязать звонки/чаты к сделкам

Логика: Если произошла серия событий в определённом порядке → это паттерн для сделки

WITH user_interaction_sequence AS (
  -- Объединяем все interactions в хронологическом порядке
  SELECT 
    user_id,
    'call' as interaction_type,
    call_date as event_date,
    outcome,
    duration_minutes,
    ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY call_date) as sequence_num
  FROM calls
  WHERE outcome = 'success'
  
  UNION ALL
  
  SELECT 
    user_id,
    'chat' as interaction_type,
    end_time as event_date,
    status as outcome,
    message_count,
    ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY end_time) as sequence_num
  FROM chats
  WHERE status IN ('resolved', 'escalated')
)

SELECT 
  user_id,
  STRING_AGG(interaction_type, ' → ') as interaction_path,
  COUNT(*) as total_interactions,
  MAX(event_date) as last_interaction_date,
  -- Если есть успешный вызов, за которым идёт чат, это паттерн
  CASE 
    WHEN STRING_AGG(interaction_type, ' → ') LIKE '%call%chat%' THEN 'potential_deal'
    WHEN STRING_AGG(interaction_type, ' → ') LIKE '%call → call%' THEN 'nurturing'
    ELSE 'single_contact' 
  END as interaction_pattern
FROM user_interaction_sequence
GROUP BY user_id
HAVING COUNT(*) > 0;

Шаг 4: Создать метрику "Deal Completion"

Определение: Сделка = user прошёл целевой сценарий

WITH deal_completion AS (
  SELECT 
    user_id,
    -- Для каждого сценария проверяем все события
    
    -- Сценарий 1: Call → Chat → Lead submission
    CASE 
      WHEN EXISTS (
        SELECT 1 FROM calls c 
        WHERE c.user_id = u.user_id 
        AND c.outcome = 'success'
      ) 
      AND EXISTS (
        SELECT 1 FROM chats ch
        WHERE ch.user_id = u.user_id
        AND ch.status = 'resolved'
        AND ch.start_time > (SELECT MAX(call_date) FROM calls WHERE user_id = u.user_id)
      )
      THEN 1 ELSE 0 
    END as completed_scenario_1,
    
    -- Сценарий 2: Quick chat → Immediate escalation to agent
    CASE 
      WHEN EXISTS (
        SELECT 1 FROM chats ch
        WHERE ch.user_id = u.user_id
        AND ch.message_count < 5
        AND ch.status = 'escalated'
      )
      THEN 1 ELSE 0
    END as completed_scenario_2,
    
    -- Это и есть "сделка" если хотя бы один сценарий выполнен
    MAX(
      CASE WHEN EXISTS (SELECT 1 FROM calls WHERE user_id = u.user_id AND outcome = 'success') THEN 1 ELSE 0 END,
      CASE WHEN EXISTS (SELECT 1 FROM chats WHERE user_id = u.user_id AND status = 'resolved') THEN 1 ELSE 0 END
    ) as is_deal
  FROM users u
)
SELECT 
  DATE(completion_date) as deal_date,
  COUNT(DISTINCT user_id) as deals_completed,
  COUNT(DISTINCT CASE WHEN completed_scenario_1 = 1 THEN user_id END) as scenario_1_count,
  COUNT(DISTINCT CASE WHEN completed_scenario_2 = 1 THEN user_id END) as scenario_2_count
FROM deal_completion
WHERE is_deal = 1
GROUP BY DATE(completion_date)
ORDER BY deal_date DESC;

Шаг 5: Attribution — какой channel привёл к сделке?

WITH first_touch AS (
  -- Какое первое взаимодействие было?
  SELECT 
    user_id,
    CASE 
      WHEN MIN(event_date) IN (SELECT call_date FROM calls WHERE user_id = ...) THEN 'call'
      WHEN MIN(event_date) IN (SELECT start_time FROM chats WHERE user_id = ...) THEN 'chat'
    END as first_channel,
    MIN(event_date) as first_interaction_date
  FROM (
    SELECT user_id, call_date as event_date FROM calls
    UNION ALL
    SELECT user_id, start_time FROM chats
  )
  GROUP BY user_id
)
SELECT 
  first_channel,
  COUNT(DISTINCT CASE WHEN is_deal = 1 THEN user_id END) as deals,
  ROUND(100.0 * COUNT(DISTINCT CASE WHEN is_deal = 1 THEN user_id END) / COUNT(DISTINCT user_id), 2) as conversion_rate
FROM first_touch ft
LEFT JOIN deal_completion dc ON ft.user_id = dc.user_id
GROUP BY first_channel;

Шаг 6: Монитор метрики в дашборде

KPI для tracking:

Daily Deal Completion
├─ Total deals: 150 (+10% vs yesterday)
├─ By channel:
│  ├─ Call-initiated: 90 (+8%)
│  ├─ Chat-initiated: 60 (+15%)
├─ By scenario:
│  ├─ Scenario 1 (Call→Chat): 100
│  ├─ Scenario 2 (Escalation): 50
├─ Time to deal:
│  └─ Median: 3 days (от первого контакта)

Шаг 7: Отладка (Debug problematic data)

Проблемы которые могут возникнуть:

Проблема 1: Дублирование events

-- Проверка
SELECT user_id, call_date, COUNT(*) 
FROM calls 
GROUP BY user_id, call_date 
HAVING COUNT(*) > 1;

Проблема 2: Пропущенные звонки vs контакты

-- Контроль качества
SELECT 
  outcome,
  COUNT(*) as count,
  ROUND(100.0 * COUNT(*) / SUM(COUNT(*)) OVER (), 2) as pct
FROM calls
GROUP BY outcome;

Проблема 3: Долгие чаты (может быть broken conversations)

SELECT 
  PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY DATEDIFF(MINUTE, start_time, end_time)) as p95_duration
FROM chats;

Рекомендации

1. Вовлеките domain experts

  • Sales team: какой path обычно ведёт к сделке?
  • CS team: какие interactions indicative of good deal?

2. Validate сценарии

  • Возьмите 50 реальных сделок
  • Посмотрите их историю звонков/чатов
  • Выведите паттерны

3. Итеративно улучшайте

  • V1: Simple definition (есть call + есть chat = deal)
  • V2: Add timing (chat должен быть в течение 7 дней после call)
  • V3: Add quality (call должен быть > 5 минут)

4. Monitor false positives/negatives

  • False positive: система говорит deal, но это не deal
  • False negative: реальная сделка не поймана
  • Нужно достичь ~90% accuracy