В любом обычном продукте пользователи находят баги случайно. Бонусная система казино — исключение: здесь баги ищут целенаправленно, методично и ради денег. Ошибка в промо-механике — это не тикет в саппорт, а схема, которая завтра окажется в закрытом Telegram-чате, а через неделю превратится в системный убыток. Я работаю QA Lead в гемблинг-платформе — казино, беттинг, крипто-выплаты — и бонусный модуль стабильно держит первое место по цене пропущенного бага.
Бонус-абьюз — это использование промо-механик казино способом, который даёт игроку гарантированную или почти гарантированную выгоду вопреки замыслу оператора. Основные формы: мультиаккаунтинг ради повторного получения велком-бонусов, отыгрыш вейджера ставками с минимальным риском, эксплуатация ошибок в конфигурации вклада игр и лимитов, злоупотребление отменой транзакций. От честной игры абьюз отличается одним: игрок убирает случайность из уравнения — математическое ожидание становится положительным для него и отрицательным для казино.
Как игроки ломают бонусные системы: реальные схемы
Все схемы ниже я видел вживую — либо в проде, либо пойманными на стенде за неделю до релиза.
Мультиаккаунтинг на велком-бонусы
Самая массовая схема. Велком-бонус выдаётся «один раз на игрока», но игрок для системы — это email, телефон, устройство, IP и платёжный метод. Абьюзер регистрирует десятки аккаунтов: почта с плюс-алиасами (user+1@, user+2@), виртуальные номера, антидетект-браузер, несколько карт одного кошелька.
QA здесь проверяет не «выдался ли бонус», а границы дедупликации: считает ли система user+1@gmail.com и user@gmail.com одним человеком, срабатывает ли сверка по fingerprint устройства и по платёжному инструменту. У нас однажды дедупликация по карте сравнивала токены, которые платёжный провайдер выдавал разными на каждую привязку одной и той же карты. Проверка выглядела рабочей — и не ловила никого.
Отдельный тест-кейс: повторная регистрация после самоисключения или блокировки. Если заблокированный за абьюз игрок может завести новый аккаунт с тем же платёжным методом и снова получить велком-пакет — вся антифрод-цепочка декоративная.
Low-risk отыгрыш: красное и чёрное одновременно
Классика жанра. Вейджер требует поставить x40 от суммы бонуса — но нигде не сказано, что ставки должны быть рискованными. Игрок открывает рулетку и ставит одновременно на красное и чёрное. Проигрыш почти нулевой (страдает только на зеро), а счётчик отыгрыша крутится с обеих ставок.
Зрелые платформы закрывают это через вклад игр: столы дают 5–10% в вейджер или вовсе 0%. Тогда абьюз мигрирует на слоты с минимальной дисперсией, где на дистанции теряешь только house edge. Поэтому проверять надо не факт существования таблицы вкладов, а то, что она реально применяется к каждой игре каталога, — что подводит к следующей схеме.
Игры с нулевым вкладом, которые всё равно учитываются
Самый частый производственный баг из этой серии. В админке у рулетки вклад 0%, но при подключении нового провайдера игра приехала с другим внешним ID и категорией — матчинг не сработал, система не нашла игру в конфиге и применила дефолт: 100%.
Fallback «игра не найдена в таблице — считаем полный вклад» — это подарок абьюзерам; безопасный дефолт — 0%. Ловится это только прогоном по реальному каталогу: берём игры каждого провайдера из каждой категории, делаем ставку с активным бонусом и сверяем прогресс вейджера с ожидаемым вкладом.
Отмена вывода как бесплатный переотыгрыш
Игрок отыграл бонус, создал заявку на вывод — и отменил её. У нас была версия системы, где возвращённые из отменённого вывода средства засчитывались как новый депозит. А на депозит автоматически выдавался релоад-бонус. Цикл: депозит → отыгрыш → заявка на вывод → отмена → «депозит» → новый бонус. Ни копейки своих денег после первого шага.
Отдельно проверяем сам статус денег в pending-выводе: можно ли ими играть, учитываются ли такие ставки в вейджер, что происходит с активным бонусом при создании и отмене заявки.
Конвертация валют с округлением в пользу игрока
Кросс-валютные бонусы: бонус номинирован в EUR, игрок играет в BTC или KZT. Каждая операция — конвертация, каждая конвертация — округление. Если округление стабильно смотрит в сторону игрока, на микроставках разница набегает: тысячи минимальных ставок скриптом через API, каждая приносит долю цента сверху. Руками бессмысленно — автоматизированно окупается.
Второй кейс тут же: курс на момент активации бонуса против курса на момент конверсии выигрыша. На волатильной крипте разница ощутимая, и момент конверсии выбирает игрок. QA проверяет, что курс фиксируется в одной точке жизненного цикла и все последующие расчёты — лимиты, вейджер, конверсия — используют его же, а округление всегда смотрит в сторону казино.
Чеклист тестирования бонусов: что проверяет QA
Это выжимка нашего регрессионного чеклиста бонусного модуля — по разделам.
Вейджер и вклад игр
Вейджер (wagering requirement) — множитель, определяющий, сколько нужно поставить, чтобы бонус стал выводимым: бонус 100 € с вейджером x40 — это 4 000 € ставок. Проверяем точность расчёта прогресса (включая дробные ставки), вклад каждого типа игр — слоты 100%, столы 5–10% или 0%, live-игры по конфигу, — дефолт для игры, отсутствующей в таблице, и раунды, начатые до активации бонуса.
Лимиты: макс-ставка, макс-выигрыш, макс-конверсия
Три лимита, каждый ломается по-своему. Макс-ставка с активным бонусом (типично 5 €): проверяем не кнопку в UI, а прямой API-запрос со ставкой выше лимита — система обязана отклонить его или срезать до лимита, но не молча засчитать в вейджер. Макс-выигрыш с бонусных средств: куда девается превышение. Макс-конверсия — сколько бонусных денег может стать реальными: особенно на стыке валют, где лимит в EUR должен корректно пересчитываться в валюту аккаунта.
Жизненный цикл бонуса
Активация → отыгрыш → конверсия, экспирация или отмена. Проверяем каждую дугу: экспирация ровно в срок — включая таймзону, потому что «до 23:59» в UTC и в таймзоне игрока — это разные бонусы; судьба бонусных средств в открытом игровом раунде в момент экспирации; отмена игроком на середине отыгрыша — бонусные деньги сгорают, реальные остаются, и система не путает, какие есть какие; отмена оператором; депозит и вывод при активном бонусе.
Порядок списания — отдельная строка чеклиста: что тратится первым, реальные деньги или бонусные, и совпадает ли фактическое поведение с тем, что написано в terms. Расхождение здесь — не только баг, но и повод для жалобы регулятору.
Фриспины
Фриспины — отдельный контур: выигрыш с них обычно падает бонусными деньгами со своим вейджером. Проверяем: фриспины, выданные на конкретную игру, нельзя потратить в другой — в том числе прямым API-вызовом; номинал спина соответствует конфигу; недокрученные фриспины при экспирации сгорают корректно; выигрыш попадает в бонусный кошелёк, а не в основной.
Комбинации бонусов
Стакинг — где живут самые дорогие баги. Два активных бонуса: в чей вейджер идёт ставка? Проверяем приоритет и очередность отыгрыша, запрет несовместимых комбинаций из конфига, поведение при активации второго бонуса поверх первого. Кейс из практики: ставка засчитывалась в прогресс обоих активных бонусов одновременно — эффективный вейджер уменьшался вдвое.
Параллельные запросы
Всё, что я писал про race condition при выводе средств, в бонусах верно вдвойне: два параллельных запроса на активацию одного промокода, одновременные отмена бонуса и ставка, конверсия бонуса в два потока. И главное правило раздела: абьюзер не пользуется UI — он шлёт запросы напрямую в API. Поэтому каждое бонусное ограничение проверяем на бэкенде, а не в задизейбленных кнопках.
Бонусная система — то место, где QA перестаёт быть проверкой требований и становится игрой против мотивированного противника. Требования описывают, как должно работать; абьюзер выясняет, как работает на самом деле, — и тестировать бонусы нужно из его позиции: с калькулятором матожидания и прямым доступом к API. Следующая линия обороны после промо — деньги на выходе: продолжить стоит с чеклиста платёжных систем.