О дашборде
Дашборд Trader KPI — стратегический отчёт для анализа ключевых показателей трейдеров за выбранный период (неделя / день / месяц). Данные обновляются каждые 30 минут.
Вкладка Weekly
KPI-карточки — 12 метрик за текущую неделю с сравнением с предыдущей (% изменения). Churn-карточки показывают абсолют и % долю вместе: Churn 7D · Churn 7D %, Churn Formal · Churn Formal %.
Графики — Active Traders Unique & PayIn Volume (комбо), AVG Active Traders, New Traders, Settle % & Deposit, Vol/Dep Ratio, Churn 7D & Churn Formal.
Прогноз — на последнем баре пунктирный блок показывает прогноз до конца периода (Hourly Profile Scaling). Tooltip: Fact + Forecast = Total.
Таблица — понедельное сравнение всех метрик с % изменения, включая Churn 7D и Churn Formal.
Вкладка Daily
Аналогично Weekly, но в разрезе дней. Последние 30 дней с графиками, прогнозом и таблицей Day-over-Day.
Вкладка Monthly
Аналогично Weekly, но в разрезе месяцев. Прогноз до конца текущего месяца.
Фильтры
Affiliate / Manager / Payment Method / Status / Group / Trader — все графики и таблицы пересчитываются при изменении.
Group = P2P — по умолчанию.
Оновити — принудительное обновление из базы (очистка кеша).
Скинути — сброс всех фильтров.
Обсяг PayIn
Сумма успешных payin транзакций (из таблицы Transaction). Включаются только провайдеры с общим объёмом > 5,000.
SQL-query ▾
SELECT SUM(tran.amount) AS payin_volume
FROM "Transaction" tran
JOIN "BankAccount" ba ON ba.id = tran."bankAccount"
WHERE tran.operation = 'payin'
AND ba."accountProvider" IN (
-- Только провайдеры с total payin > 5000
SELECT pid FROM vol_daily
GROUP BY pid HAVING SUM(volume) > 5000
)
Унікальні активні трейдери
Количество уникальных трейдеров (провайдеров), у которых сумма payin > 0 за выбранный период. Каждый трейдер считается один раз.
SQL-query ▾
SELECT COUNT(*) FROM (
SELECT ba."accountProvider" AS pid
FROM "Transaction" tran
JOIN "BankAccount" ba ON ...
WHERE tran.operation = 'payin'
GROUP BY ba."accountProvider"
HAVING SUM(tran.amount) > 0
) sub
Сер. активні трейдери
Среднее количество активных трейдеров в день. Сумма ежедневных уникальных трейдеров / количество дней.
SQL-query ▾
SELECT AVG(day_traders) AS avg_active
FROM (
SELECT dt, COUNT(DISTINCT pid) AS day_traders
FROM vol_daily
WHERE operation = 'payin' AND volume > 0
GROUP BY dt
) daily_active
AVG PayIn per Trader
Средний объём PayIn на одного трейдера. Общий объём / сумма ежедневных трейдеров.
SQL-query ▾
SELECT SUM(payin_volume)
/ SUM(day_traders) AS avg_payin
-- day_traders: ежедневный DISTINCTCOUNT
-- НЕ среднее, а именно SUM
Нові трейдери
Трейдеры, у которых первая payin транзакция попадает в выбранный период.
SQL-query ▾
SELECT COUNT(*) AS new_traders
FROM (
SELECT ba."accountProvider" AS pid,
MIN((tran."createdAt" AT TIME ZONE 'UTC'
AT TIME ZONE 'Asia/Kolkata')::date) AS first_tr
FROM "Transaction" tran
JOIN "BankAccount" ba ON ...
WHERE tran.operation = 'payin'
GROUP BY 1
) ftx
WHERE first_tr >= :period_start
Deposit Volume
Кумулятивный депозит на последний день периода. Исключаются архивные трейдеры и аккаунты 'Payable'.
SQL-query ▾
SELECT SUM(dc.cum_dep) AS deposit
FROM period_last_dt pld
JOIN dep_cumulative dc
ON dc.dt = pld.last_dt
JOIN "AccountProvider" ap
ON ap.id = dc.pid
WHERE ap.status != 'archive'
AND ap.name NOT LIKE '%Payable%'
Сетл %
Доля settlement от PayIn Volume.
SQL-query ▾
SELECT SUM(settlement) / NULLIF(SUM(payin_volume), 0)
AS settle_pct
-- settlement: из BankAccountAggregate
-- payin_volume: из Transaction
Vol/Dep Ratio
Коэффициент эффективности капитала. Дневной PayIn / (депозит × 93).
SQL-query ▾
SELECT
(SUM(payin_volume) / active_days)
/ (dep_active_traders * 93)
AS vol_dep
-- active_days: дни с payin > 0
-- dep_active_traders: cumulative_dep
-- на LASTDATE для трейдеров
-- активных в последний день периода
Прогнозирование (Forecast)
Метод: Hourly Profile Scaling. Берутся последние 4 недели того же дня недели, строится профиль почасового накопления. Текущий факт / % прошедшего времени = прогноз.
SQL-query ▾
-- Профиль по часам (тот же день недели)
SELECT hr,
SUM(vol) OVER (ORDER BY hr)
/ SUM(vol) OVER () AS cum_pct
FROM (
SELECT EXTRACT(hour FROM ...) AS hr,
SUM(tran.amount) AS vol
FROM "Transaction" tran
WHERE EXTRACT(isodow FROM ...)
= EXTRACT(isodow FROM now())
AND ... >= now() - '28 days'
GROUP BY 1
)
-- Прогноз = actual / cum_pct
Churn 7D
Кількість трейдерів, які були активні в попередньому періоді, але НЕ активні в поточному (set-difference по періодах). Вимірює «відтік» по тижнях/днях/місяцях.
Активність = факт спроби PayIn у таблиці payments (будь-який статус, не лише успішні) — вирівняно зі звітом /churn. Universe = трейдери з provider.type='p2p', без Operation provider та %QA_Test%. Періоди — календарні (ISO-тижні Пн-Нд), тому значення близькі до /churn, але не ідентичні (там ковзні 7-денні вікна).
Churn 7D %
Частка відтоку: Churn 7D / кількість активних у попередньому періоді × 100. Нормалізує відтік до розміру бази: абсолютний Churn 7D природно росте разом із базою трейдерів, тому +50% у штуках може означати незмінний або навіть нижчий ВІДСОТОК відтоку. Чисельник і знаменник — з одного universe (PayIn-спроби в payments, provider.type='p2p'). Зміна в таблиці — у процентних пунктах (pp). Зростання = погіршення (червоний).
Churn Formal
Кількість трейдерів, чий статус на кінець періоду — термінальний (Archive, Scammer, Lost, 60DaysLost), а на кінець попереднього періоду був робочим (методологія E — «дельта станів на межах періодів», зафіксована 2026-08-21). Стани відновлюються з журналу змін статусів account_provider_events.
Чому журнал, а не снепшот: стара логіка читала поточний статус і status_updated_at — при переведенні lost → archive подія «переїжджала» на нову дату і статус, історія переписувалась заднім числом, а реанімовані трейдери зникали з минулих періодів. За журналом минулі значення метрики більше не змінюються.
Властивості: та сама модель «порівняння двох фотографій», що і в Churn 7D; клацання статусами всередині періоду (адмін-флапінг) невидимі; трейдер, реактивований і згодом знову втрачений, чесно рахується вдруге; переходи «термінальний → термінальний» подіями не є. Статус у розкладці = статус на кінець періоду.
Тільки реальні трейдери — лише ті, хто колись мав спробу PayIn у payments в межах universe provider.type='p2p' (без Operation provider / %QA_Test%). Audit виключено — тимчасовий робочий статус.
Churn Formal %
Частка формального відтоку: Churn Formal / кількість активних трейдерів у попередньому періоді × 100. Знаменник той самий, що у Churn 7D % (активні = ≥1 спроба PayIn за попередній період) — обидві частки порівнянні між собою. При базі, що росте, абсолютний Churn Formal зростає механічно; відсоток показує реальну інтенсивність відтоку.
Matrix (внизу кожної вкладки)
Розбивка однієї метрики по вимірах: рядки — Affiliate / Manager / Trader (перемикач), колонки — періоди вкладки (тижні / дні / місяці). Кнопки метрик: Volume, Traders, AVG Tr, AVG/Tr, Deposit, Settle%, V/D, New, Churn 7D, Churn Fm. Рядок Total рахується з сирих компонентів (для ratio-метрик — не сумою клітинок). Для виміру Trader показуються топ-200 рядків за сумою. Фільтри й діапазон дат застосовуються. CSV — повні числа без скорочень.
Тип периода
Daily: сегодня vs вчера. Weekly: ISO Пн-Вс vs предыдущая. Monthly: месяц vs предыдущий.
Источник данных
PostgreSQL (DigitalOcean). SQL идентичен Power BI Trader_Detailed M-query. Грейн: Provider × Day. IST (UTC+5:30). Кеш: 1 час, авто-обновление 30 мин.
Статуси трейдерів — Active / Paused / Restricted / Suspicious
Active — трейдер повністю активний, може робити PayIn і PayOut.
Paused — виставляється автоматично якщо трейдер не користується кабінетом 1 тиждень (немає PayIn тощо). Перевести в Active можуть лише співробітники з КС.
Paused / Active — Paused (paused), Active (active)
Restricted — виставляється автоматично, коли трейдер виконує PayOut і накопичується багато PayOut, не перевірених антискамом. В Active переводить антискам після перевірки. Трейдер не може ввімкнути акаунти на PayIn.
Restricted / Обмежений (restricted)
Suspicious — виставляється і знімається антискамом: використовується при проблемах з перевіркою доказів від трейдера по PayOut, або багато реджектів PayIn підряд, іноді автоматично (якщо трейдер при PayOut прикріпив поганий скрін). Трейдеру недоступні функції PayOut і PayIn, не може ввімкнути акаунти.
Suspicious / Підозрілий (suspicious)
Locked — статус можуть виставляти Support, менеджери, антискам — у кожного відділу свої причини.
Locked / Заблокований (locked)
Статуси трейдерів — формальний відтік (Churn Formal)
Archive — ставиться фінами коли немає жодної активності в кабінеті трейдера на стадії інтеграції (новий кабінет, депозит не внесено, трейдер АФК — кабінет архівують), або після аудиту при завершенні співпраці, або після тривалої неактивності після списання балансу.
Archive / Архів (archive)
Scammer — ставить антискам після перевірок трейдера та виявлення доказів скаму.
Scammer / Шахрай (scammer)
Lost — статус ставиться автоматично якщо трейдер не користується кабінетом 2 тижні і немає активності. Або якщо затягується процес аудиту і щоб трейдер не світився в портфелі менеджера — Саша ставить вручну.
Lost / Втрачений (lost)
60DaysLost — трейдер неактивний довго. Фіни орієнтуються на цей статус щоб списати баланс і перевести дашборд в архів.
60DaysLost / Втрачений 60 днів (60DaysLost)
Audit — ставиться і знімається фінвідділом. Трейдер не може працювати до завершення аудиту і переведення в Active.
Audit / Аудит (audit)
У метриці Churn Formal враховуються термінальні статуси Archive, Scammer, Lost, 60DaysLost — за методологією E: подія є, коли статус на кінець періоду термінальний, а на кінець попереднього був робочим (стани — з журналу змін статусів, минуле не переписується). Audit не враховується — це тимчасовий робочий статус, а не остаточний відтік.