Всем привет! В этой статье я подробно разберу процесс настройки API интеграций с CPA-сетью shakes.pro. Сегодня мы настроим форму, API, а также страницу «спасибо». Готовый файл API и интересный ленд на партнерку shakes можно скачать внизу данной статьи.
Мы не слишком активно льем трафик на эту ПП, поэтому особо нечего сказать. С выплатами всё ровно, без задержек. Адекватные менеджеры и довольно неплохие офферы. Но, судя по главной странице их сайта, на которой со старта написано, что они лидеры рынка с 2013 года, точно есть над чем подумать. А вы точно не преувеличиваете? Ну ладно, отойдем от прелюдий.
Теперь перейдем к делу и настроим интеграцию с партнерской программой shakes.pro.
Задача: Настройка API интеграции с партнерской программой shakes. Мы будем настраивать постбеки в Кейтаро и партнерской программе, а также передачу лидов по API.
- Настройка постбеков в Кейтаро
- Настройка постбеков в партнерской программе
- Настройка API для передачи лидов с кейтаро в партнерку shakes
- Напишем api для партнерки shakes.pro
- Зачем нам нужен api.php?
- Детальный разбор кода
- 1. Проверка на дублирование лидов
- 2. Очистка номера телефона
- 3. Проверка лида и подготовка данных
- 4. Подготовка данных для отправки
- 5. Отправка данных на удалённый сервер
Настройка постбеков в Кейтаро
В Кейтаро уже есть встроенный шаблон для shakes. Если вы используете другой трекер или по каким-то причинам шаблона нет, вот настройка:
- Название: Shakes.pro
- Параметры для оффера: sub1={subid}
- Postback URL: ВАШ_Домен/postback?subid={sub1}&payout={cost}&status={status}&stream={stream}&source_id={source}&offer={offer}¤cy={currency}&sale_status=confirm,approved&rejected_status=reject,decline&lead_status=none&from=shakes.pro

Настройка постбеков в партнерской программе
Тут юзабилити явно не на высоте, одна из самых основных настроек спрятана куда подальше…
- Идем в ПП → Потоки → Глобальный постбек.
- В поле «Постбек» вписываем наш постбек: ВАШ_Домен/postback?subid={sub1}&payout={cost}&status={status}&stream={stream}&source_id={source}&offer={offer}¤cy={currency}&sale_status=confirm,approved&rejected_status=reject,decline&lead_status=none&from=shakes.pro
- Далее настроим статусы пользователя, отменяем все:
- Генерация конверсии
- Подтверждение конверсии
- Отклонение конверсии
- Невалидные заявки

