AI CRM Analytics for iGaming (Segmentation, Retention, Bonus Optimization)

We design and deploy artificial intelligence systems: from prototype to production-ready solutions. Our team combines expertise in machine learning, data engineering and MLOps to make AI work not in the lab, but in real business.
Showing 1 of 1 servicesAll 1566 services
AI CRM Analytics for iGaming (Segmentation, Retention, Bonus Optimization)
Medium
~2-4 weeks
FAQ
AI Development Areas
AI Solution Development Stages
Latest works
  • image_website-b2b-advance_0.png
    B2B ADVANCE company website development
    1212
  • image_web-applications_feedme_466_0.webp
    Development of a web application for FEEDME
    1161
  • image_websites_belfingroup_462_0.webp
    Website development for BELFINGROUP
    852
  • image_ecommerce_furnoro_435_0.webp
    Development of an online store for the company FURNORO
    1041
  • image_logo-advance_0.png
    B2B Advance company logo design
    561
  • image_crm_enviok_479_0.webp
    Development of a web application for Enviok
    822

AI-based CRM analytics system for iGaming

iGaming CRM is player base management based on behavior segmentation, churn prediction, and bonus campaign optimization. The main goal is to retain profitable players without incentivizing problematic behavior and to cost-effectively reactivate the dormant segment.

Segmentation and Value of Players

import pandas as pd
import numpy as np
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.cluster import KMeans

class iGamingPlayerSegmentor:
    """Сегментация по GGR и поведению"""

    def compute_player_value(self, player_data: pd.DataFrame) -> pd.DataFrame:
        """
        GGR (Gross Gaming Revenue) и LTV расчёт.
        GGR = deposits - withdrawals - bonuses_paid
        """
        df = player_data.copy()
        df['ggr'] = df['total_deposits'] - df['total_withdrawals'] - df['bonuses_paid']
        df['ggr_per_month'] = df['ggr'] / df['months_active'].clip(1)
        df['deposit_frequency'] = df['deposit_count'] / df['months_active'].clip(1)
        df['withdrawal_ratio'] = df['total_withdrawals'] / df['total_deposits'].clip(1)

        # LTV прогноз: простая линейная проекция
        df['predicted_ltv_12m'] = df['ggr_per_month'] * 12 * (
            1 - df['churn_probability_30d'].fillna(0.3)
        )

        return df

    def segment_players(self, player_value: pd.DataFrame) -> pd.DataFrame:
        """Сегментация по value и активности"""
        df = player_value.copy()

        ggr_median = df['ggr'].median()
        activity_median = df['sessions_last_30d'].median()

        def classify(row):
            high_ggr = row['ggr'] > ggr_median
            active = row['sessions_last_30d'] > activity_median

            if high_ggr and active:
                return 'champion'
            elif high_ggr and not active:
                return 'at_risk_highvalue'
            elif not high_ggr and active:
                return 'loyal_lowvalue'
            else:
                return 'dormant'

        df['segment'] = df.apply(classify, axis=1)

        return df


class ChurnPredictoriGaming:
    """Churn prediction для iGaming"""

    def __init__(self):
        self.model = GradientBoostingClassifier(
            n_estimators=200, learning_rate=0.05, max_depth=4, random_state=42
        )

    def build_features(self, players: pd.DataFrame) -> pd.DataFrame:
        return pd.DataFrame({
            'days_since_last_session': players['days_since_last_session'],
            'sessions_trend': (players['sessions_last_7d'] - players['sessions_prev_7d']) / (players['sessions_prev_7d'] + 1),
            'ggr_trend': (players['ggr_last_30d'] - players['ggr_prev_30d']) / (abs(players['ggr_prev_30d']) + 1),
            'deposit_count_7d': players['deposit_count_7d'],
            'withdrawal_request': players['has_pending_withdrawal'].astype(int),
            'bonus_expiry_ignored': players['bonus_expiry_ignored'].astype(int),
            'support_complaint': players['has_support_complaint'].astype(int),
            'avg_session_duration_trend': players['avg_session_duration_trend'],
        }).fillna(0)

    def predict(self, players: pd.DataFrame) -> pd.DataFrame:
        X = self.build_features(players)
        probs = self.model.predict_proba(X)[:, 1]
        result = players[['player_id']].copy() if 'player_id' in players.columns else pd.DataFrame(index=players.index)
        result['churn_prob_30d'] = probs
        result['churn_tier'] = pd.cut(probs, bins=[0, 0.2, 0.5, 0.75, 1.0],
                                       labels=['low', 'medium', 'high', 'critical'])
        return result


class BonusCampaignOptimizer:
    """Оптимизация бонусных кампаний"""

    def design_retention_campaign(self, player_segment: str,
                                   player_stats: dict,
                                   budget_per_player: float) -> dict:
        """Бонусное предложение под сегмент и бюджет"""
        campaigns = {
            'champion': {
                'bonus_type': 'cashback_vip',
                'value': min(player_stats.get('avg_weekly_ggr', 50) * 0.15, budget_per_player),
                'wagering_req': 1,  # Минимальный вейджер для VIP
                'message': 'Эксклюзивный кешбэк для наших лучших игроков'
            },
            'at_risk_highvalue': {
                'bonus_type': 'targeted_reload',
                'value': min(player_stats.get('avg_deposit', 100) * 0.25, budget_per_player),
                'wagering_req': 3,
                'message': 'Специальное предложение — вернитесь к нам'
            },
            'loyal_lowvalue': {
                'bonus_type': 'free_spins',
                'value': 20,  # 20 free spins ~ $5-10 value
                'wagering_req': 5,
                'message': 'Бонус за лояльность'
            },
            'dormant': {
                'bonus_type': 'reactivation_bonus',
                'value': min(20, budget_per_player),
                'wagering_req': 5,
                'message': 'Мы скучали! Вот бонус за возвращение'
            }
        }

        campaign = campaigns.get(player_segment, campaigns['loyal_lowvalue'])

        # RG проверка: не выдаём бонусы игрокам с высоким RG-риском
        if player_stats.get('rg_risk_level') == 'high':
            return {'bonus_type': 'none', 'reason': 'RG restriction'}

        return campaign

    def calculate_campaign_roi(self, campaign_results: pd.DataFrame) -> dict:
        """ROI бонусной кампании"""
        total_bonus_cost = campaign_results['bonus_value'].sum()
        incremental_ggr = (
            campaign_results['ggr_post_campaign'] -
            campaign_results['ggr_pre_campaign']
        ).sum()

        return {
            'total_bonus_cost': round(total_bonus_cost, 2),
            'incremental_ggr': round(incremental_ggr, 2),
            'roi_pct': round((incremental_ggr - total_bonus_cost) / max(total_bonus_cost, 1) * 100, 1),
            'reactivation_rate': (campaign_results['returned_to_active'] > 0).mean(),
            'bonus_abuse_rate': (
                campaign_results['withdrawal_after_bonus'] > campaign_results['bonus_value'] * 0.9
            ).mean()
        }

An iGaming CRM with AI segmentation increases the effectiveness of bonus campaigns: ROI increases from 80-120% to 150-250% by targeting the right segments. Key point: the champion segment (5-10% of the base, 50-70% GGR) requires a dedicated manager, not mass emails.