☁️ SaaS-сервис

Полное руководство по аналитике для подписочных сервисов: отслеживание подписок, MRR, churn rate, LTV и воронка активации

🎯 Что вы получите
  • Полную картину воронки от регистрации до платящего клиента
  • Расчет MRR (Monthly Recurring Revenue) и его динамику
  • Анализ оттока (churn rate) и удержания клиентов
  • Прогнозирование LTV (Lifetime Value)
  • Сегментацию клиентов по тарифам и поведению

Ключевые метрики SaaS

💰 MRR
₽ 156 000
Ежемесячный повторяющийся доход. Вырос на 12% за месяц
📊 Churn Rate
2.4%
Ежемесячный отток клиентов. Целевой уровень < 3%
👥 LTV
₽ 45 000
Пожизненная ценность клиента. Окупаемость CAC 8 месяцев
📈 Активация
67%
Процент новых клиентов, достигших ключевого действия

Типовая воронка SaaS

📝
Регистрация
signup
📧
Активация
activation
💳
Триал
trial_start
💰
Платёж
subscription_payment

Какие события отправлять

Событие Описание Обязательность Ключевые свойства
signup Регистрация нового пользователя Обязательно method, source
email_confirmed Подтверждение email Рекомендуется
activation Ключевое действие (создан проект, загружены данные) Обязательно для воронки feature, value
trial_start Начало триального периода Обязательно plan, trial_days
subscription_created Создание подписки (переход на платный тариф) Обязательно plan, amount, billing_period
subscription_payment Успешный ежемесячный платеж Обязательно amount, plan
subscription_cancelled Отмена подписки Обязательно reason, plan
subscription_upgraded Апгрейд тарифа Опционально old_plan, new_plan
feature_used Использование ключевой функции Опционально feature, value

Метаданные для SaaS

// Регистрация (активация)
{
  "event": "signup",
  "user_id": "user_123",
  "properties": {
    "method": "email",
    "source": "google_ads"
  },
  "attributes": {
    "email": "user@example.com",
    "name": "Иван Петров",
    "company": "ООО Ромашка"
  },
  "_metadata": {
    "is_activation": true,
    "event_display_name": "Регистрация",
    "event_color": "#28a745"
  }
}

// Начало триала
{
  "event": "trial_start",
  "user_id": "user_123",
  "properties": {
    "plan": "pro",
    "trial_days": 14,
    "trial_ends_at": "2026-04-02"
  },
  "_metadata": {
    "funnel_sales_step": 2,
    "funnel_sales_name": "Начало триала",
    "event_display_name": "Начало триала"
  }
}

// Создание подписки (первый платёж)
{
  "event": "subscription_created",
  "user_id": "user_123",
  "properties": {
    "plan": "pro",
    "amount": 9900,
    "billing_period": "month",
    "interval": 1
  },
  "_metadata": {
    "funnel_sales_step": 3,
    "funnel_sales_name": "Платная подписка",
    "is_order": true,
    "order_revenue_field": "amount",
    "event_display_name": "Покупка подписки",
    "event_color": "#2A6DF4"
  }
}

// Ежемесячный платёж
{
  "event": "subscription_payment",
  "user_id": "user_123",
  "properties": {
    "plan": "pro",
    "amount": 9900,
    "payment_date": "2026-04-01",
    "invoice_id": "INV-001"
  },
  "_metadata": {
    "is_order": true,
    "order_revenue_field": "amount",
    "event_display_name": "Ежемесячный платёж"
  }
}

// Отмена подписки
{
  "event": "subscription_cancelled",
  "user_id": "user_123",
  "properties": {
    "plan": "pro",
    "reason": "too_expensive",
    "cancelled_at": "2026-05-01",
    "effective_date": "2026-06-01"
  },
  "_metadata": {
    "event_display_name": "Отмена подписки",
    "event_color": "#dc3545"
  }
}

Атрибуты клиентов для SaaS

{
  "event": "company_data",
  "user_id": "user_123",
  "attributes": {
    "email": "user@example.com",
    "company_name": "ООО Ромашка",
    "company_size": 45,
    "industry": "retail",
    "plan": "enterprise",
    "plan_started_at": "2026-01-15",
    "trial_ends_at": "2026-01-29",
    "subscription_status": "active",
    "mrr": 45000,
    "ltv": 450000,
    "total_paid": 135000,
    "payment_method": "invoice",
    "account_manager": "Иван Петров",
    "churn_risk": "low",
    
    "_metadata": {
      "company_name": {
        "attribute_display_name": "Компания",
        "attribute_category": "Основное"
      },
      "plan": {
        "attribute_display_name": "Тариф",
        "attribute_category": "Подписка",
        "attribute_format": "string",
        "attribute_color": "#2A6DF4"
      },
      "mrr": {
        "attribute_display_name": "MRR",
        "attribute_category": "Финансы",
        "attribute_format": "currency"
      },
      "ltv": {
        "attribute_display_name": "LTV",
        "attribute_category": "Финансы",
        "attribute_format": "currency"
      },
      "churn_risk": {
        "attribute_display_name": "Риск оттока",
        "attribute_category": "Аналитика",
        "attribute_format": "string",
        "attribute_color": "#fd7e14"
      }
    }
  }
}

