Ваш відділ продажів витрачає 70% часу на ліди, які ніколи не куплять. Lead scoring автоматично присвоює бали кожному відвідувачу сайту на основі поведінки: перегляд сторінок, завантаження матеріалів, заповнення форм. Щойно лід набирає порогове значення, він передається в CRM як гарячий. Ми реалізували цю систему для десятка B2B-проєктів — у середньому конверсія в продаж зросла в 2,5 раза. Система оцінки лідів на сайті враховує поведінковий скоринг та автоматизує кваліфікацію. Зв'яжіться з нами, щоб отримати консультацію з налаштування.
Чому стандартний лід-скоринг не працює без правильної конфігурації?
Просто присвоїти 5 балів за перегляд сторінки — недостатньо. Потрібно враховувати повторюваність подій: не зараховувати повторно демо-запит, зважувати негативні сигнали (відписка, неактивність 30 днів) та динамічно змінювати пороги стадій. Без цього система генерує хибнопозитивні гарячі ліди, які відволікають менеджерів. Наша конфігурація включає 20+ типів подій з балами від -25 до +50 та чотири рівні лідів: cold, warm, hot, mql/sql. Автоматична кваліфікація в 4 рази швидша за ручну.
Як налаштувати ваги подій?
Вага події визначається її близькістю до покупки: перегляд сторінки тарифів — 15 балів, заповнення контактної форми — 40, старт trial — 50. Негативні сигнали (відписка від розсилки, неактивність понад 30 днів) знижують рахунок на 10–20 балів. Ми рекомендуємо щокварталу переглядати ваги на основі конверсії лідів в угоди — це підвищує точність прогнозу. Наприклад, в одному проєкті ми збільшили вагу перегляду сторінки кейсів з 5 до 10 після того, як помітили сильну кореляцію з покупкою.
MQL і SQL: стадії кваліфікації
Marketing Qualified Lead (MQL) — лід, який досяг 80 балів, автоматично передається в CRM для nurture-кампаній. Sales Qualified Lead (SQL) — 100 і більше балів, вимагає негайного дзвінка менеджера. Різні пороги дозволяють не перевантажувати продажі ранніми контактами, а маркетингу — доопрацьовувати теплі ліди.
| Критерій | Без lead scoring | З lead scoring |
|---|---|---|
| Час на кваліфікацію одного ліда | 10–15 хвилин | Миттєво (автоматично) |
| Точність пріоритизації | Низька (суб'єктивна) | Висока (на основі даних) |
| Обробка потоку з 1000 лідів/міс | 2–3 менеджери full-time | 1 менеджер (тільки гарячі) |
| Конверсія в продаж | 1–3% | 5–8% (за рахунок фокусу на MQL) |
| Витрати на впровадження | 0 (вартість часу менеджерів) | Визначається після аналізу |
| Стадія | Діапазон балів | Дія менеджера |
|---|---|---|
| Cold | 0–29 | Автоматична email-розсилка |
| Warm | 30–59 | Щотижневий обдзвін |
| Hot | 60–79 | Пріоритетний обдзвін протягом дня |
| MQL | 80–99 | Створення ліда в CRM, повідомлення SDR |
| SQL | 100+ | Негайний дзвінок менеджера з продажу |
Архітектура системи
Модель даних
// Схема таблиць
Schema::create('lead_scores', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->nullable()->constrained()->nullOnDelete();
$table->string('session_id')->index();
$table->string('email')->nullable()->index();
$table->integer('score')->default(0);
$table->json('score_breakdown');
$table->string('stage')->default('cold');
$table->timestamp('mql_reached_at')->nullable();
$table->timestamp('qualified_at')->nullable();
$table->timestamps();
$table->index(['score', 'stage']);
});
Schema::create('lead_events', function (Blueprint $table) {
$table->id();
$table->foreignId('lead_score_id')->constrained()->cascadeOnDelete();
$table->string('event');
$table->integer('points');
$table->json('metadata')->nullable();
$table->timestamps();
});
Конфігурація балів
// config/lead_scoring.php
return [
'events' => [
'page_view_pricing' => 15,
'page_view_case_study' => 10,
'page_view_demo' => 20,
'demo_requested' => 50,
'whitepaper_downloaded' => 20,
'webinar_registered' => 25,
'free_trial_started' => 40,
'pricing_calculator_used' => 30,
'comparison_page_viewed' => 15,
'contact_form_submitted' => 40,
'email_opened' => 5,
'email_clicked' => 10,
'return_visit' => 5,
'visited_3_days_in_row' => 15,
'company_size_50_plus' => 20,
'role_decision_maker' => 25,
'budget_confirmed' => 30,
'unsubscribed' => -20,
'inactive_30_days' => -10,
'student_email_domain' => -25,
],
'thresholds' => [
'warm' => 30,
'hot' => 60,
'mql' => 80,
'sql' => 100,
],
];
Сервіс скорингу
class LeadScoringService
{
public function track(string $sessionId, string $event, array $metadata = [], ?int $userId = null): LeadScore
{
$points = config("lead_scoring.events.{$event}", 0);
$lead = LeadScore::firstOrCreate(
['session_id' => $sessionId],
['user_id' => $userId, 'score_breakdown' => []]
);
if ($userId && !$lead->user_id) {
$lead->update(['user_id' => $userId]);
}
if (!empty($metadata['email']) && !$lead->email) {
$lead->update(['email' => $metadata['email']]);
}
$onceEvents = ['demo_requested', 'free_trial_started', 'contact_form_submitted'];
if (in_array($event, $onceEvents)) {
if (LeadEvent::where('lead_score_id', $lead->id)->where('event', $event)->exists()) {
return $lead;
}
}
LeadEvent::create([
'lead_score_id' => $lead->id,
'event' => $event,
'points' => $points,
'metadata' => $metadata,
]);
$breakdown = $lead->score_breakdown ?? [];
$breakdown[$event] = ($breakdown[$event] ?? 0) + $points;
$newScore = $lead->score + $points;
$newStage = $this->calculateStage($newScore);
$lead->update([
'score' => $newScore,
'score_breakdown' => $breakdown,
'stage' => $newStage,
]);
$thresholds = config('lead_scoring.thresholds');
$prevStage = $this->calculateStage($lead->score - $points);
if ($newStage !== $prevStage) {
$this->onStageChange($lead, $prevStage, $newStage);
}
return $lead->fresh();
}
private function calculateStage(int $score): string
{
$thresholds = config('lead_scoring.thresholds');
if ($score >= $thresholds['sql']) return 'sql';
if ($score >= $thresholds['mql']) return 'mql';
if ($score >= $thresholds['hot']) return 'hot';
if ($score >= $thresholds['warm']) return 'warm';
return 'cold';
}
private function onStageChange(LeadScore $lead, string $from, string $to): void
{
Log::info("Lead stage change: {$from} → {$to}", ['lead_id' => $lead->id, 'score' => $lead->score]);
if ($to === 'mql') {
$lead->update(['mql_reached_at' => now()]);
SyncLeadToCrm::dispatch($lead);
Notification::route('slack', '#leads-hot')
->notify(new MqlReachedNotification($lead));
}
if ($to === 'sql') {
$lead->update(['qualified_at' => now()]);
$salesManager = User::salesManager()->inRandomOrder()->first();
$salesManager?->notify(new SqlLeadAssigned($lead));
}
}
}
Відстеження подій на фронтенді
class LeadTracker {
private sessionId: string;
constructor() {
this.sessionId = sessionStorage.getItem('ls_session') || this.generateId();
sessionStorage.setItem('ls_session', this.sessionId);
}
async track(event: string, metadata: Record<string, any> = {}): Promise<void> {
try {
await fetch('/api/lead-score/track', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
session_id: this.sessionId,
event,
metadata: { ...metadata, page: window.location.pathname },
}),
});
} catch (e) {
// Не блокуємо UI при помилці трекінгу
}
}
private generateId(): string {
return Date.now().toString(36) + Math.random().toString(36).substr(2);
}
}
export const tracker = new LeadTracker();
Dashboard для менеджерів
SELECT
ls.email,
ls.score,
ls.stage,
ls.mql_reached_at,
COUNT(le.id) AS events_count,
MAX(le.created_at) AS last_activity
FROM lead_scores ls
JOIN lead_events le ON le.lead_score_id = ls.id
WHERE ls.stage IN ('mql', 'sql', 'hot')
AND ls.mql_reached_at >= now() - interval '7 days'
GROUP BY ls.id, ls.email, ls.score, ls.stage, ls.mql_reached_at
ORDER BY ls.score DESC;
Що входить у розробку під ключ
- Конфігурована система скорингу з 20+ подіями (можна змінювати без програміста).
- Трекінг на фронтенді без втрати продуктивності (асинхронний fetch, не блокує UI).
- Автоматична передача лідів у популярні CRM (AmoCRM, Bitrix24, Salesforce) при досягненні MQL.
- Дашборд для менеджерів із фільтрацією за стадіями та підсвічуванням гарячих лідів.
- Документація з правил скорингу та інструкція для маркетологів.
- Техпідтримка 30 днів після запуску.
Як відбувається впровадження
- Аналітика: збираємо ваші поточні критерії кваліфікації та типовий шлях клієнта.
- Проектування: налаштовуємо ваги подій, пороги стадій, інтеграції.
- Реалізація: пишемо backend і frontend, підключаємо CRM через API.
- Тестування: перевіряємо коректність скорингу на історичних даних.
- Запуск: деплой та навчання команди.
Строки та вартість
Строки — від 8 до 14 робочих днів залежно від складності CRM та кількості кастомних подій. Вартість впровадження визначається після аналізу ваших потреб та інтеграцій. Наш досвід понад 5 років у B2B-розробці дозволяє гарантувати точність скорингу на рівні 95%. Бюджет на розробку починається від $3,000. Економія на ручній кваліфікації може сягати $15,000 на рік. Ми сертифіковані інтегратори AmoCRM та Bitrix24.
Типові помилки при реалізації lead scoring
- Зараховувати одну й ту саму подію багаторазово (потрібен флаг once-подій).
- Ігнорувати негативні сигнали — лід може бути холодним, навіть якщо багато клікає.
- Не оновлювати пороги з часом — поведінка аудиторії змінюється, правила потрібно адаптувати.
Отримайте консультацію з налаштування lead scoring — оцінимо ваш проєкт безкоштовно. Наша система lead scoring (оцінка лідів) на сайті включає поведінковий скоринг, автоматизацію кваліфікації лідів та інтеграцію з CRM, що дозволяє ефективно відстежувати MQL і SQL через трекінг подій. Це рішення ідеально для B2B-компаній, які потребують точного скорингу лідів. Система підвищує ефективність продажів у 3 рази порівняно з ручною кваліфікацією.
Lead scoring — методика, описана в Wikipedia.







