AI-система оптимізації онбордингу для SaaS-продуктів

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1564 послуг
AI-система оптимізації онбордингу для SaaS-продуктів
Середній
~2-4 тижні
Часті запитання

Напрямки AI-розробки

Етапи розробки AI-рішення

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1357
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1250
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    956
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1188
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    646
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    929

AI-система оптимізації онбордингу SaaS

Онбординг — найкритичніший етап життєвого циклу SaaS-клієнта. За даними досліджень, 40-60% користувачів йдуть у перші 30 днів, не активувавши ключову цінність продукту. Чому? Стандартні тури та email-ланцюжки не враховують індивідуальні патерни поведінки. Ми реалізуємо AI-систему, яка на льоту визначає, які кроки онбордингу приводять до активації, і персоналізує шлях кожного користувача. За 5 років роботи над 50+ проектами ми гарантуємо: Activation Rate зросте на 25-40%, а first-month churn впаде на 20-30%. Цей підхід заснований на концепції Aha moment. Економічний ефект від зниження відтоку може досягати $50,000–$100,000 на рік для середнього SaaS. Зв'яжіться з нами для безкоштовного аудиту вашого онбордингу.

Як AI передбачає активацію користувача?

Модель на градієнтному бустингу (200 дерев, max_depth=4) аналізує перші 7 днів: кількість сесій, унікальних подій, днів активності, завершених кроків онбордингу, запрошень колег. Особлива ознака — key_feature_used (хоча б одна з подій Aha moment). Якщо ймовірність активації <30% — спрацьовує предиктивний алерт. Критичний шлях виявляється через кореляцію: події з lift >1.5 (в 1.5 рази вища конверсія у тих, хто її здійснив) позначаються is_critical=true.

import pandas as pd
import numpy as np
from sklearn.ensemble import GradientBoostingClassifier
from anthropic import Anthropic
import json

class OnboardingActivationPredictor:
    """
    Предсказание: активируется ли пользователь в течение 14 дней.
    Активация = достижение "Aha moment" продукта.
    """

    def __init__(self, aha_moment_events: list[str]):
        """
        aha_moment_events: список событий, которые означают активацию
        Пример для Slack: ['first_message_sent', 'channel_created']
        Пример для Figma: ['first_design_shared', 'collaboration_started']
        """
        self.aha_events = aha_moment_events
        self.model = GradientBoostingClassifier(
            n_estimators=200, learning_rate=0.05, max_depth=4, random_state=42
        )

    def build_features(self, user_events: pd.DataFrame,
                        days_since_signup: int = 7) -> pd.DataFrame:
        """Признаки из первых N дней онбординга"""
        cutoff = user_events.groupby('user_id')['signup_date'].first() + pd.Timedelta(days=days_since_signup)

        early_events = user_events[
            user_events['event_date'] <= user_events['user_id'].map(cutoff)
        ]

        features = early_events.groupby('user_id').agg(
            sessions_count=('session_id', pd.Series.nunique),
            unique_events=('event_name', pd.Series.nunique),
            total_events=('event_id', 'count'),
            days_active=('event_date', lambda x: x.dt.date.nunique()),
            key_feature_used=('event_name', lambda x: x.isin(self.aha_events).any().astype(int)),
            onboarding_steps_completed=('event_name', lambda x: x.str.startswith('onboarding_').sum()),
            invited_teammates=('event_name', lambda x: (x == 'invite_sent').sum()),
            setup_completed=('event_name', lambda x: (x == 'setup_complete').any().astype(int))
        ).reset_index()

        # Скорость прогресса
        features['setup_speed_days'] = early_events[
            early_events['event_name'] == 'setup_complete'
        ].groupby('user_id')['days_to_event'].min().reindex(features['user_id']).fillna(days_since_signup)

        return features.fillna(0)

    def identify_critical_path(self, user_events: pd.DataFrame,
                                 activated_users: set,
                                 churned_users: set) -> dict:
        """
        Aha moment анализ: какие события в первые 3 дня максимально
        коррелируют с активацией vs churn.
        """
        critical_path = {}
        early = user_events[user_events['days_to_event'] <= 3]

        event_names = early['event_name'].unique()

        for event in event_names:
            users_with_event = set(early[early['event_name'] == event]['user_id'])

            activation_rate_with = len(users_with_event & activated_users) / max(len(users_with_event), 1)
            activation_rate_without = len(activated_users - users_with_event) / max(len(activated_users - users_with_event) + 1, 1)

            if activation_rate_with > 0:
                lift = activation_rate_with / max(activation_rate_without, 0.01)
                critical_path[event] = {
                    'activation_rate': round(activation_rate_with, 3),
                    'lift_vs_without': round(lift, 2),
                    'prevalence': len(users_with_event),
                    'is_critical': lift > 1.5
                }

        return dict(sorted(critical_path.items(), key=lambda x: -x[1]['lift_vs_without']))


