Velocity-ліміти і анти-аб'юз
1) Що таке velocity і навіщо він потрібен
Velocity-ліміти - це обмеження на частоту і обсяг операцій за задані вікна часу. Мета:- знизити фрод і експлуатацію бонусів/промо,
- захистити платіжну інфраструктуру від «штормів» ретраїв,
- утримати здорову конверсію, переводячи сумнівні спроби в челендж (3DS/SCA) замість «жорсткої відмови» там, де це можливо.
Velocity-контролі доповнюють скоринг, AVS/CVV, 3DS2/SCA і smart-routing.
2) Які сутності лімітувати (scopes)
Проектуйте ліміти на декількох рівнях одночасно:- Платіжні сутності: `card_token` (vault/network), `bin`, `issuer`, `psp_route`.
- Користувацькі: `account_id`, `kyc_level`, `email/phone`.
- Технічні: `device_id` (fingerprint/SDK), `ip`, `asn`, `session_id`.
- Бізнес-контекст: 'bonus _ id','campaign _ id','country','mcc 7995'підтип (депозит/вивід).
- Фінансові: 'amount _ bucket'( мікро/середні/великі),'currency','payment _ method'.
3) Вікна та лічильники
Fixed window (T = 15m/1h/24h) - просто, але чутливо до кордонів.
Sliding window - точніше, вважає по «ковзаючому» інтервалу.
Leaky bucket/Token bucket - згладжують сплески, задають стійку пропускну здатність.
Комбіновані: burst (короткий сплеск) + sustained (довгий потік).
- `device_id`: ≤ 3 спроб авторизації за 15 хвилин, ≤ 10 за 24 години.
- `card_token`: ≤ 2 decline поспіль без 3DS; третій - обов'язковий 3DS.
- `ip`: ≤ 5 унікальних'card _ token'в 1 годину (інакше - капча/блок).
- `account_id`: ≤ 2 скасованих депозитів поспіль; далі - кулдаун 1 година.
4) Алгоритми обмежень (коротко)
Token Bucket (дозволяє bursts):- Ініціалізуйте'capacity'і'refill _ rate'.
- Перед кожною спробою «вийміть» 1 токен; якщо токенів немає - challenge/decline.
- Черга витікає з постійною швидкістю; події переповнюють - throttle.
- 1-й повтор: 2-5 хв → 2-й: 10-20 хв → 3-й: 1-2 год → стоп, або переклад в альтернативний метод.
5) Політики рішень (decisioning)
Класифікуйте результати velocity-перевірок:- Allow: низький ризик, в межах порогів.
- Challenge: перевищили «м'який» поріг → 3DS/SCA/капча/KBA (питання).
- Throttle: тимчасово обмежити (кулдаун) з прозорим UX.
- Decline: грубі порушення (масовий перебір карт, бот-пули, бонус-аб'юз).
- Reroute: зміна PSP/методу (напр., A2A) при сплеску'91/96'у емітента.
Міні-матриця прикладів
'device _ id'спроби ≥ 3 за 15 хв і'cvv = N'≥2 → Decline + капча.
'card _ token'2 soft-decline підряд → 3DS-challenge (обов'язковий).
'ip'≥ 5 унікальних'account _ id'за 30 хв → Throttle 30 хв + KYC-перевірка.
'account _ id'депозит-вивід-депозит за 10 хв (карусель) → Challenge або ліміт за сумою.
6) Velocity для депозитів, ретраїв і висновків
Депозити:- Захищайте «мікро-вкидання» (багато невеликих транзакцій): ліміт на кількість і загальний оборот за T.
- При низці'05 '/' 14 '/' 54'- зупиняйте «перебір» реквізитів, переводьте в 3DS.
- Рознесіть CIT і MIT черги. Для MIT використовуйте м'які вікна T + 1/T + 24h.
- Soft-decline'SCA required'→ негайно 3DS, не паліть спроби.
- Окремі ліміти на суму/частоту: напр., ≤ 2 висновки/24h та ≤ N за сумою/тиждень.
- «Сходи» KYC: чим вище перевірка, тим вище ліміти.
- Детект «circling»: швидкий депозит і миттєвий висновок - manual review/hold.
7) Анти-аб'юз промо і бонусів
Per-campaign caps: 'bonus _ id'≤ X активацій на'device _ id '/' ip '/' payment _ fingerprint'.
«Вилки» (перегін грошей між акаунтами): граф-аналіз загальних карт/IP/пристроїв.
Cool-off windows: після бонус-депозиту - заборона миттєвого виведення, прозорі правила в ToS.
Санкції за рівнями: від тимчасових блокувань до «назавжди», з журналом причин.
8) Архітектура: де жити velocity-правилам
Real-time шлюз (в оркестраторі): рішення ≤ 50-100 мс.
Сховище лічильників: in-memory (Redis/KeyDB) + довготривалі «зведення» (DWH).
Фічестор: єдині вікна/агрегати (15m/1h/24h/7d).
Rule engine + ML скоринг: «safety-net» правила поверх моделі.
Конфіг-прапори: «включити 3DS», «суворіше в регіоні X», «пауза PSP-A».
Ідемпотентність: захист від дублікатів при повторах/таймаутах.
9) Псевдокод правил (ескіз)
pseudo on payment_attempt(ctx):
s = features(ctx) // device/ip/account/bin/score/avs/cvv/history if counter(device, 15m) >= 3 and cvv_fail(device, 15m) >= 2:
return DECLINE(reason="velocity_device_cvv")
if soft_declines(card_token, 1h) >= 2:
return CHALLENGE_3DS()
if uniq_accounts(ip, 30m) >= 5:
return THROTTLE(ttl=30m)
if score > T2 and velocity(account, 1h) > Vmax:
return DECLINE(reason="high_risk_burst")
return ALLOW
10) UX-патерни (не ламаючи конверсію)
Чіткі повідомлення: "Занадто багато спроб за короткий час. Спробуйте через 15 хвилин або підтвердіть у банку".
Кнопка «Повторити пізніше» з таймером.
Пропозиція альтернатив: А2А/локальні гаманці при тротлінгу.
Авто-3DS без повторного введення реквізитів при SCA-soft.
Капча тільки точково (за IP/ASN/бот-сигналами), не до всіх.
11) Комплаєнс і приватність
GDPR/PII: зберігайте мінімальні ідентифікатори (хеші пристроїв, токени карт, last4), прозорі політики.
PCI DSS: ніякого PAN/CVV в логах; velocity-події без чутливих даних.
PSD2/SCA: переводьте перевищення в challenge там, де це доречно, замість тотальних відмов.
12) Метрики, алерти, SLO
KPI:- Approval Rate (загальний і при спрацьовуванні правил).
- False Positive Rate правил velocity (частка чесних блоків → за подальшою легітимністю).
- Число «штормів» ретраїв і середній час відновлення.
- Частка перекладів з decline → challenge з успішним результатом.
- Chargeback rate в сегментах, де спрацювали ліміти (очікуємо ↓).
- Спайк'05/14/54'+ зростання спроб> X за 15 хв в кластері BIN/ASN.
- Сплеск'91/96'→ авто-підвищення порогу T1 + роутинг в PSP-B.ru
- FP-rate правила> цільового (наприклад, 1. 5 × тижневої медіани).
- Рішення по velocity ≤ 100 мс p95.
- Частка успішних платежів, переведених в 3DS замість відмови ≥ цільового.
13) Анти-патерни
Універсальний «тотальний» ліміт для всіх ринків і типів клієнтів.
Блокувати по'AVS = U/S/G'в країнах, де AVS не працює штатно.
Не розділяти CIT/MIT - ламає підписки/повтори.
Ретраїти без jitter і ідемпотентності - дублі і шторми.
Ховати причини відмови - зростає саппорт і токсичність.
14) Чек-лист впровадження
- Карта сутностей (scopes) і вікна (15m/1h/24h/7d).
- Вибір алгоритмів: sliding + token bucket для bursts.
- Нормалізація ретраїв: backoff + jitter, окремо для CIT/MIT.
- Інтеграція з 3DS/SCA: авто-challenge при м'яких перевищеннях.
- Окремі ліміти для висновків і бонусів; граф-перевірки зв'язків.
- Спостережуваність: дашборди KPI/алерти/аудит правил.
- UX-шаблони повідомлень і альтернативні методи.
- Політики PCI/GDPR: токени, маскування, мінімізація PII.
- A/B-тести порогів по ринках/BIN/ASN і профілях клієнтів.
- Плейбуки інцидентів: деградація емітента/PSP, сплеск ботів.
15) Резюме
Ефективні velocity-ліміти - це багаторівневі вікна і лічильники за різними сутностями, алгоритми згладжування (token/leaky bucket), розумні ретраї і тісна зв'язка з 3DS/SCA і скорингом. Такий контур зменшує фрод і аб'юз, не душить конверсію, і допомагає тримати стабільну монетизацію при волатильності емітентів і трафіку.