Розробка системи кешбеку крипто-казино
Кешбек — повернення частини програшів гравцю. Це один із найлояльніших до гравця бонусних механізмів: він зменшує реальні втрати та створює "подушку безпеки", яка стимулює продовження гри.
Моделі кешбеку
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) для захисту від зловживання. Гравець не може просто отримати кешбек і вивести без гри. На рівні VIP "platinum" — часто кешбек без wagering як привілегія.
Важливий нюанс: кешбек позиціонується як гроші, а не бонус, тому wagering requirement повинен бути мінімальним (1x) для збереження довіри. Високі wagering requirements на кешбек — погана репутація для казино.







