Розробка системи бонусів крипто-казино
Система бонусів — ключовий інструмент привернення та утримання гравців крипто-казино. Welcome бонуси, reload бонуси, вільні обертання — все це потребує точного обліку wagering requirements та захисту від зловживань.
Типи бонусів
Welcome Bonus — бонус за перший депозит. Стандартна формула: 100% match до 1 BTC + X вільних обертань. Wagering requirement: 35-40x від суми бонусу.
Reload Bonus — регулярні бонуси на повторні депозити. Менший розмір, стимулює активність.
No-Deposit Bonus — бонус без депозиту для нових користувачів. Маркетинговий інструмент, жорсткі wagering requirements.
Cashback — відсоток від програшів повертається гравцю. Зменшує ризик, підвищує лояльність.
Модель даних
class Bonus(BaseModel):
id: str
user_id: str
template_id: str # посилання на тип бонусу
type: str # 'DEPOSIT_MATCH', 'FREE_SPINS', 'CASHBACK', 'NO_DEPOSIT'
status: str # 'PENDING', 'ACTIVE', 'WAGERING', 'COMPLETED', 'EXPIRED', 'CANCELLED'
# Суми
bonus_amount: Decimal # виданий бонус
deposit_amount: Decimal # сума депозиту (для match бонусів)
wagering_requirement: Decimal # скільки потрібно поставити
wagered_amount: Decimal # скільки поставлено
locked_funds: Decimal # бонусні кошти, заблоковані до виконання wagering
# Обмеження
eligible_games: list[str] # список ігор, де засчитується wagering
contribution_pct: dict[str, float] # {'slots': 100, 'blackjack': 10, 'roulette': 20}
max_bet_while_bonus: Decimal # максимальна ставка при активному бонусі
expires_at: datetime
# Джерело
triggered_by: str # 'DEPOSIT', 'PROMO_CODE', 'REFERRAL', 'VIP_REWARD'
promo_code: Optional[str]
Відстеження Wagering
class WageringTracker:
async def on_bet_settled(self, bet: BetResult):
"""Викликається при кожній закритій ставці"""
# Отримуємо активні бонуси користувача
active_bonuses = await self.bonus_repo.get_active_bonuses(bet.user_id)
for bonus in active_bonuses:
if not self.is_bet_eligible(bet, bonus):
continue
# Розраховуємо вклад цієї ставки у wagering
contribution_pct = bonus.contribution_pct.get(bet.game_type, 100.0)
wagered = bet.amount * Decimal(str(contribution_pct / 100))
# Перевіряємо ліміт ставки
if bonus.max_bet_while_bonus and bet.amount > bonus.max_bet_while_bonus:
# Ставка перевищила ліміт — порушення умов
await self.cancel_bonus_for_violation(bonus, reason="MAX_BET_EXCEEDED")
continue
async with self.db.transaction():
bonus.wagered_amount += wagered
if bonus.wagered_amount >= bonus.wagering_requirement:
await self.complete_bonus(bonus)
else:
await self.bonus_repo.update_wagered(bonus.id, bonus.wagered_amount)
async def complete_bonus(self, bonus: Bonus):
"""Виконання wagering requirement — розблокування коштів"""
async with self.db.transaction():
# Розблокуємо бонусні кошти
await self.balance_service.unlock_funds(
user_id=bonus.user_id,
currency="BTC",
amount=bonus.locked_funds,
reference=f"BONUS_COMPLETE:{bonus.id}",
)
bonus.status = "COMPLETED"
await self.bonus_repo.save(bonus)
await self.notifier.send_bonus_complete(bonus.user_id, bonus.locked_funds)
Захист від зловживання бонусами
Bonus hunters — реальна проблема для казино. Вони беруть бонуси, виконують wagering з мінімальним ризиком (рівні ставки на чорне/червоне в рулетці) та виводять кошти.
Обмеження по іграм — забороняємо виконувати wagering у low-edge іграх. Лише слоти (100% вклад), настільні ігри з високим розширенням дому.
Max bet rule — не можна ставити більше €5-10 при активному бонусі.
IP/Device fingerprinting — кілька аккаунтів з одної IP/пристрою — блокування бонусів.
Velocity checks — занадто швидке виконання wagering потребує перевірки.
Linked account detection — виявлення пов'язаних аккаунтів для отримання welcome бонусу кілька разів.
| Тип нарушення | Дія |
|---|---|
| Перевищено максимальну ставку | Скасування бонусу |
| Кілька аккаунтів | Блокування всіх аккаунтів |
| Зловживання eligible іграми | Перерахунок вкладу wagering |
| Chargeback | Скасування всіх бонусів + блокування |







