☁️ 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. Для корректного расчета:
- Для новых подписок отправляйте событие
subscription_createdс суммой - Для ежемесячных платежей отправляйте
subscription_paymentс той же суммой - Для апгрейдов отправляйте событие с новой суммой
- Для отмен подписка перестает учитываться в MRR
Пример расчета 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
После настройки интеграции вы получите готовые дашборды:
- Главная — MRR, новые подписки, churn rate, LTV
- Выручка — динамика MRR, распределение по тарифам
- Заказы — воронка от регистрации до платящего клиента
- Клиенты — сегментация по тарифам, статусу подписки
- Удержание — когорты, churn rate по когортам
- Активность — использование функций, DAU/WAU/MAU
Ключевые вопросы для анализа SaaS
📈 Рост
- Как растет MRR месяц к месяцу?
- Какие каналы приносят лучших клиентов?
- Какова конверсия из триала в платных?
📉 Отток
- Почему клиенты уходят?
- На каком этапе чаще всего отказываются?
- Есть ли сезонность в оттоке?
💰 Монетизация
- Какой тариф самый популярный?
- Как часто клиенты апгрейдят?
- Какой LTV у разных когорт?
🚀 Продукт
- Какие функции используют чаще?
- Коррелирует ли использование с удержанием?
- Где пользователи застревают?
Рекомендации
- Всегда передавайте план клиента — это позволит сегментировать аналитику
- Отслеживайте ключевые действия — найдите "момент активации" для вашего продукта
- Анализируйте отток — собирайте причины отмены через properties
- Считайте LTV по когортам — это точнее, чем среднее по больнице
- Мониторьте использование функций — это ранний индикатор оттока
- Настраивайте вебхуки для платежей — для автоматического учета MRR
Что дальше?
Нужна помощь с настройкой SaaS-аналитики?
Напишите нам, и мы поможем настроить интеграцию под ваш сервис