После этого нажимаем кнопку «Сохранить».
Первый этап настройки завершен. Постбеки в партнерской сети shakes и Кейтаро настроены. Теперь приступим к настройке API.
Настройка API для передачи лидов с кейтаро в партнерку shakes
Начнем настройку интеграции с формы на нашей прокле, а после этого разберем и напишем api файл для передачи лидов в ПП, с нашей формы на сайте.
Идем на наш лендинг и находим форму. В форму вставляем макрос с sub_id для корректной работы постбеков:
<input type="hidden" name="sub1" value="{subid}">
Полный код формы на сайте выглядит так:
<form action="api.php" method="post"> <div class="all-form__body"> <div class="all-form__box"> <div class="all-form__label"> <span class="lt88">Su nombre:</span><input class="all-form__field" placeholder="Nombre y apellido" type="text" name="name" required> </div> <div class="all-form__label"> <span class="lt89">Teléfono:</span><input class="all-form__field" placeholder="+506 23456789" type="text" name="phone" required> </div> </div> <div class="all-form__footer"> <button type="submit" class="all-form__btn lt90">Obtener con 50% de descuento</button> </div> </div> <input type="hidden" name="country" value="страна"> <input type="hidden" name="offerId" value="id оффера"> <input type="hidden" name="landingUrl" value="url лендинга с ПП"> <input type="hidden" name="streamCode" value="код потока"> <input type="hidden" name="sub1" value="{subid}"> <input type='hidden' name='pxl' value="<?php echo $_GET['pxl']; ?>" /> //пиксель </form>
С формой все, обычная стандартная форма, которая отправялет данные в api.php методом POST.
Напишем api для партнерки shakes.pro
Этот API-файл предназначен для обработки лидов (заявок) на сервере. Рассмотрим его структуру и работу поэтапно:
Зачем нам нужен api.php?
Файл служит для:
- Проверки на дублирование лидов.
- Очистки номера телефона от нецифровых символов.
- Отправки данных лида на удалённый сервер через API.
- Обработки ответа от сервера и перенаправления пользователя на страницу успеха или ошибки в зависимости от результата.
Детальный разбор кода
1. Проверка на дублирование лидов
Функция isDuplicateLead($phone)
проверяет, был ли уже лид с таким номером телефона:
function isDuplicateLead($phone) { $file = 'leads.txt'; if (!file_exists($file)) { file_put_contents($file, ''); } $leads = file_get_contents($file); $escapedPhone = preg_quote($phone, '/'); $phonePattern = '/' . $escapedPhone . "\n/"; if (preg_match($phonePattern, $leads)) { return true; } else { file_put_contents($file, $phone . "\n", FILE_APPEND); return false; } }
- Проверка существования файла: Если файл
leads.txt
не существует, он создается. - Чтение содержимого файла: Все записанные лиды читаются.
- Поиск номера: Номер телефона ищется в списке. Если он найден, возвращается
true
(лид уже существует). - Запись номера: Если номера нет в списке, он записывается в файл, и возвращается
false
(лид новый).
2. Очистка номера телефона
Функция cleanPhoneNumber($phoneNumber)
удаляет из номера телефона все символы, кроме цифр:
function cleanPhoneNumber($phoneNumber) { return preg_replace('/[^0-9]/', '', $phoneNumber); }
- Очистка номера: Используется регулярное выражение для удаления всех символов, кроме цифр.
3. Проверка лида и подготовка данных
$cleanedPhone = cleanPhoneNumber($_POST['phone']); if (isDuplicateLead($cleanedPhone)) { header('Location: error.php'); exit; }
- Очистка номера телефона: Входящий номер телефона очищается.
- Проверка на дублирование: Если номер телефона уже существует в
leads.txt
, пользователь перенаправляется наerror.php
.
4. Подготовка данных для отправки
$apiKey = 'Апиключ из ПП'; $domain = 'shakes.pro'; $url = "http://$domain?r=/api/order/in&key=$apiKey"; $order = [ 'createdAt' => date('Y-m-d H:i:s'), 'offerId' => (!empty($_POST['offerId']) ? $_POST['offerId'] : ($_GET['offerId'] ? $_GET['offerId'] : '')), 'landingUrl' => (!empty($_POST['landingUrl']) ? $_POST['landingUrl'] : ($_GET['landingUrl'] ? $_GET['landingUrl'] : '')), 'streamCode' => (!empty($_POST['streamCode']) ? $_POST['streamCode'] : ($_GET['streamCode'] ? $_GET['streamCode'] : '')), 'ip' => (!empty($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : null), 'referrer' => (!empty($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : null), 'userAgent' => (!empty($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '-'), 'name' => (!empty($_POST['name']) ? $_POST['name'] : ($_GET['name'] ? $_GET['name'] : '')), 'phone' => (!empty($_POST['phone']) ? $_POST['phone'] : ($_GET['phone'] ? $_GET['phone'] : '')), 'countryCode' => (!empty($_POST['country']) ? $_POST['country'] : ($_GET['country'] ? $_GET['country'] : 'RU')), 'comment' => (!empty($_POST['comment']) ? $_POST['comment'] : ($_GET['comment'] ? $_GET['comment'] : '')), 'sub1' => (!empty($_POST['sub1']) ? $_POST['sub1'] : ($_GET['sub1'] ? $_GET['sub1'] : '')), 'sub2' => (!empty($_POST['sub2']) ? $_POST['sub2'] : ($_GET['sub2'] ? $_GET['sub2'] : '')), 'sub3' => (!empty($_POST['sub3']) ? $_POST['sub3'] : ($_GET['sub3'] ? $_GET['sub3'] : '')), 'sub4' => (!empty($_POST['sub4']) ? $_POST['sub4'] : ($_GET['sub4'] ? $_GET['sub4'] : '')), ];
- Создание массива заказа: Собираются данные из
$_POST
и$_GET
.
5. Отправка данных на удалённый сервер
$curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, $order); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); try { $responseBody = curl_exec($curl); $response = json_decode($responseBody, true); if ($response['status'] != 'ok') { throw new Exception( 'Success: Order is accepted. ' . PHP_EOL . 'Order: ' . var_export($order, true) . PHP_EOL . 'Response: ' . var_export($response, true) ); } curl_close($curl); header('Location: ./success.php?pxl=' . $_REQUEST['pxl']); exit(); } catch (Exception $e) { header('Location: ./error.php'); exit(); }
- Настройка cURL: Устанавливаются параметры для POST-запроса.
- Отправка запроса: Выполняется запрос и обрабатывается ответ.
- Проверка ответа: Если ответ сервера не содержит статус
ok
, вызывается исключение. - Обработка исключения: При возникновении ошибки пользователь перенаправляется на
error.php
- Успешный ответ: Если ответ успешный, пользователь перенаправляется на
success.php
с параметромpxl
.
Таким образом, файл API выполняет всю работу по обработке, проверке и отправке данных лида, обеспечивая также базовую защиту от повторных заявок с одного и того же номера телефона.
Скачать файл api.php для передачи лидов с сайта в ПП shakes.pro, можно по ссылке ниже. Не забудьте в апи добавить свой ключ, с личного кабинета ПП.
Так же прикрепляю ленд на Коста Рику, который показал себя с сильной стороны в плане конверта. Направление — простатит. Спасибо за прочтение, жду тебя в своем ТГ канале, по запросу сделаю для тебя апи под любую ПП. Всем зеленых ROI и удачи!