class AdaptiveOnboardingOrchestrator:
    """Персонализация онбординговых действий"""

    def __init__(self):
        self.llm = Anthropic()

    def determine_next_action(self, user: dict,
                               completed_steps: list[str],
                               days_since_signup: int,
                               activation_probability: float) -> dict:
        """
        Следующее действие для пользователя в онбординге.
        Учитывает скорость прогресса и риск churn.
        """
        # Если вероятность активации низкая → интервенция
        if activation_probability < 0.3 and days_since_signup <= 7:
            intervention_type = 'urgent'
        elif activation_probability < 0.5 and days_since_signup >= 7:
            intervention_type = 'nudge'
        else:
            intervention_type = 'guide'

        next_steps_map = {
            'profile_completed': 'invite_teammates',
            'invite_teammates': 'key_feature_setup',
            'key_feature_setup': 'aha_moment_action',
            'aha_moment_action': 'second_use_case',
        }

        last_completed = completed_steps[-1] if completed_steps else None
        next_step = next_steps_map.get(last_completed, 'profile_completed')

        return {
            'next_action': next_step,
            'intervention_type': intervention_type,
            'channel': 'in_app' if days_since_signup <= 3 else 'email',
            'message': self._generate_nudge(user, next_step, intervention_type),
            'activation_risk': 'high' if activation_probability < 0.3 else 'low'
        }

    def _generate_nudge(self, user: dict, next_step: str,
                          intervention_type: str) -> str:
        response = self.llm.messages.create(
            model="claude-3-5-sonnet-20241022",
            max_tokens=100,
            messages=[{
                "role": "user",
                "content": f"""Write a {intervention_type} onboarding message in Russian.

User: {user.get('first_name', 'Пользователь')}, role: {user.get('job_title', '')}, company: {user.get('company', '')}
Next step needed: {next_step}
Urgency: {intervention_type}

Max 50 words. Action-oriented, specific, no generic phrases like "Don't miss out"."""
            }]
        )
        return response.content[0].text.strip()


class OnboardingAnalytics:
    """Метрики онбординга"""

    def compute_activation_funnel(self, events: pd.DataFrame,
                                   funnel_steps: list[str]) -> pd.DataFrame:
        """Воронка активации по шагам"""
        total_users = events['user_id'].nunique()
        funnel = []

        for step in funnel_steps:
            users_at_step = events[events['event_name'] == step]['user_id'].nunique()
            funnel.append({
                'step': step,
                'users': users_at_step,
                'conversion_from_start': round(users_at_step / total_users, 3),
            })

        funnel_df = pd.DataFrame(funnel)
        funnel_df['drop_off_from_prev'] = 1 - funnel_df['users'] / funnel_df['users'].shift(1).fillna(total_users)
        return funnel_df

Чому персоналізація онбордингу критична для зниження churn?

KPI Без AI З AI
Activation Rate 20-30% 60-70%
First-month churn 40-60% 20-30%
Час до Aha moment 14-21 день 3-7 днів
Конверсія у запрошення команди 15% 45%

AI-система піднімає activation rate в 1.5-2 рази швидше за стандартний email-онбординг. Ключовий ефект — не просто підказки, а вибір каналу та тону: якщо користувач не завершив профіль за 3 дні — urgent in-app модалка, якщо пройшов усі кроки — guiding email з розбором другого use case.

Як Orchestrator вибирає тип інтервенції?

Intervention type Trigger condition Channel Example
Urgent Probability <30%, days ≤7 In-app modal 'Завершіть профіль: без цього ви не зможете запросити команду'
Nudge Probability 30-50%, days ≥7 Email 'Більшість колег уже використовують фічу X — спробуйте.'
Guide Probability >50% In-app tooltip 'Чудовий прогрес! Ось як отримати максимум від другого use case.'

Кожен тип генерується LLM на основі ролі та компанії користувача, що підвищує релевантність та click-through rate.

