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

Как найти причину падения конверсии на 10%?

2.0 Middle🔥 221 комментариев
#Аналитика и метрики#Опыт и soft skills

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

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

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

Как найти причину падения конверсии на 10%

1. Определи точку падения

Первое — когда именно произошло падение. Проанализируй график конверсии по дням:

-- Дневная конверсия
SELECT 
    DATE(order_date) as date,
    COUNT(DISTINCT user_id) as users,
    COUNT(*) as orders,
    ROUND(COUNT(*) * 100.0 / COUNT(DISTINCT user_id), 2) as conversion_pct
FROM events
WHERE event_type IN ('view_product', 'order')
GROUP BY DATE(order_date)
ORDER BY date DESC
LIMIT 60;

Если конверсия упала 10% в конкретный день → проверь, что произошло в тот день (деплой, маркетинг, внешние факторы).

Если падение градуальное → ищи дренаж через разные каналы.

2. Разбей по каналам (cohort analysis)

Конверсия может быть разной для разных групп пользователей:

-- Конверсия по источнику трафика
SELECT 
    traffic_source,
    DATE(order_date) as date,
    COUNT(DISTINCT user_id) as users,
    COUNT(*) as orders,
    ROUND(COUNT(*) * 100.0 / COUNT(DISTINCT user_id), 2) as conversion_pct
FROM events e
JOIN users u ON e.user_id = u.id
WHERE event_type IN ('view_product', 'order')
GROUP BY traffic_source, DATE(order_date)
ORDER BY traffic_source, date DESC;

Возможные находки:

  • Organic поддержал конверсию, а Paid упал → проблема с рекламной кампанией
  • Mobile упал, desktop OK → проблема с мобильным фронтом
  • EU упал, US OK → проблема с платежами (GDPR, карты)

3. Разбей по этапам воронки (Funnel Analysis)

Падение конверсии может быть на разных этапах:

-- Воронка покупок
WITH funnel AS (
    SELECT 
        DATE(event_date) as date,
        COUNT(DISTINCT CASE WHEN event_type = 'view_product' THEN user_id END) as viewed,
        COUNT(DISTINCT CASE WHEN event_type = 'add_to_cart' THEN user_id END) as carted,
        COUNT(DISTINCT CASE WHEN event_type = 'checkout' THEN user_id END) as checkout,
        COUNT(DISTINCT CASE WHEN event_type = 'order' THEN user_id END) as ordered
    FROM events
    GROUP BY DATE(event_date)
)
SELECT 
    date,
    viewed,
    carted,
    ROUND(carted * 100.0 / viewed, 2) as view_to_cart_pct,
    checkout,
    ROUND(checkout * 100.0 / carted, 2) as cart_to_checkout_pct,
    ordered,
    ROUND(ordered * 100.0 / checkout, 2) as checkout_to_order_pct
FROM funnel
ORDER BY date DESC;

Где произошло падение?

  • View → Add to cart (70% → 60%): проблема с UX или ценообразованием
  • Add to cart → Checkout (90% → 70%): проблема с доставкой/способами оплаты
  • Checkout → Order (85% → 60%): проблема с платежом или безопасностью

4. Технические причины

A. Проверь скорость загрузки

# Проанализировать медленные страницы
import pandas as pd
from sqlalchemy import create_engine

engine = create_engine('postgresql://...')
df = pd.read_sql("""
    SELECT 
        page_url,
        AVG(load_time_ms) as avg_load_time,
        COUNT(*) as visits
    FROM page_metrics
    WHERE date >= NOW() - INTERVAL 7 DAY
    GROUP BY page_url
    ORDER BY avg_load_time DESC;
""", engine)

# Если load_time вырос > 3сек → может быть причина
print(df[df['avg_load_time'] > 3000])

B. Проверь ошибки приложения

-- Ошибки по дням
SELECT 
    DATE(timestamp) as date,
    error_type,
    COUNT(*) as error_count
FROM error_logs
WHERE timestamp >= NOW() - INTERVAL 14 DAY
GROUP BY DATE(timestamp), error_type
ORDER BY date DESC, error_count DESC;

Если вырос payment_error → проблема с платежным шлюзом.

C. Проверь выброс в логах

# Поиск аномалий в application logs
grep -i "payment failed\|timeout\|503" logs/app.log | \
  awk '{print $1}' | sort | uniq -c | sort -rn | head -20

5. Бизнес-причины

