Как посчитать payment retry success rate в SQL

Проверь себя · 1/3разбор после ответа
Вы делаете пагинацию так: SELECT product_id FROM products LIMIT 20 OFFSET 20. В чём главный риск такого подхода для аналитической витрины или интерфейса, если нет ORDER BY?

Зачем retry rate

После failed payment система пытается повторить charge через час, день, три. Retry success rate показывает эффективность этого механизма. Низкий retry rate = card permanently bad, retry бесполезен. Высокий = временный issue (insufficient funds, network). Метрика — основной KPI для billing-команды.

Базовая формула

retry_rate = successful retries / total retries

Считается на retry-уровне, не user-уровне.

Retry success rate в SQL

WITH retries AS (
    SELECT
        user_id,
        event_id,
        event_date,
        event_status  -- 'success' или 'failed'
    FROM payment_events
    WHERE event_type = 'retry'
      AND event_date >= CURRENT_DATE - INTERVAL '90 days'
)
SELECT
    COUNT(*) AS total_retries,
    COUNT(*) FILTER (WHERE event_status = 'success') AS successful,
    COUNT(*) FILTER (WHERE event_status = 'success')::NUMERIC * 100
    / NULLIF(COUNT(*), 0) AS retry_success_rate_pct
FROM retries;

Industry typical: 25-40%. Smart retries (Stripe, recurly) — до 60%+.

По номеру попытки

WITH retries_numbered AS (
    SELECT
        user_id,
        event_id,
        event_date,
        event_status,
        ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY event_date) AS retry_number
    FROM payment_events
    WHERE event_type = 'retry'
)
SELECT
    retry_number,
    COUNT(*) AS attempts,
    COUNT(*) FILTER (WHERE event_status = 'success')::NUMERIC * 100
    / NULLIF(COUNT(*), 0) AS success_rate_pct
FROM retries_numbered
GROUP BY retry_number
ORDER BY retry_number;

Retry 1: 40-50% success. Retry 5+: 5-10%. После 4-5 attempts — обычно безнадёжно.

Закрепи формулу payment retry success rate в Карьернике
Запомнить надолго — 5 коротких сессий с задачами на эту тему. Бесплатно
Тренировать payment retry success rate в Telegram

По платежной системе

SELECT
    payment_system,
    COUNT(*) AS retries,
    COUNT(*) FILTER (WHERE status = 'success')::NUMERIC * 100
    / NULLIF(COUNT(*), 0) AS success_rate_pct
FROM payment_retries
WHERE attempt_date >= CURRENT_DATE - INTERVAL '90 days'
GROUP BY payment_system
ORDER BY success_rate_pct DESC;

Stripe обычно даёт highest recovery благодаря Card Account Updater. PayPal — ниже из-за отсутствия этой функции.

Smart retry vs fixed

Smart retry система понимает причину failure и адаптирует timing. Fixed retry бьёт через каждые 24 часа. Сравнение:

WITH retry_groups AS (
    SELECT
        CASE WHEN retry_system = 'smart' THEN 'smart' ELSE 'fixed' END AS retry_type,
        status
    FROM payment_retries
    WHERE attempt_date >= CURRENT_DATE - INTERVAL '60 days'
)
SELECT
    retry_type,
    COUNT(*) AS attempts,
    COUNT(*) FILTER (WHERE status = 'success')::NUMERIC * 100
    / NULLIF(COUNT(*), 0) AS success_rate_pct
FROM retry_groups
GROUP BY retry_type;

Smart retry обычно даёт +15-25% recovery vs fixed.

Частые ошибки

Ошибка 1. Считать success в первой попытке как retry. Это original payment, не retry. Не путать.

Ошибка 2. Не сегментировать по failure_reason. Insufficient funds — recovery 60%+. Expired card — < 10%. Разные сценарии.

Ошибка 3. Считать на user, а не на retry. Один user с 5 attempts = 5 retries. Не считайте unique users в numerator.

Ошибка 4. Игнорировать таймауты network. Network timeout != real failure. Часто retry успешен. Сегментируйте.

Ошибка 5. Не учитывать chargeback после retry. Иногда retry success → chargeback через 30 дней. Net recovery меньше.

Связанные темы

FAQ

Сколько retry attempts оптимально?

3-5. Дальше chargeback risk возрастает.

Smart retry — это что?

Recurly / Stripe Smart Retries: используют ML для выбора лучшего времени retry.

Retry в выходные?

Хуже, чем в будни (зарплата приходит в среду). Smart retry это учитывает.

Card Account Updater стоит?

$0.25/match in Stripe. Окупается if updated card recovers $5+ MRR.

Retry vs dunning email?

Retry — automatic charge. Dunning — email с CTA «update card». Используют оба.