Разработка реферальной системы под ключ
Представьте: запускаете реферальную программу, а через неделю видите в логах сотни регистраций от одного IP с одинаковым реферальным кодом. Без грамотной атрибуции и fraud-защиты такие накрутки съедают бюджет и демотивируют реальных пользователей. Мы проектируем и внедряем реферальные программы, которые конвертируют ваших клиентов в агентов привлечения, — с генерацией уникальных кодов, надёжной атрибуцией через cookie и многоуровневой защитой от фрода. За пять лет мы построили более 30 таких решений для e-commerce, SaaS и образовательных платформ. Вот как выглядит техническая реализация.
Модель данных и генерация кода
Схема базы данных включает четыре ключевые таблицы: referral_codes, referral_clicks, referrals и referral_rewards. Каждый уникальный код генерируется для пользователя один раз и остаётся неизменным. Мы используем читаемые коды на основе имени или сочетания букв и цифр — так пользователи легко запоминают и передают их. Для быстрого поиска мы добавляем индексы по полю code и user_id.
CREATE TABLE referral_codes (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT REFERENCES users(id),
code VARCHAR(32) UNIQUE NOT NULL,
type VARCHAR(32) DEFAULT 'personal',
created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE TABLE referral_clicks (
id BIGSERIAL PRIMARY KEY,
code_id BIGINT REFERENCES referral_codes(id),
ip INET,
user_agent TEXT,
landed_at TIMESTAMPTZ DEFAULT NOW(),
converted BOOLEAN DEFAULT FALSE
);
CREATE TABLE referrals (
id BIGSERIAL PRIMARY KEY,
referrer_id BIGINT REFERENCES users(id),
referred_id BIGINT REFERENCES users(id),
code_id BIGINT REFERENCES referral_codes(id),
status VARCHAR(32) DEFAULT 'pending',
qualified_at TIMESTAMPTZ,
created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE TABLE referral_rewards (
id BIGSERIAL PRIMARY KEY,
referral_id BIGINT REFERENCES referrals(id),
recipient_id BIGINT REFERENCES users(id),
type VARCHAR(32),
amount DECIMAL(14,2),
currency CHAR(3) DEFAULT 'RUB',
status VARCHAR(32) DEFAULT 'pending',
paid_at TIMESTAMPTZ
);
Как работает атрибуция реферала?
Атрибуция начинается с middleware, который перехватывает GET-параметр ?ref=CODE и сохраняет его в сессию. Даже если пользователь не зарегистрировался сразу, код остаётся привязанным к сессии на протяжении всего визита. При регистрации мы проверяем наличие кода и создаём запись в referrals со статусом pending. Затем логируем клик и отмечаем его как сконвертированный. Время жизни сессии можно настроить — по умолчанию 24 часа, чтобы атрибуция была точной.
// Middleware: ReferralTracker
class ReferralTrackerMiddleware {
public function handle(Request $request, Closure $next): Response {
$code = $request->query('ref');
if ($code && !session()->has('referral_code')) {
$referralCode = ReferralCode::where('code', $code)->first();
if ($referralCode) {
session(['referral_code' => $code]);
ReferralClick::create([
'code_id' => $referralCode->id,
'ip' => $request->ip(),
'user_agent' => $request->userAgent(),
]);
}
}
return $next($request);
}
}
// В UserRegistrationService
public function register(array $data): User {
$user = User::create($data);
$referralCode = session()->pull('referral_code');
if ($referralCode) {
$code = ReferralCode::where('code', $referralCode)->first();
if ($code && $code->user_id !== $user->id) {
Referral::create([
'referrer_id' => $code->user_id,
'referred_id' => $user->id,
'code_id' => $code->id,
'status' => 'pending',
]);
ReferralClick::where('code_id', $code->id)
->where('converted', false)
->latest('landed_at')
->first()
?->update(['converted' => true]);
}
}
return $user;
}
Условия начисления и типы вознаграждений
Реферал считается квалифицированным только после выполнения целевого действия — например, первой оплаты или заполнения профиля. Мы реализуем это через систему событий. Сравнение типов вознаграждений:
| Тип | Описание | Когда подходит |
|---|---|---|
| Fixed | Фиксированная сумма за квалификацию | Низкий средний чек, простые продукты |
| Percentage | Процент от суммы покупки реферала | Высокий средний чек, подписки |
| Points | Бонусные баллы | Экосистемы с внутренней валютой |
Фиксированное вознаграждение проще в реализации, но процентное масштабируется с ростом среднего чека. Двусторонняя программа (бонус и пригласившему, и новому пользователю) даёт дополнительный импульс регистрациям. На практике процентная схема привлекает в два раза больше активных рефереров, чем фиксированная.
Как выбрать тип вознаграждения?
Всё зависит от среднего чека и модели монетизации. Если продукт стоит недорого, фиксированная сумма от нескольких сотен работает отлично. Для подписок с высоким LTV выгоднее процент — например, 10% от первой оплаты мотивирует сильнее, чем разовый бонус. Мы всегда анализируем экономику и предлагаем оптимизированную схему. В одном из проектов переход с фиксированного бонуса на процентный позволил снизить CPA почти вдвое при той же мотивации рефереров.
Почему важна защита от фрода?
Без защиты реферальная программа становится лёгкой добычей для накруток. Мы внедряем базовые проверки: запрет саморефералов, ограничение по количеству регистраций с одного IP (не более трёх за семь дней), а также флаги для ручной проверки подозрительных цепочек. Отдельно настраивается валидация срока действия сессии — чтобы атрибуция не работала через месяц после клика. По нашим данным, fraud-защита снижает потери в несколько раз по сравнению с отсутствием защиты.
Что входит в работу
- Документация схемы данных и описание API-эндпоинтов для личного кабинета реферера.
- Административный интерфейс для управления реферальными программами и просмотра статистики.
- Написание unit-тестов для атрибуции и начисления вознаграждений.
- Развёртывание на сервере или в контейнере (Docker).
- Интеграция с платёжной системой для batch-выплат.
- Подключение к CRM через REST API для синхронизации партнёрских данных.
Процесс работы
- Аналитика — разбираем целевую аудиторию, модель монетизации, условия квалификации.
- Проектирование — выбираем топографию (одноуровневая/MLM), рисуем ERD, согласовываем логику атрибуции.
- Реализация — пишем код на Laravel 11 / Next.js 14 (React), настраиваем очереди для отложенных выплат.
- Тестирование — проверяем цепочки: клик → регистрация → покупка → начисление → выплата.
- Деплой — выкатываем на staging, проводим нагрузочное тестирование (гарантируем 10k concurrent clicks), затем запускаем в production.
Сроки
| Версия | Срок |
|---|---|
| Базовая (коды, атрибуция, фиксированная награда) | 1–1,5 нед |
| Двусторонняя + процентные бонусы | 2–2,5 нед |
| Многоуровневая (MLM) | +1–2 нед |
Стоимость рассчитывается индивидуально: зависит от сложности схемы, необходимости интеграции с CRM и требований к fraud-защите. Свяжитесь с нами для обсуждения вашей реферальной программы — подберём оптимальное решение. Получите консультацию по выбору схемы вознаграждения, опираясь на наш опыт с тридцатью проектами.







