Ми запустили рекламну кампанію, зібрали сотні лідів, а продажів немає. Ліди не прогріті, листи йдуть не тим або не вчасно, менеджери витрачають години на ручну розсилку. Це типова картина без автоматизованої системи lead nurturing. Згідно з дослідженнями Forrester, автоматизація прогріву підвищує конверсію лідів на 30-50% і скорочує час обробки на 80% — економія, порівнянна із зарплатою двох менеджерів (до $7,000 на місяць).
Ми реалізували десятки таких систем на Laravel — від простих email-ланцюжків до мультитригерних сценаріїв з умовною логікою. П'ять років на ринку, понад 50 проєктів з автоматизації: гарантуємо стабільну роботу під високим навантаженням. Кастомне рішення дає в 3 рази більше гнучкості, ніж готові CRM-модулі, і не вимагає щомісячної підписки.
Які проблеми вирішує lead nurturing?
Низька конверсія через відсутність сегментації: усім лідам одне й те саме письмо. Використовуємо NurtureSequence з умовами (json-поле conditions), щоб надсилати контент лише відповідній аудиторії.
Ручне надсилання: забувають, дублюють, не вчасно. Job ProcessNurtureEmails запускається кожні 15 хвилин через Scheduler і автоматично обирає, кому і що надсилати.
Немає відстеження поведінки: не знаємо, чи відкрив лід листа, чи перейшов за посиланням. Кожна подія (відкриття, клік, конверсія) записується і може впливати на подальший сценарій.
Ліди йдуть до конкурентів після пробного періоду. Послідовність із зростаючим урдженсі (день 7, 10, 14) повертає до 30% клієнтів, що йдуть.
Як працює система тригерів у lead nurturing?
Тригер — це подія, яка запускає enrollment у послідовність. У нашій моделі NurtureSequence є поле trigger: 'trial_started', 'whitepaper_downloaded', 'pricing_page_3x'. Коли відбувається подія, викликається NurtureService::enroll($email, $trigger, $context). Сервіс знаходить відповідні послідовності за тригером і умовами, потім створює запис у nurture_enrollments із зазначенням часу першого листа.
Schema::create('nurture_sequences', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('trigger'); // 'trial_started', 'whitepaper_downloaded', 'pricing_page_3x'
$table->json('conditions')->nullable(); // {"plan": "free", "source": "organic"}
$table->boolean('is_active')->default(true);
$table->timestamps();
});
Schema::create('nurture_emails', function (Blueprint $table) {
$table->id();
$table->foreignId('sequence_id')->constrained('nurture_sequences')->cascadeOnDelete();
$table->integer('delay_hours'); // Надіслати через N годин після попереднього
$table->string('subject');
$table->string('template'); // Ім'я Blade-шаблону
$table->json('conditions')->nullable(); // Додаткові умови надсилання
$table->integer('order')->default(0);
});
Schema::create('nurture_enrollments', function (Blueprint $table) {
$table->id();
$table->foreignId('sequence_id')->constrained('nurture_sequences');
$table->foreignId('user_id')->nullable()->constrained()->nullOnDelete();
$table->string('email');
$table->integer('current_step')->default(0);
$table->enum('status', ['active', 'completed', 'exited', 'converted'])->default('active');
$table->timestamp('next_email_at')->nullable();
$table->timestamp('converted_at')->nullable();
$table->timestamps();
});
class NurtureService
{
public function enroll(string $email, string $trigger, array $context = [], ?int $userId = null): void
{
// Знаходимо відповідні послідовності для тригера
$sequences = NurtureSequence::active()
->where('trigger', $trigger)
->get()
->filter(fn($seq) => $this->matchesConditions($seq->conditions, $context));
foreach ($sequences as $sequence) {
// Не записуємо якщо вже в активній послідовності
$existing = NurtureEnrollment::where('sequence_id', $sequence->id)
->where('email', $email)
->whereIn('status', ['active'])
->exists();
if ($existing) continue;
$firstEmail = $sequence->emails()->orderBy('order')->first();
NurtureEnrollment::create([
'sequence_id' => $sequence->id,
'user_id' => $userId,
'email' => $email,
'current_step' => 0,
'next_email_at' => now()->addHours($firstEmail->delay_hours ?? 0),
]);
}
}
public function exit(string $email, string $reason = 'manual'): void
{
NurtureEnrollment::where('email', $email)
->where('status', 'active')
->update(['status' => 'exited']);
}
public function markConverted(string $email): void
{
NurtureEnrollment::where('email', $email)
->where('status', 'active')
->update(['status' => 'converted', 'converted_at' => now()]);
}
private function matchesConditions(?array $conditions, array $context): bool
{
if (!$conditions) return true;
foreach ($conditions as $key => $value) {
if (($context[$key] ?? null) != $value) return false;
}
return true;
}
}
Приклад послідовності для пробного періоду
| День | Тема листа | Мета |
|---|---|---|
| 0 | Ласкаво просимо! Ось як почати | Онбординг |
| 1 | 3 функції, які економлять час | Цінність |
| 3 | Відео: як інші компанії використовують нас | Соціальний доказ |
| 5 | Ви використовували функцію X? | Engagement-чек (тільки якщо не використовував) |
| 7 | Ваш тріал закінчується через 7 днів | Urgency |
| 10 | Спеціальна пропозиція для вас | Оффер |
| 14 | Що вам сподобалось/не сподобалось? | CSAT + збереження |
Job для надсилання листів за розкладом — реалізація lead nurturing
// Запускається кожні 15 хвилин через Scheduler
class **ProcessNurtureEmails** implements ShouldQueue
{
public function handle(): void
{
$enrollments = NurtureEnrollment::where('status', 'active')
->where('next_email_at', '<=', now())
->with(['sequence.emails'])
->get();
foreach ($enrollments as $enrollment) {
$emails = $enrollment->sequence->emails->sortBy('order');
$currentEmail = $emails->get($enrollment->current_step);
if (!$currentEmail) {
$enrollment->update(['status' => 'completed']);
continue;
}
// Перевіряємо додаткові умови кроку
if ($currentEmail->conditions && !$this->checkStepConditions($enrollment, $currentEmail->conditions)) {
// Пропускаємо крок
$this->advanceToNextStep($enrollment, $emails);
continue;
}
// Перевіряємо чи не відписався користувач
if (EmailUnsubscribe::where('email', $enrollment->email)->exists()) {
$enrollment->update(['status' => 'exited']);
continue;
}
// Надсилаємо листа
Mail::to($enrollment->email)->queue(
new NurtureEmail($enrollment, $currentEmail)
);
$this->advanceToNextStep($enrollment, $emails);
}
}
private function advanceToNextStep(NurtureEnrollment $enrollment, Collection $emails): void
{
$nextStep = $enrollment->current_step + 1;
$nextEmail = $emails->get($nextStep);
if ($nextEmail) {
$enrollment->update([
'current_step' => $nextStep,
'next_email_at' => now()->addHours($nextEmail->delay_hours),
]);
} else {
$enrollment->update(['status' => 'completed', 'current_step' => $nextStep]);
}
}
}
Чому сегментація лідів критична для lead nurturing?
Без сегментації ви надсилаєте однакові листи всім — і тим, хто тільки зайшов, і тим, хто вже майже купив. Це дратує і знижує конверсію. У нашій системі кожен лист може мати свої умови: надіслати engagement-лист лише якщо користувач не використовував ключову функцію за 5 днів. Це підвищує релевантність, а конверсія в цільову послідовність зростає в 3 рази порівняно з масовою розсилкою.
Чому кастомне рішення краще за готові сервіси?
| Критерій | Кастомна система на Laravel | Готові сервіси (Mailchimp, ActiveCampaign) |
|---|---|---|
| Гнучкість умов | Безмежна (будь-які json-умови) | Обмежена (набір фільтрів) |
| Інтеграція з CRM | Повна через API або webhook | Через готові модулі (не завжди) |
| Вартість | Одноразова розробка | Щомісячна підписка $50-500+ |
| Контроль даних | Повний (свій сервер) | Дані на стороні сервісу |
| Масштабування | Під будь-яке навантаження | Залежить від тарифу |
| Аналітика | Кастомні SQL-звіти | Вбудовані дашборди |
Кастомне рішення дає в 3 рази більше гнучкості, ніж готові CRM-модулі, і не вимагає щомісячної підписки. За 10-14 робочих днів ви отримуєте повністю контрольовану систему, адаптовану під ваш бізнес.
Процес впровадження lead nurturing
- Аналітика: вивчаємо вашу воронку, точки дотику, поточні email-розсилки.
- Проектування: визначаємо тригери, сегменти, ланцюжки листів.
- Налаштування: реалізуємо моделі, сервіси, jobs, інтегруємо з CRM і системою подій.
- Тестування: перевіряємо кожен сценарій, логіку умов, таймінги.
- Запуск: деплой на продакшн, моніторинг перших листів.
- Оптимізація: аналізуємо відкриття, кліки, конверсії, коригуємо послідовності.
Строки: повна система з аналітикою — 10–14 робочих днів. Для розрахунку строків та обсягу робіт зв'яжіться з нами.
Що входить в роботу
- документація з описом усіх послідовностей, умов і тригерів;
- код (моделі,
NurtureService,ProcessNurtureEmails, тести); - інтеграція з вашою CRM (через webhook або API);
- навчання команди роботі з системою;
- підтримка 1 місяць після запуску.
Отримайте безкоштовний аудит вашої поточної системи за 1 день — просто зв'яжіться з нами. Замовте реалізацію lead nurturing і почніть прогрівати лідів автоматично.







