Автоматизация выплат и контроль лимитов
Полный текст статьи
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: самоисключение/лимиты потерь/времени, санк-листы/PEP, 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, игроку — статус/ETA.
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, белые списки адресов, MPC/мультисиг, газ-менеджмент.
6) Безопасность и комплаенс
mTLS + OAuth2/подписи на всех S2S, ключи per brand/region, токены краткоживущие и привязаны к каналу.
KYC/KYT/санк-скрининг до `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 (бизнес/4xx/5xx), 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/хаос-учения: падение PSP/банка/сети, задержки/дубли вебхуков.
Провайдер/PSP/банк/кастоди
- Подписанные вебхуки (HMAC/EdDSA) + timestamp/nonce, гарантия повторной доставки до 2xx.
- Нормализованные коды причин отказа, отчёты T+1, целостность файлов (хеш/PGP).
- Доступные статусные API для pull-проверок.
14) Анти-паттерны (красные флаги)
Дебет/кредит баланса по вебхуку без явной команды в Ledger.
Отсутствие идемпотентности → двойные списания/компенсации.
Общие ключи/сертификаты на несколько брендов/регионов.
Velocity-лимиты считаются «по заявке», а не по подтверждённым отправкам.
Ручные правки статусов выплат/балансов в БД.
Нет DLQ/дедупа для вебхуков → «залипшие» статусы.
Отсутствие T+1 сверки; ручные Excel-совместители.
Крипто-выводы без KYT/белых списков/многофакторных подтверждений.
15) Итог
Автоматизация выплат — это оркестрация денег и рисков: жёсткие лимиты и velocity, идемпотентные денежные команды, разумный роутинг каналов, комплаенс «по умолчанию», наблюдаемость и ежедневная сверка. Такой payout-конвейер платит быстро и один раз, устойчив к сбоям и пикам, прозрачен для игрока, регулятора и финансовой отчётности — и при этом контролирует стоимость и риски казначейства.