A. Изменения в ценах/промо

-- Проверь цены и скидки
SELECT 
    DATE(effective_date) as date,
    AVG(price) as avg_price,
    AVG(discount_pct) as avg_discount
FROM products_price_history
WHERE date >= NOW() - INTERVAL 14 DAY
GROUP BY DATE(effective_date)
ORDER BY date DESC;

Если цена выросла или скидка упала → может быть причина падения конверсии.

B. Сезонность / Внешние события

# Сравнить с прошлым годом
this_year = pd.read_sql("""
    SELECT DATE(order_date) as date, COUNT(*) as orders
    FROM orders
    WHERE YEAR(order_date) = YEAR(NOW())
    GROUP BY DATE(order_date)
""", engine)

last_year = pd.read_sql("""
    SELECT DATE(order_date) as date, COUNT(*) as orders
    FROM orders
    WHERE YEAR(order_date) = YEAR(NOW()) - 1
    GROUP BY DATE(order_date)
""", engine)

# Нормализуй по дням недели
print("Это сезонное падение или аномалия?")

6. Систематический анализ (Root Cause Analysis)

Python: Попытка автоматизировать поиск

import pandas as pd
from sqlalchemy import create_engine
from datetime import datetime, timedelta

engine = create_engine('postgresql://...')

def analyze_conversion_drop():
    # Получи конверсии за последние 30 дней
    df = pd.read_sql("""
        SELECT 
            DATE(order_date) as date,
            COUNT(DISTINCT user_id) as users,
            COUNT(*) as orders,
            ROUND(COUNT(*) * 100.0 / COUNT(DISTINCT user_id), 2) as conv_pct
        FROM events
        WHERE order_date >= NOW() - INTERVAL 30 DAY
        GROUP BY DATE(order_date)
    """, engine)
    
    # Найди день падения
    df['conv_change'] = df['conv_pct'].pct_change() * 100
    drop_date = df[df['conv_change'] <= -10]
    
    if len(drop_date) > 0:
        print(f"Drop detected on {drop_date.iloc[0]['date']}")
        print(f"Previous conversion: {drop_date.iloc[0]['conv_pct']:.2f}%")
        
        # Проверь метрики в тот день
        queries = [
            ("Mobile vs Desktop", """
                SELECT device_type, COUNT(*) as orders
                FROM events
                WHERE DATE(order_date) = %s AND event_type = 'order'
                GROUP BY device_type
            """),
            ("Traffic source", """
                SELECT traffic_source, COUNT(*) as orders
                FROM events
                WHERE DATE(order_date) = %s AND event_type = 'order'
                GROUP BY traffic_source
            """),
            ("Errors", """
                SELECT COUNT(*) as errors
                FROM error_logs
                WHERE DATE(timestamp) = %s
            """)
        ]
        
        for name, query in queries:
            result = pd.read_sql(query, engine, params=[drop_date.iloc[0]['date']])
            print(f"\n{name}:")
            print(result)

analyze_conversion_drop()

7. Чеклист исследования

Технические факторы:

  • Скорость загрузки страницы (% > 3сек)
  • Ошибки приложения (500, timeout, payment fails)
  • Доступность платежного шлюза
  • Проверена ли SSL/TLS (потеря сертификата?)

Бизнес-факторы:

  • Изменения в ценах
  • Скидки / промо-код (закончился?)
  • Изменение способов доставки / оплаты
  • Конкуренты запустили акцию?
  • Сезонность (праздники, день недели)

Данные об аудитории:

  • Mobile конверсия vs Desktop
  • Географический спад (только один регион?)
  • Источник трафика (Organic, Paid, Direct)
  • Новые vs возвращающиеся пользователи
  • Когорта пользователей (старые vs новые)

Маркетинг:

  • Новая рекламная кампания запущена?
  • Бюджет переместили?
  • Отрицательный PR/отзывы?

Итоговый процесс

  1. Определи тренд — когда и насколько упала конверсия
  2. Разбей по когортам — где упала (мобиль, регион, источник)
  3. Разбей по воронке — на каком этапе (cart abandonment, payment fail)
  4. Проверь логи — технические ошибки
  5. Проверь данные — цены, скидки, промо
  6. Исключай гипотезы — не это, не то, осталось одно
  7. Валидируй — потвердизи гипотезу A/B тестом или откатом

Основной принцип: данные не врут, нужно правильно их смотреть и разбивать по переменным.