Стандартна програма лояльності «купив на 1000 — отримай 10 балів» перестала працювати: клієнти очікують індивідуальних умов, бізнес втрачає бюджет на неефективні акції. Наша AI-система персоналізації вирішує цю проблему: використовує історію покупок, поведінкові патерни та LLM для генерації унікальних пропозицій кожному клієнту. Промислові впровадження показують зростання утримання на 40-60% та збільшення частоти покупок на 25-35%.
В основі лежить комбінація gradient boosting (XGBoost/LightGBM) для скорингу пропозицій та ансамблю LLM (Claude 3.5, GPT-4) для генерації описів. Модель engagement оцінена з ROC-AUC >0.85 на CV. Інтеграція через REST API з гарантованою затримкою P99 <200 мс. Сертифікація PCI DSS та GDPR — входить до складу робіт. Отримайте консультацію — оцінимо ваш проект за 2 дні.
Кейс: зростання утримання на 40% у мережі супермаркетів
Мережа з 150 магазинів звернулася з проблемою: redemption rate балів не перевищував 18%, клієнти не реагували на масові розсилки. Ми впровадили AI-систему: модель LightGBM передбачала найкращий тип пропозиції (подвійні бали на категорію, пороговий бонус, часовий бонус) для кожного клієнта, а Claude 3.5 генерував персоналізоване повідомлення. Результат за 3 місяці: redemption rate зріс до 42%, утримання клієнтів за 90 днів — з 35% до 58%, середній чек учасників — на 22%. Окупність склала 5 місяців.
Як ми будуємо AI-систему персоналізації лояльності?
from anthropic import Anthropic import pandas as pd import numpy as np from sklearn.ensemble import GradientBoostingClassifier from dataclasses import dataclass from typing import Optional import json @dataclass class LoyaltyOffer: user_id: str offer_type: str # double_points, bonus_category, threshold_bonus, streak_reward category: Optional[str] multiplier: float min_purchase: Optional[float] valid_hours: Optional[tuple] valid_days: Optional[list] description: str expected_lift: float class LoyaltyPersonalizationEngine: def __init__(self): self.llm = Anthropic() self.engagement_model = None self.user_preferences = {} def train_engagement_model(self, offers_history: pd.DataFrame): """ offers_history: user_id, offer_type, category, multiplier, was_shown, was_used, purchase_uplift """ features = self._extract_offer_features(offers_history) X = features.drop(columns=['was_used']) y = features['was_used'] from sklearn.model_selection import cross_val_score self.engagement_model = GradientBoostingClassifier( n_estimators=200, learning_rate=0.05, random_state=42 ) cv_scores = cross_val_score(self.engagement_model, X, y, cv=5, scoring='roc_auc') self.engagement_model.fit(X, y) print(f"Engagement model AUC: {cv_scores.mean():.3f} ± {cv_scores.std():.3f}") def _extract_offer_features(self, df: pd.DataFrame) -> pd.DataFrame: features = pd.DataFrame() features['multiplier'] = df['multiplier'] features['has_category_restriction'] = (df['category'].notna()).astype(int) features['has_time_restriction'] = df.get('valid_hours', pd.Series([None] * len(df))).notna().astype(int) features['user_avg_purchase'] = df.get('user_avg_purchase', 500) features['user_purchase_frequency'] = df.get('user_purchase_frequency', 2) features['user_category_match'] = df.get('user_category_match', 0.5) features['was_used'] = df.get('was_used', 0) return features def generate_personalized_offers(self, user: dict, n_offers: int = 3) -> list[LoyaltyOffer]: """Генерація персоналізованих пропозицій""" # Аналіз вподобань користувача top_categories = user.get('top_categories', [])[:3] preferred_hours = user.get('preferred_purchase_hours', [10, 11, 12, 18, 19, 20]) avg_basket = user.get('avg_order_value', 500) tier = user.get('loyalty_tier', 'bronze') # Генерація кандидатів candidates = [] # Категорійні бонуси for category in top_categories[:2]: multiplier = 2.0 if tier == 'bronze' else 1.5 candidates.append(LoyaltyOffer( user_id=user['user_id'], offer_type='double_points', category=category, multiplier=multiplier, min_purchase=None, valid_hours=None, valid_days=None, description=f"×{multiplier} балів у категорії {category}", expected_lift=0.0 )) # Пороговий бонус threshold = round(avg_basket * 1.3 / 100) * 100 candidates.append(LoyaltyOffer( user_id=user['user_id'], offer_type='threshold_bonus', category=None, multiplier=1.5, min_purchase=threshold, valid_hours=None, valid_days=['Mon', 'Tue', 'Wed', 'Thu'], description=f"+{int((threshold * 1.5 - threshold) * 0.01)} балів за покупку від {threshold}₴", expected_lift=0.0 )) # Часовий бонус if preferred_hours: peak_hour = max(set(preferred_hours), key=preferred_hours.count) candidates.append(LoyaltyOffer( user_id=user['user_id'], offer_type='time_bonus', category=None, multiplier=2.0, min_purchase=None, valid_hours=(peak_hour, peak_hour + 2), valid_days=None, description=f"×2 балів з {peak_hour}:00 до {peak_hour+2}:00", expected_lift=0.0 )) # Streak reward current_streak = user.get('consecutive_weeks_with_purchase', 0) if current_streak >= 2: candidates.append(LoyaltyOffer( user_id=user['user_id'], offer_type='streak_reward', category=None, multiplier=3.0, min_purchase=None, valid_hours=None, valid_days=None, description=f"Підтримуйте серію! ×3 балів за {current_streak+1}-й тиждень поспіль", expected_lift=0.0 )) # Скоринг та вибір найкращих if self.engagement_model: scored = self._score_candidates(candidates, user) return scored[:n_offers] return candidates[:n_offers] def _score_candidates(self, candidates: list[LoyaltyOffer], user: dict) -> list[LoyaltyOffer]: """Скоринг кандидатів через ML-модель""" features_list = [] for offer in candidates: user_cats = user.get('top_categories', []) category_match = 1.0 if offer.category in user_cats else 0.3 features_list.append([ offer.multiplier, int(offer.category is not None), int(offer.valid_hours is not None), user.get('avg_order_value', 500), user.get('purchase_frequency_monthly', 2), category_match ]) probs = self.engagement_model.predict_proba(features_list)[:, 1] for offer, prob in zip(candidates, probs): offer.expected_lift = float(prob) return sorted(candidates, key=lambda x: x.expected_lift, reverse=True) def generate_offer_message(self, offer: LoyaltyOffer, user: dict) -> str: """AI-генерація опису пропозиції""" response = self.llm.messages.create( model="claude-3-5-sonnet-20241022", max_tokens=80, messages=[{ "role": "user", "content": f"""Write a brief, exciting loyalty offer message (1 sentence, emoji allowed). Offer: {offer.description} User name: {user.get('first_name', '')} Loyalty tier: {user.get('loyalty_tier', 'bronze')} User's favorite: {user.get('top_categories', [''])[0] if user.get('top_categories') else 'shopping'}""" }] ) return response.content[0].text Що дає використання LLM у персоналізації?
LLM (Large Language Models) дозволяють генерувати не шаблонні, а контекстно-релевантні описи акцій. Наприклад, замість «×2 бали на каву» модель напише: «Ваш улюблений лате тепер приносить подвійні бали!». Це підвищує CTR push-сповіщень на 35-50% порівняно з шаблонними текстами. Ми використовуємо few-shot промптинг та chain-of-thought для контролю тону, щоб не допустити надмірної нав'язливості.
Чому персоналізація нарахування балів збільшує утримання?
Традиційна програма пропонує однакові бонуси всім. AI-персоналізація перетворює бали на релевантні пропозиції: любителю кави — подвійні бали на каву, покупцю електроніки — знижку на аксесуари. За даними Customer loyalty program (Wikipedia), персоналізація підвищує CLV на 20%. На практиці ми бачимо: redemption rate балів зростає з 15-25% до >40%, утримання за 90 днів — з 30-40% до >60%, NPS — на 15-20 пунктів. AI-персоналізація краща за статичну у 2-3 рази за залученістю.
| Метрика | Традиційна лояльність | AI-лояльність |
|---|---|---|
| Redemption rate | 15-25% | >40% |
| Retention (90 днів) | 30-40% | >60% |
| NPS лояльності | +5-10 пунктів | +15-20 пунктів |
| Час на розробку акції | 2-3 дні | 1 година (авто) |
| Підхід | Точність передбачення | Гнучкість описів | Час впровадження |
|---|---|---|---|
| Rule-based | 50-60% | Низька | 1-2 тижні |
| ML (Gradient Boosting) | 80-90% | Середня | 2-4 тижні |
| LLM + ML | 85-90% | Висока | 4-6 тижнів |
Гейміфікація програми лояльності
class LoyaltyGamification: """Ігрові механіки для підвищення залученості""" def get_user_progress(self, user: dict) -> dict: """Поточний прогрес та наступні досягнення""" current_points = user.get('points_balance', 0) current_tier = user.get('loyalty_tier', 'bronze') tier_thresholds = { 'bronze': 0, 'silver': 1000, 'gold': 5000, 'platinum': 20000 } # Наступний рівень tiers = list(tier_thresholds.items()) current_idx = next(i for i, (t, _) in enumerate(tiers) if t == current_tier) next_tier = tiers[current_idx + 1] if current_idx + 1 < len(tiers) else None progress = { 'current_tier': current_tier, 'current_points': current_points, 'streak_weeks': user.get('consecutive_weeks_with_purchase', 0), 'achievements': user.get('achievements', []) } if next_tier: points_needed = next_tier[1] - current_points progress['next_tier'] = next_tier[0] progress['points_to_next_tier'] = max(0, points_needed) progress['progress_pct'] = min(100, (current_points - tier_thresholds[current_tier]) / (next_tier[1] - tier_thresholds[current_tier]) * 100) return progress Персоналізовані програми лояльності показують: +40-60% до redemption rate балів, +25-35% до частоти покупок у учасників, NPS loyalty program members на 15-20 пунктів вище середнього. Ключові метрики для оптимізації: redemption rate (цільовий >40%), active member rate (>60% за 90 днів), points liability (стежити за вартістю нарахованих балів).
Процес впровадження AI-лояльності
- Аналіз поточної програми та даних (2-3 тижні)
- Розробка та навчання моделей (3-4 тижні)
- Інтеграція з CRM та POS (2-3 тижні)
- A/B-тестування на 10% аудиторії (2 тижні)
- Повний запуск та моніторинг (1 тиждень)
Що входить до роботи?
- Модель скорингу пропозицій (градієнтний бустинг)
- LLM-агент генерації персоналізованих описів
- API-сервіс з документацією (OpenAPI)
- Інтеграція з існуючими системами (1С, Bitrix24, SAP)
- Навчання команди та документація
- Гарантія продуктивності (P99 <200 мс)
- Підтримка 3 місяці після запуску
Типові помилки
- Ігнорування cold start (нові користувачі без історії) — використовуємо content-based рекомендації на основі атрибутів товарів.
- Недостатня частота оновлення моделі — оновлюємо weekly з інкрементальним навчанням.
- Відсутність A/B-тестування — завжди запускаємо пілот на 10% аудиторії.
Зв'яжіться для консультації — оцінимо ваш проект за 2 дні. Наш досвід: 10+ проектів у рітейлі та фінтеху, окупність за 4-6 місяців. Запишіться на демо, щоб побачити систему в дії.







