Зниження комісії і затримок: кешування курсів і роутинг платежів
Повний текст статті
1) Мета: платити швидше і дешевше, не втрачаючи контроль над ризиком
Швидкість: менше «холодних» очікувань (3-DS, батчі банку, підтвердження мережі).
Вартість: мінімізувати комісію PSP/банку/мережі та спред конверсії.
Надійність: zero-loss інваріанти: один дебет/кредит, передбачуваний курс.
Комплаєнс: регіональні правила, санк-скринінг, RG/AML до відправки.
2) Сервіс курсів (FX) з кешуванням: Як правильно влаштувати
2. 1 Джерела та калібрування
Прайс-фіди: провайдери ліквідності/FX-API/котирування PSP/кас.
Нормалізація: єдиний формат'pair/base/quote/scale', mid-rate + маржа ('markup _ bps'), час отримання'as _ of'.
Калібрування на PSP: частина PSP повертає «ефективний курс» у відповіді; зберігайте rate cards per метод/PSP/гео.
2. 2 Кеш і TTL
Гарячий кеш (Redis) на часті пари (EUR↔USD, EUR↔GBP, USD↔BRL тощо).
TTL з волатильності: G10 — 30–120 c, EM — 10–30 c; стейбли - 60-300 c (по провайдеру).
Grace window: допуск використання «протухлого» курсу N секунд для завершення вже розпочатих інтентів.
2. 3 Захист від ковзання (slippage)
Клієнту видається тимчасове котирування з'expires _ at'і допускається drift (наприклад, ± 20 bps).
При виконанні:- якщо ринок пішов в межах drift → застосовуємо «заброньований» курс;
- якщо пішов далі → re-quote (повторне підтвердження) або «best-effort» з політики бренду.
- Для висновків - budgeted FX: ліміт витрат на конверсію, транзакція відхиляється при перевищенні.
2. 4 Ідемпотентність і атомарність
Всі FX-операції мають'X-Idempotency-Key', пов'язаний з сумою/парою/типом операції.
Запис в Ledger і фіксація курсу - одна сага: `quote. lock → debit/credit → quote. release`.
Курси в грошових записах зберігаються як minor units + scale, без плаваючої точки.
2. 5 API (еталон)
Отримати котирування (кешоване)
GET /v1/fx/quote? base=EUR"e=USD&side=buy&amount_minor=100000
→ 200 {
"pair":"EUR/USD","rate":"1. 08123","markup_bps":15,  "expires_at":"2025-10-23T12:00:15Z","quote_id":"q_abc"
}Забронювати курс і списати
POST /v1/fx/execute
Headers: X-Idempotency-Key: fx_exec_001
{
"quote_id":"q_abc","amount_minor":100000,"pair":"EUR/USD"
}
→ 200 {"status":"filled","avg_rate":"1. 08125","fx_entry_id":"fx_77"}3) Роутинг платежів: вибрати найшвидший і найдешевший шлях
3. 1 Фактори маршрутизації
Гео/валюта/метод: карта/SEPA/SWIFT/ewallet/крипто.
Комісії: фікс +% + FX-markup, приховані збори PSP/банку.
SLA: p95'submit→settled', success-rate, відмова за кодами.
Cut-off і вікна розрахунків: банки (SEPA T + 0/T + 1), крипто-мережі (навантаження/газ), вихідні.
Ризики: санкції/AML/velocity-ліміти/chargeback-профіль.
Доступність: статус каналів/PSP, ліміти мерчанта, казначейські залишки.
3. 2 Каскади та bandit-стратегії
Deterministic rules для «жорстких» вимог (юрисдикції, ліцензії, сума).
Зверху - ε -greedy/UCB для вибору між декількома відповідними PSP: мінімізуємо'cost _ per _ success'і затримку.
Warm-up на нові канали зі зниженим трафіком + швидка зупинка при деградації.
3. 3 «Розумні» ретраї
Повторюємо тільки retryable-коди (timeouts, transient, bank offline).
Hedged-requests (рідко, обережно): паралельний запуск на 2 PSP зі скасуванням програв - для VIP/критичних сум, якщо юридично допустимо.
Завжди з ідемпотентними токенами PSP, щоб уникнути подвійного списання.
3. 4 Облік розкладів
Календар cut-off (SEPA, SWIFT, локальні схеми), «свята» по країнах.
Scheduler: якщо до cut-off залишилося  3. 5 Крипто-роутинг Вибір мережі по'fee _ per _ byte/throughput/ETA', білі списки адрес і дорожні правила (Travel Rule між VASP). Dynamic gas: розрахунок maxFee/maxPriority, пауза низькопріоритетних виводів при газ-шипках. 3. 6 API (еталон) 4) Неттінг, батчинг і on-us оптимізації On-us (всередині екосистеми): взаєморозрахунок без зовнішнього PSP → нульова комісія, миттєвий SLA. Неттінг: підсумувати дрібні кешаути в один зовнішній переказ (банки/крипто) з детальною проводкою в Ledger. Батчинг: SEPA-файли, крипто-батчі (UTXO consolidation/стейблкоїновий батч) - знижують вартість за рахунок оптового газу/комісій. 5) Телеметрія і SLO, орієнтовані на вартість і швидкість 6) Спостережуваність і аудит Структуровані логи JSON: 'trace _ id','route _ id','payment _ id','psp _ ref','fx _ quote _ id', коди помилок. OpenTelemetry: спани'route. select → fx. quote → wallet. debit → psp. submit → webhook. settled`. WORM-аудит: зміни маржі FX, правил роутингу, пріоритетів, cut-off календаря. 7) Казначейство та залишки Резерви per канал/PSP/мережа, автоматичний ребаланс з урахуванням прогнозів трафіку. Політики мінімальних залишків і стоп-режим «no new payouts» при недофінансуванні. Хедж: авто-своп стейблів/фіата за планом, щоб фіксувати спред. 8) Reconciliation (звірки) і звіти FX-реєстр:    платіж  проводки Ledger. Щоденні звіти PSP/банків/мережі ↔ Ledger: категорії'match/timing/missing/amount _ mismatch'. Окремий звіт FX-PnL: реалізований спред, вартість котирувань, re-quote-втрати. 9) Архітектурні блоки (мікросервіси) fx-service: збір фідів, кеш, слippage-політики, API quote/execute. router-service: правила, bandit-логіка, календар cut-off, стан каналів. treasury-service: залишки, ребаланс, бюджети. payments-orchestrator: саги, ідемпотентність, вебхукі, DLQ. Везде — outbox/CDC, partition-keys по `tenant/brand/region`. 10) Чек-листи 11) Червоні прапори (анти-патерни) Конверсія за «ринковим» курсом без фіксації'quote _ id'і терміну дії. Відсутність slippage-обмежень → негативний сюрприз гравцеві. Роутинг «жорстко вшитий» в код без телеметрії і A/B. Ретраї на ті ж PSP-коди, що не ретраяться (наприклад, hard decline). Ігнор cut-off/календарів → систематичні затримки T + 1 +. Неттинг/батчинг відключені при високих комісіях. Вебхуки без підпису/вікна валідності → реплеї. Немає outbox/CDC → «втрачені» події та розбіжності у звітах. 12) Висновок Зниження комісій і затримок - це не «магічний» один перемикач, а система рішень: кешовані і керовані курси із захистом від ковзання, розумний роутинг з каскадами і bandit-логікою, облік розкладів і залишків, плюс неттінг і батчинг. Додайте ідемпотентність, outbox/CDC, SLO-телеметрію і WORM-аудит - і ваші платежі починають йти швидше, дешевше і один раз, залишаючись прозорими для гравця, фінансів і регулятора.Підбір маршруту
POST /v1/payments/route
{
"amount":{"minor_units":5000,"currency":"EUR"},  "method":"card","geo":"DE","direction":"payout"
}
→ 200 {
"route_id":"rt_001",  "candidates":[
{"psp":"A","eta_sec":420,"cost_minor":85,"success_rate":0. 91},   {"psp":"B","eta_sec":360,"cost_minor":120,"success_rate":0. 96}
],  "recommend":"B"
}Виконання (з ідемпотентністю)
POST /v1/payments/submit
Headers: X-Idempotency-Key: pay_001
{ "route_id":"rt_001","psp":"B", "fx_quote_id":"q_abc" }
→ 202 {"payment_id":"pm_777","status":"SUBMITTED"}
Платформа/оператор
Інтеграції/PSP/провайдери FX
