Collection Rate (собираемость платежей) — это доля выставленных к оплате денег, которую компания реально получила за период: Collection Rate = Собрано / Выставлено × 100%. На собесе в финтех или лендинговую компанию (МФО, BNPL, кредитный конвейер) эту метрику спрашивают почти всегда: она напрямую показывает, насколько здоров портфель и не «течёт» ли выручка между начислением и поступлением.
В этом посте разберём формулу, два способа расчёта (за период и когортный), бенчмарки по индустриям и готовые SQL-запросы, которые можно вставить в дашборд или показать на интервью.
Что такое Collection Rate и зачем он нужен?
Collection Rate отвечает на простой вопрос: «Из всех денег, которые нам должны были заплатить, сколько мы получили?». В отличие от выручки, которую можно «нарисовать» начислениями, собираемость показывает фактический денежный поток.
Где метрика критична:
- Лендинг и МФО — платежи по графику погашения. Низкий collection = рост просрочки и резервов.
- BNPL (Buy Now Pay Later) — рассрочки. Каждый невыкупленный платёж бьёт по unit-экономике.
- Подписки и B2B SaaS — выставленные инвойсы. Часть клиентов платит с задержкой или не платит вовсе.
- ЖКХ, телеком, страхование — регулярные начисления, где разрыв между «начислено» и «оплачено» формирует дебиторку.
Главная путаница новичков — смешать collection rate с conversion rate. Конверсия про то, сколько людей сделали действие; собираемость — про деньги, которые уже обязаны заплатить. Разбор смежных метрик и их формул удобно держать под рукой в справочнике метрик.
Как считать Collection Rate: базовая формула
Базовая формула за период:
Collection Rate = Сумма поступивших платежей / Сумма выставленных к оплате × 100%
Пример. За октябрь к оплате выставлено 10 000 000 ₽ (плановые платежи по графику + инвойсы). Фактически поступило 8 600 000 ₽.
8 600 000 / 10 000 000 × 100% = 86%
Звучит просто, но дьявол в деталях — что именно класть в числитель и знаменатель:
- По начислению или по сроку? Берём всё начисленное за месяц или только то, у чего срок оплаты (due date) попадает в этот месяц? В лендинге почти всегда — по сроку платежа.
- Считаем ли досрочные и частичные платежи? Частичное погашение — это часть собранного, а не ноль.
- Учитываем ли возвраты и чарджбэки? Для честной картины собранное стоит уменьшать на возвраты.
- Какая валюта и налоги? Считаем gross (с НДС) или net.
На собесе хороший ответ — не просто формула, а уточняющие вопросы интервьюеру про эти нюансы. Это показывает, что вы думаете о метрике как продуктовый аналитик, а не как калькулятор.
Чем отличается Collection Rate за период от когортного?
Метрика «за период» (period collection) усредняет всё и хороша для отчёта совету директоров, но скрывает динамику. Когортный collection (cohort collection rate) показывает, как собираемость одной группы платежей нарастает со временем.
| Подход | Что показывает | Когда применять |
|---|---|---|
| Period collection | Собрано / выставлено за месяц | Дашборд, KPI, отчётность |
| Cohort collection | Какую долю собрали по платежам due-date месяца X через N дней | Скоринг, прогноз дефолтов, динамика |
| Vintage collection | Собираемость по «винтажам» выдач (когорта по дате выдачи кредита) | Лендинг, оценка качества выдач |
Логика когортного collection: фиксируем когорту по месяцу срока платежа, а потом смотрим, сколько денег от неё собрано на горизонте 0, 7, 30, 60, 90 дней. Получается «лесенка» дозревания — ранние когорты успели собраться сильнее, свежие ещё в процессе. Это та же механика, что и в когортном анализе retention, только метрика денежная.
Какие бенчмарки Collection Rate считаются нормой?
Жёстких отраслевых стандартов нет — всё зависит от риск-аппетита и сегмента. Но ориентиры такие:
- Прайм-сегмент лендинга (хорошие заёмщики): on-time collection 92–98%.
- Субпрайм / МФО: 70–85% на due-date, дозревает до 88–93% через 30–60 дней.
- BNPL: 90–96% по первому платежу рассрочки.
- B2B SaaS инвойсы: 95–99% (платят, но с задержкой — отсюда DSO).
- ЖКХ / телеком: 95%+ за счёт регулярности и автосписаний.
Рядом с collection обычно смотрят парные метрики:
DSO (Days Sales Outstanding) = Дебиторка / Выручка × Дней в периоде— средний срок инкассации.Bad Debt Rate = Списанная безнадёжная задолженность / Выставлено— то, что собрать уже не получится.Roll Rate— доля задолженности, перетекающей из одного бакета просрочки в следующий.
Если на собесе вас просят «улучшить collection», говорите не о магии, а о рычагах: напоминания и автосписания (повышают on-time), реструктуризация (поднимает дозревание поздних когорт), скоринг на входе (отсекает плохие выдачи до того, как они испортят метрику).
Как посчитать Collection Rate в SQL?
Возьмём схему из двух таблиц: billings (начисления к оплате) и payments (поступления). Базовый collection rate за месяц по сроку платежа:
SELECT date_trunc('month', b.due_date) AS period, SUM(p.amount) / SUM(b.amount) AS collection_rate FROM billings b LEFT JOIN payments p ON p.billing_id = b.id GROUP BY 1 ORDER BY 1;
Чтобы корректно учесть частичные платежи, агрегируем поступления по каждому начислению до джойна — иначе LEFT JOIN размножит строки и собьёт суммы:
WITH paid AS (SELECT billing_id, SUM(amount) AS collected FROM payments GROUP BY billing_id) SELECT date_trunc('month', b.due_date) AS period, SUM(COALESCE(p.collected, 0)) AS collected, SUM(b.amount) AS billed, ROUND(SUM(COALESCE(p.collected, 0)) / SUM(b.amount) * 100, 1) AS collection_rate_pct FROM billings b LEFT JOIN paid p ON p.billing_id = b.id GROUP BY 1 ORDER BY 1;
Когортный collection — на горизонте N дней от due date. Ключевая идея: фильтруем платежи по разнице между датой поступления и сроком, и считаем дозревание ступенями:
WITH cohort AS (SELECT b.id, date_trunc('month', b.due_date) AS cohort_month, b.amount AS billed, b.due_date FROM billings b) SELECT c.cohort_month, ROUND(SUM(CASE WHEN p.paid_at <= c.due_date + INTERVAL '0 day' THEN p.amount ELSE 0 END) / SUM(c.billed) * 100, 1) AS d0, ROUND(SUM(CASE WHEN p.paid_at <= c.due_date + INTERVAL '30 day' THEN p.amount ELSE 0 END) / SUM(c.billed) * 100, 1) AS d30, ROUND(SUM(CASE WHEN p.paid_at <= c.due_date + INTERVAL '90 day' THEN p.amount ELSE 0 END) / SUM(c.billed) * 100, 1) AS d90 FROM cohort c LEFT JOIN payments p ON p.billing_id = c.id GROUP BY c.cohort_month ORDER BY c.cohort_month;
Подводные камни, на которых валятся:
- Деление на ноль — если в месяце нет начислений,
SUM(b.amount)= 0. Оберните вNULLIF(SUM(b.amount), 0). - Fan-out при джойне — несколько платежей на одно начисление множат строки. Агрегируйте до джойна (как в примере выше).
- Собрано больше выставленного — переплаты и досрочные платежи могут дать collection > 100%. Решите бизнес-логикой: капать на сумму начисления через
LEAST(collected, billed)или оставлять как есть. - Незрелые когорты — свежий месяц всегда выглядит хуже. Не сравнивайте «сырую» когорту со зрелой.
Где потренироваться?
Collection rate — отличная тема, чтобы прокачать связку «продуктовая метрика + SQL», которую любят на собесах в финтех. Вот куда идти:
- SQL-тренажёр — реши задачи на когортный анализ, оконные функции и агрегации прямо в браузере (PostgreSQL и SQLite). Тут можно собрать collection rate с нуля на учебных данных.
- Python-тренажёр — посчитай ту же собираемость на pandas: группировки, сводные таблицы, расчёт по когортам без SQL.
- Справочник метрик — формулы collection rate, DSO, churn, LTV, CAC и десятков других показателей с примерами и мини-задачами «зачем следить».
- Когортный анализ и retention в SQL — соседняя тема с той же механикой когорт, только про удержание пользователей.
Соберите свой первый дашборд собираемости, прогоните когортный запрос на разных горизонтах — и метрика, которая пугала на собесе, станет вашим козырем.