Разработка системы кэшбэка крипто-казино
Кэшбэк — возврат части проигрышей игроку. Это один из наиболее лояльных к игроку бонусных механизмов: он снижает реальные потери и создаёт "подушку безопасности", стимулирующую продолжение игры.
Модели кэшбэка
Net Loss Cashback — % от чистого проигрыша за период. Пример: 10% кэшбэк. Проиграл $1000, выиграл $700 — чистый проигрыш $300, кэшбэк = $30.
Gross Bet Cashback — % от суммарного объёма ставок, независимо от результата. Редкий формат, используется в VIP программах.
Weekly/Monthly Cashback — расчёт производится по итогам фиксированного периода.
Real-time Cashback — зачисляется немедленно после каждой проигранной ставки. Сложнее в реализации, но лучший UX.
Расчёт кэшбэка
class CashbackCalculator:
async def calculate_period_cashback(
self,
user_id: str,
cashback_config: CashbackConfig,
period_start: datetime,
period_end: datetime,
) -> CashbackResult:
# Загружаем все ставки за период
bets = await self.bet_repo.get_settled_bets(
user_id=user_id,
from_time=period_start,
to_time=period_end,
eligible_games=cashback_config.eligible_games,
)
# Рассчитываем P&L
total_wagered = sum(b.amount for b in bets)
total_won = sum(b.winnings for b in bets if b.result == "WIN")
total_lost = sum(b.amount for b in bets if b.result == "LOSS")
net_loss = total_lost - total_won
if net_loss <= 0:
return CashbackResult(amount=Decimal(0), reason="No net losses")
# Учитываем уже полученные бонусы (исключаем из базы)
bonuses_received = await self.bonus_repo.get_bonuses_in_period(
user_id, period_start, period_end
)
# Некоторые казино уменьшают кэшбэк на полученные бонусы
adjusted_loss = net_loss - sum(b.amount for b in bonuses_received)
if adjusted_loss <= 0:
return CashbackResult(amount=Decimal(0), reason="Losses covered by bonuses")
# Рассчитываем сумму кэшбэка
cashback_amount = adjusted_loss * Decimal(str(cashback_config.percentage / 100))
# Применяем лимиты
if cashback_config.max_cashback:
cashback_amount = min(cashback_amount, cashback_config.max_cashback)
if cashback_config.min_cashback and cashback_amount < cashback_config.min_cashback:
return CashbackResult(amount=Decimal(0), reason="Below minimum cashback threshold")
return CashbackResult(
amount=cashback_amount,
net_loss=net_loss,
total_wagered=total_wagered,
bets_count=len(bets),
)
Конфигурация по VIP уровням
CASHBACK_TIERS = {
"bronze": CashbackConfig(percentage=5, max_cashback=Decimal("100"), wagering=1),
"silver": CashbackConfig(percentage=10, max_cashback=Decimal("500"), wagering=1),
"gold": CashbackConfig(percentage=15, max_cashback=Decimal("2000"), wagering=1),
"platinum": CashbackConfig(percentage=20, max_cashback=None, wagering=0),
}
Автоматическое начисление
class WeeklyCashbackJob:
"""Запускается каждый понедельник для расчёта кэшбэка за предыдущую неделю"""
async def run(self):
period_end = get_last_monday_midnight()
period_start = period_end - timedelta(weeks=1)
# Получаем всех пользователей с активным кэшбэком
eligible_users = await self.user_repo.get_cashback_eligible()
for user in eligible_users:
try:
config = CASHBACK_TIERS[user.vip_level]
result = await self.calculator.calculate_period_cashback(
user.id, config, period_start, period_end
)
if result.amount > 0:
await self.bonus_service.credit_cashback(
user_id=user.id,
amount=result.amount,
period_start=period_start,
period_end=period_end,
wagering_multiplier=config.wagering,
)
except Exception as e:
logger.error(f"Cashback calculation failed for user {user.id}: {e}")
Wagering на кэшбэк
Большинство казино устанавливают wagering requirement на кэшбэк (1x–5x) для защиты от abuse. Игрок не может просто получить кэшбэк и вывести без игры. При VIP уровне "platinum" — часто cashback без wagering, как привилегия.
Важный нюанс: кэшбэк позиционируется как деньги, а не бонус, поэтому wagering requirement должен быть минимальным (1x) для поддержания доверия. Высокие wagering requirements на кэшбэк — плохая репутация для казино.







