Автоматизація виплат і контроль лімітів
Повний текст статті
1) Навіщо автоматизувати виплати
Швидкість і передбачуваність: гравці чекають швидких і прозорих кешаутів.
Ризик і комплаєнс: RG/AML/санкції, velocity і ліміти бренду/гравця/каналу.
Масштаб: піки після турнірів і «гарячих» ефірів - десятки тисяч заявок.
Собівартість: оптимізація комісій та казначейських залишків за PSP/рахунками/мережами.
Ключова мета - одноразова, перевіряється і керована виплата при будь-яких збоях.
2) Рольова модель payout-ядра
Payout Orchestrator - статусна машина і саги: приймає заявки, перевіряє ліміти і правила, маршрутизує, ретраїть, фіксує результат.
Risk & Compliance - RG/AML/KYT, санк-скринінг, «чотири ока».
Treasury - резерви по каналах, управління залишками, хеджування.
Wallet/Ledger - джерело істини балансу; дебет/компенсації тільки через нього.
PSP/Банк/Кастоді/Крипто-процесор - фінальний виконавець.
3) Еталонний флоу виплати (state machine)
1. request → заявка від фронту/CRM/API.
2. precheck → RG/AML: самовиключення/ліміти втрат/часу, санк-листи/РЕР, KYT (для крипто/гаманців), KYC-статус.
3. limits → перевірка velocity і лімітів: per player/brand/region/method (добові/тижневі/місячні).
4. deduct → ідемпотентний'wallet. debit` (или `hold`→`commit`) с `X-Idempotency-Key`.
5. route → вибір каналу/мерчанта/мережі (правила + вартість + конверсія + доступність).
6. submit → відправка в PSP/банк/кастоді (mTLS + підписи).
7. await_settlement → очікування підтвердження ('settled '/' failed') по вебхуку або pull-перевірці.
8. notify → події в шину/BI, гравцеві - статус/ЕТА.
9. reconcile → звірка звітів PSP/банку/ланцюга з Ledger.
10. compensate → при'failed'- повернення в Ledger (ідемпотентно), перевибор каналу, ескалація.
Інваріанти:- Баланс змінюється тільки через Ledger.
- «Втрачених/дубльованих виплат» = 0 - забезпечується ідемпотентністю і дедупом.
- Всі переходи - атомарно логуються і трасуються («trace _ id», «payout _ id»).
4) Ліміти і velocity: як рахувати правильно
4. 1 Типи лімітів
Регуляторні/RG: денні/тижневі ліміти висновків, самовиключення, охолодження.
Фрод/velocity: сума/кількість транзакцій, частота заявок, зміна реквізитів, пристрої/ASN/гео.
Касові: ліміти каналу/мерчанта/рахунку/мережі, залишки казначейства.
Операційні: пороги «ручного рев'ю» і «чотирьох очей» (VIP/великі суми).
4. 2 Сховище та реалізація
Розподілені лічильники (Redis + TTL + Lua/atomic) на вікна 1h/24h/7d.
Проекції в OLAP для просунутих правил (ковзні вікна, патерни).
Ідемпотентність лічильників: збільшення тільки при переході заявки в'submitted'.
Explainability: для кожної відмови - код причини і «який ліміт спрацював».
5) Оркестрація каналів (PSP/банки/крипто)
5. 1 Роутинг
Правила з гео, валюти, суми, швидкості, вартості, ризику, доступності, таборів SLO.
Каскади: PSP1→PSP2 при відмові; для крипто - мережа A→B.
A/B і bandit-підхід для оптимізації конверсії і ціни.
5. 2 Канально-специфічні особливості
Картки/банки: статусні машини «submitted→processing→settled», повернення/відкати за схемами (SEPA/SWIFT).
E-wallets: миттєві, але суворі ліміти і санк-скринінг.
Крипто: on-chain фінальність (N підтверджень), адресний KYT, Travel Rule між VASP, білі списки адрес, МРС/мультисиг, газ-менеджмент.
6) Безпека та комплаєнс
mTLS + OAuth2/підписи на всіх S2S, ключі per brand/region, токени короткоживучі і прив'язані до каналу.
КУС/КУТ/санк-скринінг до'submit'; для крипто - ризик-скор адреси/tx.
RBAC/ABAC і «чотири ока» на ручні дії/порогові суми.
WORM-аудит: незмінні журнали змін лімітів/правил/порогів і ручних втручань.
PII/резидентність: дані і логи - по регіонах, шифрування at-rest/in-transit, RLS.
7) Ідемпотентність і саги (грошові шляхи)
Кожна записуюча операція несе'X-Idempotency-Key'; повтор → той же результат (200 зі старим body).
Сага `deduct→submit→settled`:- якщо'submit'впав - компенсація ('wallet. release/credit`).
- якщо'settled'не прийшов - ретраї/переопитування, дедуп по'payout _ id'.
- Ніяких ручних правок балансів - тільки компенсуючі події.
8) API-контракти (еталонні фрагменти)
Створити заявку
POST /v1/payouts
Headers: X-Idempotency-Key: po_001, X-Trace-Id: tr_a1b2
{
"player_id":"p_123",  "amount":{"amount":250. 00,"currency":"EUR"},  "method":"sepa",  "destination":{"iban":"DE89..."},  "metadata":{"brand_id":"A","region":"EU"}
}
→ 202 {"payout_id":"po_001","status":"REQUESTED","eta":"2025-10-23T18:00:00Z"}Вебхук від PSP/банку/кастоді
POST /webhooks/payouts
X-Signature: sha256=...
{
"event_id":"uuid",  "payout_id":"po_001",  "psp_ref":"psp_77",  "status":"SETTLED",  "occurred_at":"2025-10-23T16:21:05Z"
}Зняття hold/компенсація
POST /v1/payouts/po_001/compensate
Headers: X-Idempotency-Key: po_001_comp
→ 200 {"status":"COMPENSATED"}9) Спостережуваність і SLO
SLO (орієнтири):- `payout. request→submit'p95 ≤ 120-300 мс (внутрішній шлях),'submit→settled'p95: карти/ewallet ≤ 5-30 хв, банки SEPA ≤ T + 0/T + 1, крипто ≤ 10 хв (по мережі), «втрачених/дубльованих виплат» = 0.
- latency p50/p95/p99 за стадіями, error-rate (бізнес/4хх/5хх), retry storms, queue/DLQ lag, success-rate за каналами, cost per success, відмова за кодами PSP/банків, ліміт-спрацювання (RG/AML/velocity).
- Трейсинг: OpenTelemetry (edge→limits→wallet→router→PSP),'trace _ id'у вебхуках.
- Алерти: breach SLO, зростання'IDEMPOTENCY _ MISMATCH', стрибок'missing _ platform'на звірці, падіння success-rate в конкретному гео/каналі.
10) Казначейство та залишки
Резерви по каналах/мерчантах/мережах, автоматичний ребаланс.
Політики порогів: мінімуми і максимуми на рахунках/гаманцях, «останів нових виплат» при недофінансуванні.
Хеджування валют/крипто, облік комісій і курсових різниць.
Фінансові вітрини: план-факт, вартість виведення по каналу, aging «підвислих» виплат.
11) Reconciliation (звірка)
Щоденні звіти PSP/банків/кастоді/ланцюгів → нормалізація → зіставлення з реєстром'payouts'і записами Ledger.
Категорії: `match`, `timing`, `missing_psp`, `missing_platform`, `amount_mismatch`.
Авто-правила для'timing', тікети на'mismatch', алерти по порогах.
Для крипто - зіставлення по'txid/network/confirmations'.
12) Хаос-практики і DR
Падіння PSP/банку: каскад на альтернативу, режим'pause new payouts'для каналу.
Затримка вебхуків: періодичний pull-статусів, дедуп по'event _ id'.
Регіональний outage: актив-пасив/актив-актив (RPO ≤ 5 хв, RTO ≤ 30 хв).
Газ-шипки/реорги (крипто): динамічний fee, доп. підтвердження, відкладені низькопріоритетні виплати.
13) Чек-листи
Платформа/оператор
- Ідемпотентність на'wallet. debit/credit/compensate`, `X-Idempotency-Key` везде.
- Velocity/RG/AML/KYT/санк-скринінг до'submit'.
- Роутинг і каскади каналів, ключі/сертифікати per brand/region.
- WORM-аудит лімітів/правил/ручних дій, «чотири ока» на пороги.
- SLO-дашборди і алерти, OpenTelemetry, DLQ для вебхуків.
- Щоденна звірка T + 1, вітрини mismatch, ескалації.
- Казначейські пороги та авто-ребаланс; стоп-моди ('no new payouts').
- DR/xaoc-навчання: падіння PSP/банку/мережі, затримки/дублі вебхуків.
Провайдер/PSP/банк/кастоді
- Підписані вебхуки (HMAC/EdDSA) + timestamp/nonce, гарантія повторної доставки до 2xx.
- Нормалізовані коди причин відмови, звіти T + 1, цілісність файлів (хеш/PGP).
- Доступні статусні API для pull-перевірок.
14) Анти-патерни (червоні прапори)
Дебет/кредит балансу по вебхуку без явної команди в Ledger.
Відсутність ідемпотентності → подвійні списання/компенсації.
Загальні ключі/сертифікати на кілька брендів/регіонів.
Velocity-ліміти вважаються «за заявкою», а не за підтвердженими відправками.
Ручні правки статусів виплат/балансів в БД.
Немає DLQ/дедупа для вебхуків → «залиплі» статуси.
Відсутність T + 1 звірки; ручні Excel-сумісники.
Крипто-висновки без КУТ/білих списків/багатофакторних підтверджень.
15) Підсумок
Автоматизація виплат - це оркестрація грошей і ризиків: жорсткі ліміти і velocity, ідемпотентні грошові команди, розумний роутинг каналів, комплаєнс «за замовчуванням», спостережуваність і щоденна звірка. Такий payout-конвеєр платить швидко і один раз, стійкий до збоїв і піків, прозорий для гравця, регулятора і фінансової звітності - і при цьому контролює вартість і ризики казначейства.