Що входить у роботу?

  • Аудит поточного онбордингу: аналіз воронки, визначення Aha moment через кореляційний аналіз (lift >1.5).
  • Розробка моделі передбачення активації (GradientBoosting + калібрування ймовірності).
  • Інтеграція Orchestrator: прив'язка до вашого event pipeline через API (REST, WebSocket).
  • Генерація персоналізованих повідомлень через Claude 3.5 / GPT-4 — 3 типи: urgent, nudge, guide.
  • A/B-тестування: 2 тижні, split по user_id. Контролюємо Activation Rate, churn, Time to Value.
  • Дашборд метрик (retention, воронка, lift подій) — Grafana + ClickHouse.
  • Документація та навчання команди: model card, pipeline, як переучувати.

Типові помилки при впровадженні AI-онбордингу

Одна з частих помилок — визначення Aha moment на інтуїції, без даних. Кореляція подій з активацією повинна рахуватися на історичних даних, інакше персоналізація буде марною. Інша проблема — занадто часті інтервенції: якщо надсилати повідомлення щодня, користувач відпишеться. Оптимальний інтервал — не частіше 1 разу на 3 дні, urgent — не більше 2 за 7 днів. Також не можна ігнорувати latency LLM: генерація повідомлення займає 2-5 секунд, тому для in-app підказок використовуйте кешування або fallback-шаблони. Нарешті, відсутність моніторингу дрейфу: розподіл подій змінюється після релізу — перенавчайте модель раз на місяць або при падінні Activation Rate >5%. Якщо цих помилок уникнути, економія від зниження відтоку може досягати $50,000–$100,000 на рік для середнього SaaS.

Для B2B SaaS-платформи управління проектами ми впровадили описану систему. Після 6 тижнів роботи activation rate зріс з 22% до 61%, а first-month churn знизився з 48% до 26%. Ключовим стало виявлення Aha moment: створення першого проекту з делегуванням завдань. На основі цього ми перебудували онбординг — і результати підтвердилися A/B-тестом. Економічний ефект для клієнта перевищив $100,000 на рік.

Отримайте консультацію по вашому сценарію — оцінимо поточну воронку та потенціал AI-оптимізації за 2 дні. Замовте аудит вашого онбордингу вже сьогодні.

Розробка рекомендаційних систем: від collaborative filtering до real-time serving

На одному проєкті для e-commerce з каталогом 300k SKU ми підняли CTR з 1,8% до 4,4% — у 2,4 рази. Перший ривок дала колаборативна фільтрація замість «популярне за останні 7 днів», другий — додавання контентних ознак та re-ranking. Різниця між «показуємо популярне» і «показуємо персоналізоване» — вимірна та суттєва. Нижче — інженерний досвід, який допоміг це зробити, і архітектури, які реально працюють у продакшені.

Collaborative Filtering: матрична факторизація та нейронні підходи

Matrix Factorization — класика для implicit feedback (кліки, перегляди, покупки без явного рейтингу). ALS (Alternating Least Squares) у бібліотеці Implicit обробляє матриці user×item із сотнями мільйонів ненульових значень за хвилини на GPU. Latent factors 64–256, регуляризація λ=0.01–0.1 — стартові параметри. Проблема cold start: для нового користувача або товару немає історії — класичний CF безпорадний, потрібні контентні ознаки або гібрид.

Neural Collaborative Filtering (NCF) замінює скалярний добуток на нейромережу. На практиці виграш над добре налаштованим ALS помірний, але NCF простіше розширювати додатковими ознаками (вік, категорія, час доби). Sequence-aware моделі (SASRec, BERT4Rec) враховують порядок взаємодій — state-of-the-art для сесійних рекомендацій.

Як вибрати архітектуру рекомендаційної системи?

Відповідь залежить від даних, навантаження та вимог до холодного старту. Нижче — три основні підходи з критеріями вибору.

Критерій Collaborative Filtering Content-Based Filtering Гібридний (two-stage)
Дані для старту Історія взаємодій Ознаки об'єктів та користувачів І те, і інше
Cold start Провальний Працює для нових items Частково вирішено
Diversity (long-tail) Низький, popularity bias Високий Середній–високий
Latency serving <5 ms (precomputed) <10 ms (FAISS) 20–50 ms
Складність впровадження Низька Середня Висока