Расчет MRR (Monthly Recurring Revenue)

MRR рассчитывается автоматически на основе событий с метаданными is_order. Для корректного расчета:

Пример расчета MRR

Клиент Тариф Сумма Статус
Клиент 1 Pro 9 900 ₽ Активен
Клиент 2 Enterprise 45 000 ₽ Активен
Клиент 3 Basic 3 490 ₽ Отменен (не учитывается)
Итого MRR 54 900 ₽

Анализ оттока (Churn Rate)

Churn rate рассчитывается как отношение отменивших подписку клиентов к общему числу активных:

Churn Rate = (Клиенты, отменившие подписку за месяц) / (Всего активных клиентов) × 100%

Пример расчета churn

Период Активных на начало Новых Отменило Активных на конец Churn Rate
Январь 1000 150 20 1130 2.0%
Февраль 1130 120 28 1222 2.5%
Март 1222 180 42 1360 3.4%

Когортный анализ для SaaS

Когортный анализ показывает, как меняется удержание клиентов в зависимости от времени их регистрации:

Когорта
Month 1
Month 2
Month 3
Month 4
Month 5
Month 6
Январь 2026
100%
85%
78%
72%
68%
65%
Февраль 2026
100%
87%
80%
75%
71%
Март 2026
100%
89%
83%

Расчет LTV (Lifetime Value)

LTV рассчитывается по формуле:

LTV = (Средний чек × Частота покупок) / Churn Rate

Или на основе когорт:

LTV = Сумма выручки от когорты / Размер когорты

Пример расчета LTV

Параметр Значение
Средний чек (ARPU) 5 500 ₽
Churn Rate 2.5% в месяц
Средняя продолжительность жизни 40 месяцев
LTV 220 000 ₽

Пример полной интеграции на Node.js

class SaaSSubscriptionTracker {
  constructor(apiKey) {
    this.apiKey = apiKey;
    this.apiUrl = 'https://api.instantbase.online/v1/track';
  }
  
  async trackEvent(event, userId, properties = {}, metadata = {}) {
    const data = {
      event,
      user_id: userId,
      timestamp: new Date().toISOString(),
      properties
    };
    
    if (Object.keys(metadata).length > 0) {
      data._metadata = metadata;
    }
    
    try {
      const response = await fetch(this.apiUrl, {
        method: 'POST',
        headers: {
          'X-API-Key': this.apiKey,
          'Content-Type': 'application/json'
        },
        body: JSON.stringify(data)
      });
      
      return await response.json();
    } catch (error) {
      console.error('Failed to track event:', error);
    }
  }
  
  // Регистрация
  trackSignup(userId, userData, source) {
    return this.trackEvent('signup', userId, {
      method: 'email',
      source
    }, {
      is_activation: true,
      event_display_name: 'Регистрация'
    }, userData);
  }
  
  // Активация (ключевое действие)
  trackActivation(userId, feature) {
    return this.trackEvent('activation', userId, {
      feature,
      activated_at: new Date().toISOString()
    }, {
      funnel_sales_step: 1,
      funnel_sales_name: 'Активация',
      event_display_name: 'Активация'
    });
  }
  
  // Начало триала
  trackTrialStart(userId, plan, trialDays) {
    const trialEnds = new Date();
    trialEnds.setDate(trialEnds.getDate() + trialDays);
    
    return this.trackEvent('trial_start', userId, {
      plan,
      trial_days: trialDays,
      trial_ends_at: trialEnds.toISOString().split('T')[0]
    }, {
      funnel_sales_step: 2,
      funnel_sales_name: 'Триал'
    });
  }
  
  // Создание подписки (первый платёж)
  trackSubscriptionCreated(userId, plan, amount, billingPeriod = 'month') {
    return this.trackEvent('subscription_created', userId, {
      plan,
      amount,
      billing_period: billingPeriod,
      created_at: new Date().toISOString()
    }, {
      funnel_sales_step: 3,
      funnel_sales_name: 'Платная подписка',
      is_order: true,
      order_revenue_field: 'amount'
    });
  }
  
  // Ежемесячный платёж
  trackSubscriptionPayment(userId, plan, amount, invoiceId) {
    return this.trackEvent('subscription_payment', userId, {
      plan,
      amount,
      invoice_id: invoiceId,
      payment_date: new Date().toISOString().split('T')[0]
    }, {
      is_order: true,
      order_revenue_field: 'amount'
    });
  }
  
