Двусторонние стимулы
Эта функция доступна только на тарифных планах Business и выше .
Двусторонний стимул — это когда выигрывают обе стороны: партнёр получает вознаграждение за приведённого клиента, а сам клиент — скидку за то, что пришёл по ссылке или промокоду партнёра.
Примеры:
- Скидка 25% на первые 12 месяцев
- Пожизненная скидка 30%
- Разовая скидка 5 000 ₽
- Бонус в единицах вашего продукта — например, 100 дополнительных заявок на баланс
Так растёт «сарафанное радио»: партнёру выгоднее делиться ссылкой, если она даёт его аудитории скидку, а аудитория охотнее переходит по ссылке, если её ждёт специальное предложение.
Как это устроено
RevRoute хранит условия скидки и знает, какому партнёру принадлежит промокод. Деньги при этом не проходят через RevRoute: скидку клиенту применяет ваша платёжная система — ЮKassa, собственный биллинг, счёт на оплату, что угодно. Заводить купоны в платёжной системе не нужно.
Цепочка целиком:
- Вы создаёте скидку для группы партнёров: процент, фиксированная сумма или бонус, срок действия.
- Партнёр получает промокод, привязанный к его реферальной ссылке, — вы создаёте его вручную в карточке партнёра или включаете автоматическое создание. Партнёр видит код в своём кабинете и раздаёт аудитории.
- Клиент приходит к вам по ссылке партнёра или вводит промокод при оплате. Ваш сайт или сервер спрашивает у RevRoute, чей это код и какие у него условия, и применяет скидку.
- После оплаты вы отправляете продажу в RevRoute — партнёру начисляется комиссия по правилам его группы.
Шаги 1 и 2 делаются в интерфейсе без разработчика. Шаги 3 и 4 — интеграция на вашей стороне: два запроса к API.
Создайте скидку для группы партнёров
Откройте группу партнёров, для которой нужна скидка, перейдите на вкладку Скидки и нажмите Создать. У группы может быть только одна скидка; нужны разные условия для разных партнёров — заведите отдельные группы.

В окне Создать скидку выберите тип предложения:
- Скидка — процент или фиксированная сумма с оплаты. Задайте величину и срок действия: разово (только первая оплата), на несколько месяцев или пожизненно.
- Бонус — предложение в единицах вашего продукта, которое начисляет ваша система: например, «100 заявок на баланс». Задайте Количество, Единицу и Описание — описание увидят партнёры и клиенты.
Переключатель Автоматически создавать промокоды включает автоматическую выдачу кодов партнёрам группы — о нём в следующем шаге. В блоке Кому видно, на каких партнёров группы распространится скидка. Подтвердите кнопкой Создать скидку.

Величину, тип и срок скидки после создания изменить нельзя — только описание, условия бонуса и автосоздание промокодов. Чтобы поменять условия, удалите скидку и создайте новую. Вместе со скидкой удаляются и промокоды партнёров этой группы.
Выдайте партнёру промокод
Промокод — это код, который партнёр даёт своей аудитории: в подкасте, видео, посте, где ссылку не вставить. Каждый код привязан к одной реферальной ссылке партнёра, и у ссылки может быть только один код. Продажи по коду засчитываются той же ссылке, что и переходы по ней.
Автоматически. Если в окне скидки включён переключатель Автоматически создавать промокоды, RevRoute создаст код для ссылки по умолчанию каждого активного партнёра группы, а новым партнёрам — при одобрении заявки. Код собирается из первого слова имени партнёра заглавными буквами и величины скидки: IVAN20OFF для 20%, IVAN5000OFF для 5 000 ₽. Если такой код в программе уже занят, к нему добавляется короткий суффикс.
Вручную. Откройте карточку партнёра, вкладку Ссылки, и нажмите Создать код в блоке Промокоды. Если кнопка неактивна, наведите на неё курсор — подсказка объяснит причину: у группы партнёра нет скидки или у всех его ссылок уже есть промокоды. Во втором случае сначала создайте партнёру новую ссылку.

Кнопка Создать код открывает окно New discount code (его интерфейс пока на английском). Выберите в списке Referral link ссылку, к которой привязать код, введите код в поле Discount code — в подсказке поля показано имя партнёра заглавными буквами, оставьте поле пустым, чтобы код собрался автоматически, — и нажмите Create discount code. Код сохраняется заглавными буквами и сразу копируется в буфер обмена.

