Skip to Content

Двусторонние стимулы

💡

Эта функция доступна только на тарифных планах Business и выше .

Двусторонний стимул — это когда выигрывают обе стороны: партнёр получает вознаграждение за приведённого клиента, а сам клиент — скидку за то, что пришёл по ссылке или промокоду партнёра.

Примеры:

  • Скидка 25% на первые 12 месяцев
  • Пожизненная скидка 30%
  • Разовая скидка 5 000 ₽
  • Бонус в единицах вашего продукта — например, 100 дополнительных заявок на баланс

Так растёт «сарафанное радио»: партнёру выгоднее делиться ссылкой, если она даёт его аудитории скидку, а аудитория охотнее переходит по ссылке, если её ждёт специальное предложение.

Как это устроено

RevRoute хранит условия скидки и знает, какому партнёру принадлежит промокод. Деньги при этом не проходят через RevRoute: скидку клиенту применяет ваша платёжная система — ЮKassa, собственный биллинг, счёт на оплату, что угодно. Заводить купоны в платёжной системе не нужно.

Цепочка целиком:

  1. Вы создаёте скидку для группы партнёров: процент, фиксированная сумма или бонус, срок действия.
  2. Партнёр получает промокод, привязанный к его реферальной ссылке, — вы создаёте его вручную в карточке партнёра или включаете автоматическое создание. Партнёр видит код в своём кабинете и раздаёт аудитории.
  3. Клиент приходит к вам по ссылке партнёра или вводит промокод при оплате. Ваш сайт или сервер спрашивает у RevRoute, чей это код и какие у него условия, и применяет скидку.
  4. После оплаты вы отправляете продажу в 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 (фиксированная сумма). Для flat amount указан в копейках: 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 (значение cookie rr_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)».

Обновлено