  // Отмена подписки
  trackSubscriptionCancelled(userId, plan, reason) {
    return this.trackEvent('subscription_cancelled', userId, {
      plan,
      reason,
      cancelled_at: new Date().toISOString()
    }, {
      event_display_name: 'Отмена подписки'
    });
  }
  
  // Апгрейд тарифа
  trackSubscriptionUpgraded(userId, oldPlan, newPlan, amount) {
    return this.trackEvent('subscription_upgraded', userId, {
      old_plan: oldPlan,
      new_plan: newPlan,
      amount,
      upgraded_at: new Date().toISOString()
    }, {
      is_order: true,
      order_revenue_field: 'amount',
      event_display_name: 'Апгрейд тарифа'
    });
  }
  
  // Использование функции
  trackFeatureUsed(userId, feature, value = null) {
    return this.trackEvent('feature_used', userId, {
      feature,
      value,
      used_at: new Date().toISOString()
    });
  }
}

// Использование
const tracker = new SaaSSubscriptionTracker('your_api_key');

// При регистрации
tracker.trackSignup('user_123', {
  email: 'user@example.com',
  name: 'Иван Петров',
  company: 'ООО Ромашка'
}, 'google_ads');

// При создании проекта (активация)
tracker.trackActivation('user_123', 'project_created');

// При начале триала
tracker.trackTrialStart('user_123', 'pro', 14);

// При переходе на платный тариф
tracker.trackSubscriptionCreated('user_123', 'pro', 9900);

// Ежемесячный платёж
tracker.trackSubscriptionPayment('user_123', 'pro', 9900, 'INV-001');

// При отмене
tracker.trackSubscriptionCancelled('user_123', 'pro', 'too_expensive');

Интеграция с платежными системами

Stripe (вебхуки)

// Обработчик вебхука Stripe
app.post('/webhooks/stripe', async (req, res) => {
  const event = req.body;
  const tracker = new SaaSSubscriptionTracker(process.env.INSTANTBASE_API_KEY);
  
  switch (event.type) {
    case 'customer.subscription.created':
      await tracker.trackSubscriptionCreated(
        event.data.object.customer,
        event.data.object.items.data[0].price.nickname,
        event.data.object.items.data[0].price.unit_amount / 100,
        event.data.object.plan.interval
      );
      break;
      
    case 'invoice.payment_succeeded':
      await tracker.trackSubscriptionPayment(
        event.data.object.customer,
        event.data.object.lines.data[0].price?.nickname || 'unknown',
        event.data.object.amount_paid / 100,
        event.data.object.id
      );
      break;
      
    case 'customer.subscription.deleted':
      await tracker.trackSubscriptionCancelled(
        event.data.object.customer,
        event.data.object.items.data[0].price.nickname,
        'cancelled'
      );
      break;
  }
  
  res.status(200).send('OK');
});

YooKassa

// Обработчик вебхука YooKassa
app.post('/webhooks/yookassa', async (req, res) => {
  const event = req.body;
  const tracker = new SaaSSubscriptionTracker(process.env.INSTANTBASE_API_KEY);
  
  if (event.event === 'payment.succeeded') {
    await tracker.trackSubscriptionPayment(
      event.object.metadata.user_id,
      event.object.metadata.plan || 'unknown',
      event.object.amount.value,
      event.object.id
    );
  }
  
  res.status(200).send('OK');
});

Дашборды для SaaS

После настройки интеграции вы получите готовые дашборды:

Ключевые вопросы для анализа SaaS

📈 Рост

  • Как растет MRR месяц к месяцу?
  • Какие каналы приносят лучших клиентов?
  • Какова конверсия из триала в платных?

📉 Отток

  • Почему клиенты уходят?
  • На каком этапе чаще всего отказываются?
  • Есть ли сезонность в оттоке?

💰 Монетизация

  • Какой тариф самый популярный?
  • Как часто клиенты апгрейдят?
  • Какой LTV у разных когорт?

🚀 Продукт

  • Какие функции используют чаще?
  • Коррелирует ли использование с удержанием?
  • Где пользователи застревают?

Рекомендации

  • Всегда передавайте план клиента — это позволит сегментировать аналитику
  • Отслеживайте ключевые действия — найдите "момент активации" для вашего продукта
  • Анализируйте отток — собирайте причины отмены через properties
  • Считайте LTV по когортам — это точнее, чем среднее по больнице
  • Мониторьте использование функций — это ранний индикатор оттока
  • Настраивайте вебхуки для платежей — для автоматического учета MRR

Что дальше?

🎮 Игры

Аналитика для игровых проектов

Перейти →

📱 Мобильное приложение

Аналитика для мобильных приложений

Перейти →

Нужна помощь с настройкой SaaS-аналитики?

Напишите нам, и мы поможем настроить интеграцию под ваш сервис

support@instantbase.online Telegram