Реалізація Lead Nurturing (прогрів лідів) на Laravel

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 2062 послуг
Реалізація Lead Nurturing (прогрів лідів) на Laravel
Складний
~5 днів
Часті запитання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1361
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1251
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    957
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1189
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    929
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Розробка веб-сайту для компанії ФІКСПЕР
    948

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

  1. Аналітика: вивчаємо вашу воронку, точки дотику, поточні email-розсилки.
  2. Проектування: визначаємо тригери, сегменти, ланцюжки листів.
  3. Налаштування: реалізуємо моделі, сервіси, jobs, інтегруємо з CRM і системою подій.
  4. Тестування: перевіряємо кожен сценарій, логіку умов, таймінги.
  5. Запуск: деплой на продакшн, моніторинг перших листів.
  6. Оптимізація: аналізуємо відкриття, кліки, конверсії, коригуємо послідовності.

Строки: повна система з аналітикою — 10–14 робочих днів. Для розрахунку строків та обсягу робіт зв'яжіться з нами.

Що входить в роботу

  • документація з описом усіх послідовностей, умов і тригерів;
  • код (моделі, NurtureService, ProcessNurtureEmails, тести);
  • інтеграція з вашою CRM (через webhook або API);
  • навчання команди роботі з системою;
  • підтримка 1 місяць після запуску.

Отримайте безкоштовний аудит вашої поточної системи за 1 день — просто зв'яжіться з нами. Замовте реалізацію lead nurturing і почніть прогрівати лідів автоматично.

Інтеграція email розсилок: чому вона часто ламається?

Ми стикалися з тим, що тригерний лист через 10 хвилин після реєстрації конвертує в 4–5 разів краще, ніж той самий лист через 24 години. Це не маркетинговий міф — це механіка: поки користувач теплий, поки пам'ятає контекст. Але більшість інтеграцій з розсильниками зроблені так: форма сабмітиться → синхронний HTTP-запит до API → якщо API гальмує, користувач чекає 3 секунди → лист йде або не йде, ніхто не знає.

Якщо ви зіткнулися з втраченими листами або потраплянням у спам, замовте аудит існуючої інтеграції — ми знайдемо вузькі місця за 2 дні.

Провайдери та їх API

Unisender — російський провайдер, популярний у сегменті SMB. REST API, простий. Додавання контакту: importContacts, відправка транзакційного листа: sendEmail. Важливо: для транзакційних листів (підтвердження замовлення, скидання пароля) Unisender Go — окремий сервіс з іншим API та окремою ціною. Змішувати масові розсилки та транзакційні в одному потоці — погана ідея для репутації домену.

SendPulse — надає email, SMS, web push, Viber, Telegram-боти через єдиний API. Для проєктів, де потрібен омніканал, це зручно. Automation 360 — візуальний конструктор ланцюжків, можна запустити автоматизацію через API event. SDK для PHP (sendpulse/rest-api-php-sdk) підтримується, але оновлюється нерегулярно — краще використовувати напряму через Guzzle.

Mailchimp — вибір для міжнародної аудиторії та маркетингових команд, звиклих до екосистеми Mailchimp. Transactional email — через Mandrill (дочірній сервіс). Marketing API v3 для управління списками, тегами, кампаніями. Webhook для подій: відкриття, клік, відписка, bounce.

