Все статьи

Финтех в ПВТ: биллинг и анти-казино фильтры без ошибок

Если делаешь финтех для резидента ПВТ, льгота по оффшорному сбору выглядит как подарок, пока не доходит до реальных списаний за AWS, OpenAI, Twilio и другие зарубежные сервисы. Разбираю, как я бы строил биллинг и фильтры транзакций, чтобы продукт не спорил ни с бухгалтерией, ни с новыми ограничениями по онлайн-казино в Беларуси.

ПВТ многие до сих пор воспринимают как магическую кнопку: получил статус резидента — и дальше можно спокойно оплачивать зарубежные серверы, API и SaaS-подписки без лишних вопросов. На практике я вижу другую картину. Льгота работает, но финтех-продукту этого мало. Если в биллинге нет нормальной структуры расходов, если платёж в Stripe Atlas, AWS или OpenAI проходит как “что-то там за облако”, если нет внятной трассировки от инвойса до проекта, у тебя появляется не техническая, а управленческая дыра. А с 11 марта 2026 года добавился ещё один слой реальности: в Беларуси вступили в силу новые правила по игорному бизнесу, и платежные сценарии, связанные с иностранными онлайн-казино, стали жёстко ограничиваться на уровне самих операций по картам.

Где здесь реальная выгода ПВТ

У резидентов ПВТ действительно есть льгота по оффшорному сбору. Это прямо перечислено и на официальной странице ПВТ о преимуществах и льготах, и на странице Министерства экономики о ПВТ. Основа режима — Декрет №8 «О развитии цифровой экономики», который вообще сделал ПВТ не просто льготной площадкой, а отдельной инженерной средой для продуктовых и сервисных IT-команд.

Но тут есть важный практический момент. Сам факт льготы не превращает любой зарубежный расход в “безопасный по умолчанию”. Я бы не строил продукт так, будто бухгалтерия всё потом разберёт руками. В реальной компании именно биллинг-слой должен быстро отвечать на простые вопросы:

  • за что именно ушли деньги;
  • к какому продукту, клиенту или внутреннему сервису относится расход;
  • кто санкционировал покупку;
  • какой договор, инвойс или подписка лежит под этой операцией;
  • почему этот расход вообще логичен для деятельности компании.

Если ответ на любой из этих пунктов ищется по письмам, PDF и скриншотам из банка, значит у тебя не биллинг, а архив хаоса.

Как я бы строил биллинг для зарубежной инфраструктуры

Когда продукт живёт на зарубежной инфраструктуре, я почти всегда разделяю расходы минимум на четыре слоя: compute, data, communication и external tooling.

Примерно так:

  • compute: AWS, Google Cloud, DigitalOcean, Hetzner;
  • data: managed PostgreSQL, S3-compatible storage, vector DB, backup providers;
  • communication: Twilio, Mailgun, SendGrid, SMS и voice;
  • external tooling: OpenAI, Anthropic, GitHub, monitoring, CI/CD, design tools.

Дальше каждому платежу нужны не просто реквизиты банка, а нормальные машинно-читаемые атрибуты: vendor, contract_ref, invoice_ref, project_code, cost_center, environment, service_type, beneficiary_country, approved_by. Без этого потом невозможно быстро собрать картину, почему конкретный зарубежный расход появился и к чему он относится.

Я бы хранил такие события отдельно от бухгалтерской выгрузки — в операционном ledger, который умеет связывать банк, карточный платёж, инвойс и внутренний сервис. Условно так:

TypeScript
type ForeignExpense = {
  id: string
  vendor: 'aws' | 'gcp' | 'openai' | 'twilio' | 'other'
  amount: number
  currency: 'USD' | 'EUR' | 'GBP'
  invoiceRef: string
  contractRef?: string
  projectCode: string
  costCenter: 'platform' | 'client-work' | 'r&d' | 'ops'
  serviceType: 'hosting' | 'api' | 'communication' | 'software'
  beneficiaryCountry: string
  paymentMethod: 'corporate-card' | 'bank-transfer'
  approvedBy: string
  paidAt: string
}

Это не “юридическая норма в коде”, а инженерная дисциплина. Но именно она позволяет потом объяснить, почему платёж в OpenAI — это расход продукта X, а не абстрактная внешняя подписка, купленная непонятно кем. Для резидента ПВТ такая объяснимость стоит дорого просто потому, что льготный режим без хорошего учёта быстро превращается в лишние вопросы со стороны финблока и аудиторов.

Что ломает систему чаще всего

Обычно не закон ломает продукт, а лень на этапе проектирования.

Я чаще всего вижу четыре типовые ошибки.

Первая: одна корпоративная карта на всё. Ей платят и за прод, и за тестовые аккаунты, и за срочную покупку домена, и за случайную подписку на сервис, который через месяц уже никому не нужен.

Вторая: инвойсы живут отдельно от системы. В итоге разработчики знают, откуда взялся расход, а бухгалтерия — нет.

Третья: нет разделения между своими продуктами и аутсорсными клиентскими расходами. Через полгода у тебя уже никто не понимает, где внутренний R&D, а где инфраструктура клиента.

Четвёртая: нет события “approved” в принципе. Платёж существует, потому что карта не была заблокирована банком. Для стартапа это звучит знакомо, но для нормального финтеха так жить нельзя.

Что поменялось по онлайн-казино и почему это касается не только казино

