Crypto Casino Rakeback System Development
Rakeback is a refund of a portion of commission (rake) that the casino takes from each bet. In poker, this is literally rake from each hand; in casino games — an equivalent calculated from the theoretical house edge. For high-volume players, rakeback significantly affects overall profitability.
How Rakeback is Calculated
Poker Rake — straightforward: casino takes 5% of each pot (with a cap). 30% rakeback = player gets back 30% of paid rake.
Casino Rakeback — in slots and table games, "rake" = theoretical house edge × bet amount. If a slot has 96% RTP, then house edge = 4%. $100 bet → theoretical casino rake = $4. 20% rakeback = $0.80 return.
class RakebackCalculator:
# Theoretical house edge by game category
HOUSE_EDGE = {
"slots": 0.04, # 4% (100 - 96% RTP)
"blackjack": 0.005, # 0.5% with optimal strategy
"roulette_euro": 0.027, # 2.7%
"roulette_american": 0.053,
"baccarat": 0.012,
"poker_casino": 0.03,
"crash": 0.01, # depends on specific game
}
def calculate_theoretical_rake(self, bet: Bet, game_category: str) -> Decimal:
edge = self.HOUSE_EDGE.get(game_category, 0.03)
return bet.amount * Decimal(str(edge))
async def calculate_rakeback_for_period(
self,
user_id: str,
from_time: datetime,
to_time: datetime,
rakeback_pct: float,
) -> Decimal:
bets = await self.bet_repo.get_settled_bets(user_id, from_time, to_time)
total_theoretical_rake = Decimal(0)
for bet in bets:
category = await self.game_repo.get_category(bet.game_id)
theoretical_rake = self.calculate_theoretical_rake(bet, category)
total_theoretical_rake += theoretical_rake
return total_theoretical_rake * Decimal(str(rakeback_pct / 100))
Accrual Frequency
Instant Rakeback — accrued after each bet. Best UX, but high system load. Implemented through batch processing every N minutes.
Daily Rakeback — accrued once a day. Balance between UX and performance.
Weekly Rakeback — standard for most casinos.
class InstantRakebackProcessor:
BATCH_INTERVAL = 60 # seconds
MIN_RAKEBACK = Decimal("0.001") # minimum amount for accrual
async def process_batch(self):
"""Process accumulated rakeback every minute"""
pending = await self.rakeback_repo.get_pending_amounts()
for user_id, pending_amount in pending.items():
if pending_amount < self.MIN_RAKEBACK:
continue
user = await self.user_repo.get(user_id)
rakeback_pct = VIP_CONFIGS[user.vip_level].rakeback_pct
rakeback_amount = pending_amount * Decimal(str(rakeback_pct / 100))
async with self.db.transaction():
await self.balance_service.credit(
user_id=user_id,
amount=rakeback_amount,
currency="BTC", # or native bet currency
type="RAKEBACK",
reference=f"RB:{datetime.utcnow().strftime('%Y%m%d%H%M')}",
)
await self.rakeback_repo.clear_pending(user_id, pending_amount)
Rakeback vs Cashback: The Difference
| Parameter | Rakeback | Cashback |
|---|---|---|
| Calculation basis | Theoretical house edge | Actual losses |
| Depends on result | No (always paid) | Yes (only on loss) |
| Size on loss | Usually lower | Higher |
| Predictability | High | Medium |
| Applicability | Poker, high-volume | All game types |
Rakeback is preferable for professional players with high volume and stable results. Cashback — for casual players who value protection against large losses.
Combination of both mechanisms — standard for a full-fledged crypto casino loyalty program.