SMS. Для Росії: СМСЦ, МТС Exolve, Devino Telecom, SMS Aero. API у всіх схожий: метод send, параметри phone, message, sender (ім'я відправника — потрібно реєструвати окремо у оператора). Один нюанс: ім'я відправника має бути зареєстровано через агрегатора з договором — без цього SMS не відправляться на мережі МТС/МегаФон/Білайн.

Провайдер Тип Транзакційні листи Маркетингові Особливості
Unisender email+SMS Unisender Go (окремо) так Популярний в РФ, простий REST
SendPulse email+SMS+web push+Viber так так Єдиний API, омніканальність
Mailchimp email Mandrill так Аналітика, міжнародний
Twilio SMS+email так ні Глобальний, дорогий в РФ

Як побудувати інтеграцію, щоб не втрачати листи?

Розділяємо транзакційні та маркетингові потоки

Транзакційні листи (підтвердження замовлення, скидання пароля, статус доставки) — через окремий домен-відправник або субдомен tx.example.com. Маркетингові розсилки — через mail.example.com або news.example.com. Якщо маркетингова розсилка отримає багато скарг на спам, це не повинно зачепити репутацію транзакційного потоку. Згідно з документацією SendGrid, транзакційні повідомлення слід відправляти через виділений IP-пул для запобігання перехресному впливу.

Черга та retry

Будь-який виклик до email API — через чергу (Laravel Queue, Bull, Celery). Якщо Unisender повернув 503 — задача йде в retry через 5 хвилин, потім 15, потім 60. Після 5 невдалих спроб — у dead letter queue з алертом. Користувач при цьому вже отримав свій 200 OK і не знає про проблему. Завдяки цьому підходу bounce rate на проєктах знижується до 0.5%.

Приклад job для Laravel:

public function handle(): void
{
    try {
        $response = Http::post(config('services.unisender.email_url'), $this->params);
        if ($response->failed()) {
            $this->release(300); // retry через 5 хв
        }
    } catch (\Throwable $e) {
        $this->release(300);
    }
}

Шаблони

Зберігаємо шаблони в коді (Blade, Twig, React Email), не в інтерфейсі провайдера. Причини: версіонування через Git, preview у браузері без відправки, можливість тестування. Для складних шаблонів з динамічним контентом — react-email з експортом в HTML через @react-email/render.

Валідація та згоди

Перед додаванням контакту до списку — double opt-in (лист з підтвердженням). Зберігати факт підтвердження з timestamp у своїй БД. При відписці — синхронно відписуємо і у провайдера, і в своїй базі. Ігнорувати webhook відписки — прямий шлях до блокування акаунта у провайдера. Всі процеси відповідають ФЗ-152 про персональні дані.

Як налаштувати DKIM для домену-відправника?

DKIM дозволяє підписувати листи цифровим підписом, що підвищує довіру поштових серверів.

  1. Згенеруйте пару ключів (наприклад, через OpenSSL: openssl genrsa -out private.key 2048).
  2. Опублікуйте публічний ключ у DNS як TXT-запис для селектора (наприклад, mail._domainkey.tx.example.com).
  3. Вкажіть селектор у провайдера (SendGrid, Mailgun, Unisender).
  4. Перевірте командою dig TXT mail._domainkey.tx.example.com.

Моніторинг доставності

Підключаємо webhook від провайдера на події bounce (жорсткий і м'який), spam_complaint, unsubscribe. Жорсткий bounce — негайно позначаємо email як невалідний у своїй БД, більше не відправляємо. М'який bounce 3 рази поспіль — те саме. Метрики: open rate, click rate, bounce rate, unsubscribe rate — дивимося не рідше разу на тиждень. Наші сертифіковані інженери налаштовують алерти в Grafana/Prometheus.

Чому важливо розділяти потоки?

Якщо відправити маркетингову розсилку з того ж домену, що й транзакційні листи, отримавши скарги на спам, ви ризикуєте заблокувати домен — і користувачі перестануть отримувати навіть підтвердження замовлень. SPF, DKIM, DMARC (Wikipedia SPF, Wikipedia DKIM) повинні бути налаштовані окремо для кожного потоку. Ми використовуємо субдомени з різними DNS-записами.

Обсяг робіт з інтеграції

  • Аудит поточних потоків комунікації та репутації домену (SPF, DKIM, DMARC)
  • Вибір провайдера та схеми: транзакційний vs маркетинговий трафік
  • Налаштування DNS-записів SPF, DKIM, DMARC (Wikipedia DMARC)
  • Розробка шаблонів листів (HTML + динамічний контент)
  • Інтеграція з бекендом через черги та API
  • Налаштування webhook для доставності та скарг
  • Документація з експлуатації та навчання команди
  • Гарантія доставності та підтримка після запуску

Терміни та вартість

Сценарій Термін (робочі дні) Примітка
Базові транзакційні листи (один провайдер) 5–7 днів Ціна розраховується індивідуально після аудиту
Тригерні ланцюжки + SMS + веб-пуши 10–20 днів Ціна розраховується індивідуально після аудиту
Повна омніканальна автоматизація 20–40 днів Ціна розраховується індивідуально після аудиту

Вартість розраховується індивідуально після аудиту. Ми працюємо під ключ: від аналізу до моніторингу в продакшені. Отримайте консультацію інженера — оцінимо проєкт безкоштовно та скажемо точні терміни. Досвід більше 7 років в інтеграції поштових сервісів, реалізовано 50+ проєктів. Замовте безкоштовний аудит поточної інтеграції — отримайте звіт з рекомендаціями.