Самый недооценённый кусок темы — игорное регулирование. Многие читают Указ Президента №226 «О деятельности в сфере игорного бизнеса» как документ для казино и букмекерок. Это слишком узкий взгляд.

По официальному сообщению МНС от 6 февраля 2026 года и последующей публикации МНС/БЕЛТА после вступления норм в силу, с 11 марта 2026 года физлица — граждане Беларуси не могут перечислять деньги в пользу иностранных онлайн-казино: банки-эмитенты карточек должны отказывать в таких операциях. Параллельно уточнён порядок работы отрасли через постановление Совмина №764 от 24 декабря 2025 года.

Для меня здесь важен не только сам запрет. Важен инженерный вывод: если ты делаешь кошелёк, платёжный кабинет, карту, top-up flow, P2P-платформу или любую систему, через которую пользователь двигает деньги наружу, тебе уже нельзя мыслить только категориями “успешный платёж / неуспешный платёж”. У тебя должен быть слой оценки назначения операции.

И это не история про один MCC-код. Если ограничиться только MCC, продукт будет либо слепым, либо начнёт банить нормальные операции. Я бы делал фильтр из нескольких сигналов сразу: merchant descriptor, acquiring country, BIN-паттерны, whitelist/denylist контрагентов, тип канала пополнения, повторяемость операций, устройство, история аккаунта.

Как выглядит анти-казино фильтр в нормальном продукте

Я бы разбил такой фильтр на пять этапов.

1. Нормализация платёжных данных

Сначала ты приводишь к общему виду всё, что приходит из банка, PSP или процессинга: descriptor, merchant name, MCC, country, acquirer, channel, tokenized card id, wallet id.

2. Правила жёсткой блокировки

Потом идёт слой deny rules. Например, если контрагент уже есть в внутреннем чёрном списке или совпадает с известным паттерном иностранного gambling-мерчанта, операция сразу уходит в reject.

TypeScript
function shouldReject(tx: Tx): boolean {
  if (tx.country !== 'BY' && tx.riskTags.includes('foreign_gambling')) return true
  if (tx.mcc && BLOCKED_MCC.has(tx.mcc) && tx.direction === 'topup') return true
  if (DENYLIST_MERCHANTS.has(tx.normalizedMerchant)) return true
  return false
}

3. Слой “не уверен — не пропускай молча”

Есть операции, которые не выглядят как казино в лоб, но пахнут серой схемой: странный descriptor, слишком много мелких повторных попыток, нет нормального merchant profile, география не бьётся с продуктом. Такие вещи я не пропускал бы автоматически. Их лучше переводить в pending_review или в step-up verification.

4. Аудит-лог решения

Каждое решение по фильтру должно оставлять след: какой rule_id сработал, какие поля пришли, кто потом поменял статус, была ли ручная эскалация. Иначе через месяц ты уже не докажешь, почему именно эта операция была заблокирована, а похожая — прошла.

5. Управление списками и версиями правил

Самая частая архитектурная ошибка — зашить риск-правила прямо в backend и катать релизы ради каждого обновления. Я предпочитаю выносить deny/allow lists и часть rule engine в отдельную конфигурируемую подсистему с версионированием. Тогда compliance-команда и разработка не мешают друг другу.

Где здесь граница между законом и инженерией

Закон не пишет тебе JSON-схему и не диктует названия полей. Закон задаёт ограничения и последствия. Инженерия переводит это в продуктовые решения.

Поэтому я бы разделял две вещи.

Первая — буквальные нормы. Их нужно читать в официальных источниках: Указ №226, постановление №764, разъяснения МНС, официальные материалы о льготах ПВТ. Актуальность лучше перепроверять перед внедрением, потому что такие темы спокойно меняются постановлением или письмом регулятора.

Вторая — собственно архитектура. Тут уже нет одной правильной схемы. Но есть плохие схемы: когда расходы не размечены, фильтры примитивны, а логов нет вообще.

Что это значит на практике

Если ты фрилансер или маленькая студия на аутсорсе, вывод простой: не обещай финтех-клиенту “подключим платежи и дальше разберёмся”. В Беларуси это уже слабый подход. Нужен дизайн логики отказов, логов и маршрутизации расходов сразу.

Если ты CTO резидента ПВТ, смотри на зарубежные платежи не как на бухгалтерскую мелочь, а как на часть продуктовой архитектуры. Хороший ledger по расходам спасает не только налоги, но и дебаг бюджета.

Если ты владелец продукта с картами, кошельками или пополнением баланса, с марта 2026 года игнорировать сценарии, связанные с иностранными онлайн-казино, уже просто рискованно. Даже если твой продукт не про гемблинг, платёжный канал может пересечься с этой зоной.

Если ты разработчик, который делает backend для финтеха, твоя ценность теперь не в том, что ты “поднимешь FastAPI и webhook”. Ценность в том, что ты умеешь превратить требования регулятора в таблицы, очереди, события, reason codes и audit trail.

Мне в этой теме нравится один простой критерий качества: если через полгода можно открыть любой зарубежный инфраструктурный платёж или любую отклонённую транзакцию и за минуту объяснить, что произошло и почему, значит архитектура живая. Если нет — ты просто отложил проблему на потом.

Если нужен такой слой комплаенса в продукте — напиши мне в Telegram или через velutich.com.

VELUTICH.

© 2026 Велютич Дмитрий Игоревич УНП: BE7887089