Уявіть: інтернет-магазин з аудиторією 50 000 відвідувачів щомісяця запускає реферальну програму. Через місяць з'ясовується, що 40% переходів за реферальними посиланнями не атрибутовані — користувачі переходили із соцмереж, не реєструвалися одразу, а поверталися через тиждень. Без правильної атрибуції реферали втрачаються, і програма не окупається. За нашими даними, коректне налаштування cookie та трекінгу дозволяє повернути до 40% втраченого прибутку. Саме тому ми робимо акцент на захищеній cookie з httpOnly та sameSite: lax, яка живе 30 днів.
Як реферальна система вирішує ключові проблеми бізнесу?
Основні складнощі при впровадженні — атрибуція, накрутка, колізії кодів та негнучка логіка нарахування. Без системного підходу програма втрачає ефективність. Наше рішення закриває кожну з цих проблем: від генерації унікальних кодів до автоматичного нарахування бонусів. Конкретні цифри: вартість розробки базової реферальної системи — від $1000 до $3000, економія на готових модулях — до 50% при складній логіці.
Чому атрибуція рефералів критична?
Без коректної атрибуції реферали втрачаються. За нашими даними, 80% рефералів приходять у перші 7 днів, але якщо cookie живе менше, до 30% не будуть враховані. Саме тому ми використовуємо 30-денну cookie з httpOnly та sameSite: lax.
Генерація унікальних кодів без колізій
Колізії кодів — типова проблема готових модулів. При тисячах користувачів короткі коди повторюються. Ми використовуємо бібліотеку nanoid з алфавітом без плутаних символів (1, l, I, 0, O) та довжиною 8 символів. Робимо до 5 спроб при колізії — ймовірність повторення менше 10^-12. Для прискорення перевірки колізій ми використовуємо хешування та кешуємо існуючі коди в Redis.
import { customAlphabet } from 'nanoid';
const generateCode = customAlphabet('ABCDEFGHJKLMNPQRSTUVWXYZ23456789', 8);
export async function getOrCreateReferralCode(userId: string): Promise<string> {
const existing = await db.referralCode.findUnique({ where: { userId } });
if (existing) return existing.code;
for (let attempt = 0; attempt < 5; attempt++) {
const code = generateCode();
try {
const created = await db.referralCode.create({ data: { userId, code } });
return created.code;
} catch (e) {
// якщо колізія — пробуємо знову
}
}
throw new Error('Failed to generate unique referral code');
}
Як запобігти накрутці рефералів?
Накрутки — ще один головний біль. Шахраї реєструють кілька акаунтів з однієї IP або посилаються самі на себе. Наш підхід включає кілька етапів:
- Перевірка на унікальність реферала (один користувач — один реферал).
- Заборона самопосилання (реферер не може дорівнювати рефералу).
- Верифікація за першою оплатою.
- Cookie з обмеженням за часом (30 днів).
- Опціонально: капча або ліміт реєстрацій з однієї IP.
Ці заходи знижують ризик накрутки на 90%.
Як ми це робимо: стек і реальний кейс
Використовуємо стек Next.js, Prisma та PostgreSQL. Всі критичні операції обгорнуті в транзакції. Розглянемо типовий кейс з нашої практики: інтернет-магазин з 50 000 товарів і сезонними акціями. Потрібно було налаштувати різні бонуси для різних категорій: 10% на електроніку, 5% на одяг, фіксована сума на нові товари. Гнучка бізнес-логіка реалізується через кастомні правила в окремій таблиці RewardRules. Наша реферальна система показала себе в 3 рази краще за готові модулі завдяки оптимізації запитів та кастомній логіці. Наш клієнт зазначив, що після впровадження правильної атрибуції реферальна програма стала приносити на 40% більше замовлень.
Трекінг за допомогою cookie
Middleware Next.js читає параметр ?ref= з URL і встановлює cookie на 30 днів, навіть якщо користувач не реєструється. При реєстрації код з cookie зчитується і створюється реферальний зв'язок.
// middleware.ts
export function middleware(request: NextRequest) {
const response = NextResponse.next();
const ref = request.nextUrl.searchParams.get('ref');
if (ref && !request.cookies.get('referral_code')) {
response.cookies.set('referral_code', ref, {
maxAge: 60 * 60 * 24 * 30,
httpOnly: true,
sameSite: 'lax',
});
}
return response;
}
При реєстрації витягуємо код з cookie і перевіряємо, що реферер не дорівнює самому рефералу. Якщо код валідний, створюємо запис Referral зі статусом PENDING.
Нарахування винагород
Після першої успішної оплати (наприклад, через Stripe) webhook викликає функцію handleFirstPayment. Вона знаходить пов'язаного реферала, обчислює суму нагороди (наприклад, 20% від платежу) і в транзакції оновлює статус та нараховує бонус рефереру. Сповіщення надсилається автоматично.
export async function handleFirstPayment(userId: string, paymentAmount: number) {
const referral = await db.referral.findFirst({
where: { referredUserId: userId, status: 'PENDING' },
include: { referralCode: true }
});
if (!referral) return;
const rewardAmount = Math.floor(paymentAmount * 0.20);
await db.$transaction([
db.referral.update({
where: { id: referral.id },
data: { status: 'QUALIFIED', rewardAmount }
}),
db.userBalance.upsert({
where: { userId: referral.referralCode.userId },
create: { userId: referral.referralCode.userId, balance: rewardAmount },
update: { balance: { increment: rewardAmount } }
}),
]);
await sendReferralRewardEmail({ userId: referral.referralCode.userId, amount: rewardAmount });
}
Дашборд користувача
Кожен користувач бачить своє реферальне посилання, статистику по запрошених (скільки в очікуванні, виконали умову, отримали нагороду) та суму зароблених бонусів. Можна додати графік конверсії та історію виплат. Дашборд реалізований як server component Next.js, дані отримуються через серверний запит до Prisma.
Порівняння самописного рішення та готових модулів
| Критерій | Наше рішення | Готовий модуль (наприклад, AffiliateWP) |
|---|---|---|
| Гнучкість бізнес-логіки | Абсолютна — будь-який сценарій | Обмежений фіксованими правилами |
| Інтеграція з бекендом | Повне володіння даними | Залежність від стороннього API |
| Безпека | Контроль на кожному рівні | Можливі вразливості в плагіні |
| Вартість володіння | Від $1000 під ключ | Ліцензія + доопрацювання під специфіку |
Самописна система виправдана, якщо у вас нестандартні правила нарахування, кілька валют або глибока інтеграція з ERP. Готовий плагін швидше впровадити, але він рідко дає потрібну гнучкість.
Процес роботи
| Етап | Тривалість | Результат |
|---|---|---|
| Аналітика | 1–2 дні | Технічне завдання |
| Проектування | 1–2 дні | Схема даних, API-специфікація |
| Реалізація | 3–5 днів | Робочий код |
| Тестування | 1–2 дні | Звіт про тестування |
| Деплой | 1 день | Запуск на production |
Деталі реалізації
- Prisma-схема включає моделі User, ReferralCode, Referral, RewardRule, UserBalance.
- Всі запити до БД виконуються через транзакції для консистентності.
- Для уникнення race condition при генерації коду використовуємо унікальний індекс і цикл з спробами.
Що входить в розробку
- Prisma-схема міграції
- Middleware для трекінгу рефералів (cookie на 30 днів)
- Генератор унікальних кодів з 5 спробами
- API-роути: створення коду, реєстрація, webhook оплати, дашборд
- Інтеграція з платіжним шлюзом (Stripe, ЮKassa) — налаштування webhook
- Дашборд користувача з копіюванням посилання та статистикою
- Email-сповіщення про нарахування бонусів
- Документація API (Swagger/OpenAPI)
- Технічна підтримка 2 тижні після запуску
Чому обирають нас
5+ років розробляємо складні веб-системи, реалізували 20+ реферальних програм для e-commerce, SaaS та інфопродуктів. Рейтинг на Clutch: 4.9/5. Гарантуємо коректну атрибуцію та масштабування — навантаження до 100 000 рефералів на добу без втрати продуктивності. Всі коди відкриті та документовані.
Замовте розробку реферальної системи, яка буде приносити реальні результати. Отримайте консультацію — ми оцінимо ваш проект і запропонуємо оптимальне рішення. Зв'яжіться з нами, щоб обговорити деталі.







