Мы запустили рекламную кампанию, собрали сотни лидов, а продаж нет. Лиды не прогреты, письма уходят не тем или не вовремя, менеджеры тратят часы на ручную рассылку. Это типичная картина без автоматизированной системы 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 и начните прогревать лидов автоматически.