Промокоды нельзя редактировать после создания — только удалить. Проверьте код и ссылку, прежде чем создавать его.
Созданный код появится в блоке Промокоды рядом со ссылкой, к которой он привязан. Партнёр увидит его в своём кабинете на карточке этой ссылки с пометкой Промокод — нажатие копирует код. Условия скидки партнёр видит в описании вознаграждений программы: «Новые пользователи получают скидку 10% на 6 мес.».
Примените скидку на своей стороне
Клиент может прийти к вам двумя путями, и для каждого RevRoute отдаёт партнёра и условия его скидки.
Клиент перешёл по ссылке партнёра. Если на сайте установлен скрипт RevRoute, партнёр и скидка уже лежат в window.RevRouteAnalytics и в cookie rr_partner_data — подробности в разделе «Баннер скидки на сайте» ниже. На сервере те же данные можно получить по значению cookie rr_id: GET /discount-codes/resolve?clickId=<rr_id>.
Клиент ввёл промокод при оплате. Спросите у RevRoute, чей это код. С сервера — эндпоинт GET /discount-codes/resolve с ключом API вашего рабочего пространства:
curl "https://api.revroute.ru/discount-codes/resolve?code=IVAN20OFF" \
-H "Authorization: Bearer rr_xxxxxx"Ответ (служебные поля опущены):
{
"partner": {
"id": "pn_xxx",
"name": "Иван Петров",
"email": "ivan@example.com",
"image": null
},
"discount": {
"id": "disc_xxx",
"offerType": "discount",
"type": "percentage",
"amount": 20,
"maxDuration": 6,
"bonusQuantity": null,
"bonusUnit": null,
"description": null
},
"program": { "id": "prog_xxx", "name": "Acme", "slug": "acme" },
"link": {
"id": "link_xxx",
"domain": "refer.example.com",
"key": "ivan",
"shortLink": "https://refer.example.com/ivan"
},
"discountCode": { "id": "dcode_xxx", "code": "IVAN20OFF" }
}Как читать условия:
offerType—discount(скидка) илиbonus(бонус в единицах:bonusQuantity,bonusUnit,description).type—percentage(процент) илиflat(фиксированная сумма). Дляflatamountуказан в копейках:500000— это 5 000 ₽.maxDuration— срок в месяцах:0— только первая оплата,null— бессрочно.discount: null— у кода нет скидки (её удалили), применять нечего.
Неизвестный код — ответ 404: такой промокод в программе не заведён, скидку давать не нужно.
Прямо со страницы оплаты, без ключа API, код можно проверить эндпоинтом POST /track/discount-code — он отдаёт партнёра и условия, но без почты партнёра и внутренних данных программы:
const res = await fetch("https://api.revroute.ru/track/discount-code", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ domain: "refer.example.com", code: enteredCode }),
});
if (res.ok) {
const { partner, discount } = await res.json();
// показываем клиенту «Промокод от Ивана: скидка 20% на 6 месяцев»
}domain — домен реферальных ссылок вашей программы. Вызывать этот эндпоинт могут только сайты из списка Разрешённые хосты в Настройки → Аналитика; пока список пуст, он отвечает 403 — это защита от перебора чужих кодов. Лимит — 20 запросов в минуту с одного IP-адреса.
Дальше скидку применяете вы: уменьшаете сумму счёта, добавляете купон в ЮKassa, начисляете бонусные единицы — как устроено в вашей системе.
Отправьте продажу — партнёр получит комиссию
Применённая скидка ещё не значит, что партнёр получил комиссию: RevRoute узнаёт о продаже только из вашего запроса. После оплаты отправьте её в POST /track/sale и, если клиент пришёл без перехода по ссылке, передайте промокод в поле discountCode:
curl -X POST "https://api.revroute.ru/track/sale" \
-H "Authorization: Bearer rr_xxxxxx" \
-H "Content-Type: application/json" \
-d '{
"customerExternalId": "user_123",
"amount": 199000,
"currency": "rub",
"paymentProcessor": "custom",
"eventName": "Invoice paid",
"invoiceId": "INV-1001",
"discountCode": "IVAN20OFF"
}'Как RevRoute решает, кому засчитать продажу:
- Если передан
clickId(значение cookierr_id), продажа идёт партнёру, чью ссылку кликнули, —discountCodeигнорируется. - Если клиент с таким
customerExternalIdуже известен (например, вы отправили его регистрацию в/track/lead), продажа засчитывается ему как обычно. - Иначе продажа засчитывается партнёру, которому принадлежит
discountCode. Неизвестный код — ответ404, продажа не записывается.
Поле discountCode так же принимает POST /track/lead — на случай, когда клиент регистрируется с промокодом ещё до оплаты. В amount передавайте сумму, которую клиент реально заплатил, — комиссия партнёра считается от неё.
Баннер скидки на сайте
Когда двусторонние стимулы настроены, следующий шаг — показать скидку прямо на странице с ценами или на главной: «Иван рекомендует вам Acme и дарит скидку 20%».
Для этого достаточно скрипта RevRoute с включённым отслеживанием переходов на стороне клиента: когда посетитель приходит на сайт по действующей реферальной ссылке, скрипт сам получает данные партнёра и скидки.
Данные партнёра и скидки скрипт сохраняет в cookie rr_partner_data —
JSON-объект такого вида:
{
"clickId": "xxx",
"partner": {
"id": "pn_xxx",
"name": "Иван Петров",
"image": "https://example.com/ivan.png",
"groupId": "grp_xxx",
"tenantId": null
},
"discount": {
"id": "disc_xxx",
"offerType": "discount",
"type": "percentage",
"amount": 20,
"maxDuration": 6,
"bonusQuantity": null,
"bonusUnit": null,
"description": null,
"code": "IVAN20OFF"
}
}Поля discount те же, что в ответе /discount-codes/resolve выше; code — промокод партнёра для этой ссылки, если он заведён, — его можно показать клиенту.
В коде страницы те же данные доступны в объекте window.RevRouteAnalytics.
Читать их надо внутри колбэка ready: к этому моменту скрипт уже получил
данные клика.
<script>
revRouteAnalytics("ready", function () {
const { partner, discount } = window.RevRouteAnalytics;
if (!partner || !discount) return;
const offer =
discount.offerType === "bonus"
? discount.description || discount.bonusQuantity + " " + discount.bonusUnit
: "скидку " +
(discount.type === "percentage"
? discount.amount + "%"
: discount.amount / 100 + " ₽");
const banner = document.createElement("div");
banner.innerHTML = `
<img src="${partner.image}" alt="${decodeURIComponent(partner.name)}" />
<p>${decodeURIComponent(partner.name)} рекомендует вам Acme и дарит ${offer}</p>
`;
document.body.appendChild(banner);
});
</script>partner.name и partner.image хранятся в cookie в URL-кодировке — перед
выводом их нужно пропустить через decodeURIComponent.
Подробнее о работе с промокодами из браузера — в статье «Промокоды и офферы (client-side)».