Представьте: интернет-магазин с аудиторией 50 000 посетителей ежемесячно запускает реферальную программу. Через месяц выясняется, что 40% переходов по реферальным ссылкам не атрибутированы — пользователи переходили из соцсетей, не регистрировались сразу, а возвращались через неделю. Без правильной атрибуции рефералы теряются, и программа не окупается. По нашим данным, корректная настройка cookie и трекинга позволяет вернуть до 40% потерянной прибыли. Именно поэтому мы делаем акцент на защищённой cookie с httpOnly и sameSite: lax, которая живёт 30 дней.
Как реферальная программа решает ключевые проблемы бизнеса?
Основные сложности при внедрении — атрибуция, накрутка, коллизии кодов и негибкая логика начисления. Без системного подхода программа теряет эффективность. Наше решение закрывает каждую из этих проблем: от генерации уникальных кодов до автоматического начисления бонусов.
Почему атрибуция рефералов критична?
Без корректной атрибуции рефералы теряются. По нашим данным, 80% рефералов приходят в первые 7 дней, но если cookie живёт меньше, до 30% не будут учтены. Именно поэтому мы используем 30-дневную cookie с httpOnly и sameSite: lax.
Генерация уникальных кодов без коллизий
Коллизии кодов — типичная проблема готовых модулей. При тысячах пользователей короткие коды повторяются. Мы используем библиотеку nanoid с алфавитом без путающихся символов (1, l, I, 0, O) и длиной 8 символов. Делаем до 5 попыток при коллизии — вероятность повторения ничтожна. Для ускорения проверки коллизий мы используем хэширование и кэшируем существующие коды в 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. Наш клиент отметил, что после внедрения правильной атрибуции реферальная программа стала приносить на 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 |
| Безопасность | Контроль на каждом уровне | Возможные уязвимости в плагине |
| Стоимость владения | Разработка под ключ | Лицензия + доработки под специфику |
Самописная система оправдана, если у вас нестандартные правила начисления, несколько валют или глубокая интеграция с 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 и инфопродуктов. Гарантируем корректную атрибуцию и масштабирование — нагрузка до 100 000 рефералов в сутки без потери производительности. Все коды открыты и документированы.
Закажите разработку реферальной системы, которая будет приносить реальные результаты. Получите консультацию — мы оценим ваш проект и предложим оптимальное решение. Свяжитесь с нами, чтобы обсудить детали.