Гібридна архітектура на 20–40% ефективніша за чистий CF за покриттям long-tail — перевірено на каталогах від 100k SKU.

Content-Based Filtering: коли історії взаємодій мало

Content-based рекомендує на основі характеристик товарів, а не поведінки інших користувачів — вирішує cold start для нових items. Текстові ембединги через sentence-transformers (multilingual-e5-base, BGE-M3) → пошук схожих через FAISS IndexFlatIP — запит за <5 ms на 100k товарів. Item2Vec (Word2Vec на послідовностях переглядів) дає інтерпретовані «схожі товари» за пару годин навчання.

Структуровані ознаки (категорія, бренд, ціна) подаються через embedding layers або в gradient boosting — CatBoost працює з категоріями без ручного кодування.

Чому гібридні моделі працюють краще?

Production-системи майже завжди дворівневі. Stage 1 (Retrieval) — швидкий відбір 100–500 кандидатів із 300k товарів через ALS або Two-Tower модель з векторним пошуком (FAISS, Qdrant). Stage 2 (Ranking) — важкий ранжувальник на LightGBM або нейромережі з cross-features, часом, пристроєм та контекстом сесії. LightFM — хороша відправна точка для середнього масштабу без важкої інфраструктури. Наша практика показує: перехід від single-stage до two-stage дає приріст точності на 15–25% при зростанні latency всього на 20–30 мс.

Real-Time Serving: архітектура під навантаження

Latency SLA — 50–100 ms при тисячах запитів на секунду. Base-рекомендації precompute (batch job раз на годину) → Redis по user_id → <5 ms. Real-time re-ranking через Kafka для подій (кліки, додавання в кошик) → оновлення контекстних ознак. Feature serving — Redis з TTL (кількість переглядів за 24 години, останній клікнутий item). При навантаженні 10k req/s ставимо Redis Cluster з реплікацією.

A/B тестування — єдиний достовірний спосіб оцінити покращення. Офлайн-метрики корелюють з онлайн не завжди. Kohavi et al., «Online Controlled Experiments at Large Scale» (KDD 2013) — обов'язкове читання для команди. Тест з 5–10% трафіку, моніторинг CTR, конверсії, revenue per session. Одна з наших клієнтських систем після гібридизації збільшила виручку на 18% за місяць A/B.

Терміни розробки рекомендаційної системи

Етапи та типові часові витрати — у таблиці нижче. Вартість розраховується індивідуально під масштаб каталогу та вимоги до latency.

Етап Тривалість Результат
Аудит даних та baseline 1–2 тижні Звіт із щільністю матриці, cold start-зонами, метриками «популярного»
Прототип (offline validation) 2–3 тижні Працююча модель з офлайн-метриками (Recall@k, NDCG)
Production-система (two-stage, A/B) 1.5–2.5 місяця Low-latency сервіс з моніторингом та A/B-інфраструктурою
Навчання команди та документація 1–2 тижні Model card, runbook з деплою, сесія з донавчання

Що входить у розробку під ключ

  1. Аудит даних — щільність матриці user×item (зазвичай <0,1%), розподіл активності, temporal паттерни, cold start статистика.
  2. Baseline — «популярне» як простий поріг, який часто важко перевершити.
  3. Ітеративне покращення — ALS → контентні ознаки → two-stage → sequence-aware. Кожен крок з A/B.
  4. Інфраструктура serving — batch precomputation, Redis, real-time re-ranking, моніторинг у Grafana.
  5. Документація — model card з метриками, інструкція з деплою, опис ознак.
  6. Навчання команди — сесія з інтерпретації результатів та донавчання моделі.
  7. Підтримка — 1 місяць після запуску (фікс інцидентів, доналаштування pipeline).

Ми — команда з 7+ роками досвіду в рекомендаційних системах, реалізували понад 30 проєктів для e-commerce та медіа. Гарантуємо прозоре A/B-тестування та фіксацію покращення метрик.

Хочете оцінити потенціал зростання вашого каталогу? Зв'яжіться з нами для безкоштовного аудиту даних. Замовте розробку рекомендаційної системи — перший прототип протягом двох тижнів.

Приклад конфігу ALS для implicit feedback
from implicit.als import AlternatingLeastSquares

model = AlternatingLeastSquares(
    factors=64,
    regularization=0.05,
    iterations=15,
    use_gpu=True
)
model.fit(user_item_matrix)

Більше про математику рекомендаційних систем — у Wikipedia.