Crypto Casino Referral Program Development
A referral program turns existing players into a channel for attracting new ones. In a crypto casino, this is especially effective: the crypto community is active on social networks and messengers, and trust in recommendations from real users exceeds advertising.
Referral Program Models
CPA (Cost per Acquisition) — fixed payment for each referred player who makes a deposit. Simple for the user, clear result.
Revenue Share — a percentage of losses (GGR) from referred players. Passive income, encourages referring quality active players.
Hybrid — combination of CPA + Rev Share. CPA is paid immediately, rev share — continuously.
Tier-based — if a referred player brings someone themselves, the upper level also gets a percentage.
Technical Implementation
class ReferralService:
async def generate_referral_code(self, user_id: str) -> str:
"""Generate unique referral code"""
# Short code based on user_id + random suffix
code = base62_encode(int(user_id.replace('-', ''), 16) % 1_000_000_000)
code = code[:8].upper()
# Check uniqueness
while await self.ref_repo.code_exists(code):
code = generate_random_code(8)
await self.ref_repo.save_code(user_id, code)
return code
async def register_referral(self, new_user_id: str, referral_code: str):
"""Link new user to referrer"""
referrer = await self.ref_repo.get_by_code(referral_code)
if not referrer:
return # Invalid code, ignore silently
if referrer.user_id == new_user_id:
return # Cannot refer oneself
# Check self-referral through device fingerprint / IP
if await self.is_same_user_likely(referrer.user_id, new_user_id):
await self.flag_suspicious(referrer.user_id, new_user_id, "POSSIBLE_SELF_REFERRAL")
return
await self.ref_repo.save_referral(
referrer_id=referrer.user_id,
referred_id=new_user_id,
code_used=referral_code,
)
async def on_qualifying_deposit(self, user_id: str, deposit_amount: Decimal):
"""Called when referral makes first deposit"""
referral = await self.ref_repo.get_referral(referred_id=user_id)
if not referral or referral.cpa_paid:
return
program = await self.get_active_program()
# Check minimum deposit for CPA
if deposit_amount < program.min_deposit_for_cpa:
return
# Pay CPA
await self.pay_cpa(
referrer_id=referral.referrer_id,
referred_id=user_id,
amount=program.cpa_amount,
deposit_amount=deposit_amount,
)
await self.ref_repo.mark_cpa_paid(referral.id)
async def calculate_monthly_rev_share(self):
"""Monthly revenue share calculation"""
program = await self.get_active_program()
month_start = get_last_month_start()
month_end = get_last_month_end()
referrers = await self.ref_repo.get_active_referrers()
for referrer_id in referrers:
referred_users = await self.ref_repo.get_referred_users(referrer_id)
total_ggr = Decimal(0)
for referred_id in referred_users:
user_ggr = await self.bet_repo.get_ggr(
user_id=referred_id,
from_time=month_start,
to_time=month_end,
)
total_ggr += user_ggr
if total_ggr <= 0:
continue # No casino profit from these players
rev_share = total_ggr * Decimal(str(program.rev_share_pct / 100))
# Apply negative carryover (controversial in the industry)
if program.negative_carryover:
# If last month had negative GGR — carryover loss
prev_balance = await self.revshare_repo.get_balance(referrer_id)
if prev_balance < 0:
rev_share = rev_share + prev_balance
if rev_share < 0:
await self.revshare_repo.update_balance(referrer_id, rev_share)
continue
if rev_share > 0:
await self.pay_rev_share(referrer_id, rev_share, month_start)
Affiliate Dashboard
Referrers need a dashboard:
My Referrals: 47 players
Conversion: 23% (from 204 clicks → 47 deposits)
Total Earned: 0.85 BTC
This Month:
New Players: 8
CPA: 0.04 BTC
Revenue Share: 0.023 BTC
Total: 0.063 BTC
Top Players (anonymous):
Player #A1: 0.008 BTC GGR
Player #B3: 0.006 BTC GGR
...
Individual player activity details are hidden (privacy), but the affiliate sees aggregated data.
Fraud Prevention
Referral fraud is a common problem: creating fake accounts for CPA payouts.
- Device fingerprint — one device, multiple accounts
- IP restrictions — limit new accounts from one IP
- Wagering threshold — CPA is paid not for deposit, but for reaching WR
- Delayed payouts — payment 30 days after deposit
- Manual review — abnormally high conversion (> 50%) requires verification







