Розробка триггерних email-послідовностей (welcome, забутий кошик)
Триггерні послідовності — це ланцюги листів, які запускаються автоматично у відповідь на дію користувача. Welcome-серія, забутий кошик, re-engagement, onboarding-підказки. Кожен лист відправляється у потрібний момент, а не за розписанням.
Архітектура
Типова схема: додаток публікує події → воркер обробляє та ставить задачі в чергу з задержкою → задачі виконують відправлення листів.
Дія користувача → Подія App → Queue (BullMQ) → Email Worker → ESP (Resend/SendGrid)
↓
Sequence Engine
(відстежує прогрес,
перевіряє умови)
Реалізація на BullMQ
npm install bullmq ioredis
import { Queue, Worker, Job } from 'bullmq';
import Redis from 'ioredis';
const connection = new Redis(process.env.REDIS_URL);
const emailQueue = new Queue('email-sequences', { connection });
// Запуск welcome-послідовності
async function startWelcomeSequence(userId: string, email: string, name: string) {
const baseData = { userId, email, name };
// Лист 1: одразу після реєстрації
await emailQueue.add('welcome-step-1', baseData, {
delay: 0,
jobId: `welcome-1-${userId}`, // дедупликація
});
// Лист 2: через 1 день — як користуватися продуктом
await emailQueue.add('welcome-step-2', baseData, {
delay: 24 * 60 * 60 * 1000,
jobId: `welcome-2-${userId}`,
});
// Лист 3: через 3 дня — приклади use case
await emailQueue.add('welcome-step-3', baseData, {
delay: 3 * 24 * 60 * 60 * 1000,
jobId: `welcome-3-${userId}`,
});
// Лист 4: через 7 днів — якщо не активував — нагадування
await emailQueue.add('welcome-step-4', baseData, {
delay: 7 * 24 * 60 * 60 * 1000,
jobId: `welcome-4-${userId}`,
});
}
Воркер з умовами
const worker = new Worker(
'email-sequences',
async (job: Job) => {
const { userId, email, name } = job.data;
// Перевірити, що користувач не відписався
const user = await db.users.findById(userId);
if (!user || user.unsubscribed) return;
switch (job.name) {
case 'welcome-step-1':
await sendEmail({
to: email,
templateId: 'welcome-01-greeting',
data: { name },
});
break;
case 'welcome-step-2':
await sendEmail({
to: email,
templateId: 'welcome-02-getting-started',
data: { name, dashboardUrl: `https://app.example.com/dashboard` },
});
break;
case 'welcome-step-4':
// Відправляти лише якщо користувач не створив ні одного проекту
const projectCount = await db.projects.countByUser(userId);
if (projectCount > 0) return; // пропустити — він уже активний
await sendEmail({
to: email,
templateId: 'welcome-04-reminder',
data: { name },
});
break;
Строки реалізації
Реалізація welcome та забутого кошика послідовностей — 2–3 дня.







