Отправка лидов может использоваться в четырёх ситуациях:
- Отправка новых лидов в CRM. Классическая передача лидов в стороннюю сеть. Каждую минуту все лиды в статусе "Новый" отправляются в целевую CRM. При удачной отправке, лид переводится в статус "Обработка". При проблемах - в статус "Отмена" с соответствующей причиной. При ошибках отправки остаётся в статусе "Новый" для отправки через минуту.
- Отправка апсейлов и изменений. Иногда лид может быть изменён запросом с сайта, который отправлен со страницы "Спасибо". Изменения отправляются в целевую CRM каждую минуту.
- Отправка принятых лидов в CRM. Отправляет в целевую сеть лиды после обработки колл-центром. Вы можете выбрать статус, из которого происходит отправка. Из "Упаковки" удобно отдавать лиды в службу фулфилмента, из "Отправки" - в службу доставки, из "Доставки" - в колл-центр мониторинга доставки.
- Синхронная отправка лидов на регистрацию. Отправляет данные в целевую CRM в момент поступления лида. Требуется для реализации механизма автоматического входа (автологин).
Все интеграции имеют аналогичный подход к ссылкам, полям и коду обработки. Запрос выполняется отдельно для каждого лида. Ссылки и поля работают с одинаковыми набором макросов. Код обработки всегда должен заканчиваться возвратом результата.
URL добавления
Это адрес, на который будет выполняться запрос. Вы можете использовать эти макросы в адресе:
{id}- идентификатор заказа.{ip}- IP-адрес покупателя.{wm}- идентификатор вебмастера.{wmi}- умный идентификатор вебмастера, который отправляет данные в виде агент-веб для агентского трафика.{name}- имя покупателя.{phone}- телефон покупателя.{ofp:xxx}- значение параметра оффера с названием xxx.{ofpg:xxx}- значение гео-зависимого параметра оффера с названием xxx.{meta:xxx}- значение дополнительного поля заказа с названием xxx.{goal:xxx}- значение параметра цели с названием xxx.{site:xxx}- значение параметра сайта с названием xxx.
Вы также можете манипулировать адресом через переменную $url в коде предобработки.
Код предобработки
Основные методы использования кода предобработки описаны в соответствующем разделе документации. При отправке лидов вам доступны следующие переменные с данными:
$o- необработанные данные заказа, полученные напрямую из базы.$o['order_country']- ISO-код страны заказа.$o['offer_id']- идентификатор оффера.$ofps- параметры оффера.$ofpg- гео-зависимые параметры оффера.$gpar- параметры цели.$spar- параметры сайта.$vars- вложенные товары.$meta- дополнительные поля заказа.
При работе с товарными интеграциями, может потребоваться получение состава заказа. Он хранится в поле $o['order_items'], которое можно получить так:
$its = xxdec( $o['order_items'] );
Внутри $its хранится массив товаров в заказе. Ключ массива - идентификатор товара. Поля массива:
- 0: количество товара в заказе.
- 1: цена единицы товара в валюте заказа.
- 2: себестоимость единицы товара в валюте заказа.
Пример подготовки массива товаров для отправки:
$post['items'] = [];
$its = xxdec( $o['order_items'] );
$itp = $core->cpa->get( 'vpar', $o['offer_id'], 'sku' );
foreach ( $its as $it => $iv ) {
$post['items'][] = [
'id' => $itp[$it],
'price' => $iv[1],
'amount' => $iv[0],
];
}
Поля данных
Состав заказа лучше всего формировать через поля. Список полей задаётся в формате "название значение" через пробел, каждое поле - в своей строке. В качестве значения может выступать либо какая-то строка, либо какой-то макрос. Можно также указать макросы внутри строки.
Основные поля данных:
{id}- идентификатор заказа.{eid}- зашифрованный идентификатор заказа.{ext}- идентификатор заказа на стороне целевой CRM (для отправки изменений).{name}- имя покупателя.{last}- фамилия покупателя из произвольного поляlast.{fname}- полное имя покупателя.{email}- адрес почты покупателя.{pass}- пароль покупателя из произвольного поляpass.{lang}- язык покупателя из поляlangили данных страны.{langup}- язык покупателя заглавными буквами.{iname}и{ilast}- умные имя и фамилия, полученные из дополнительных полей или методом разделения имени пополам (использовать только парой).{ipass}- умный пароль, полученный из поля pass или сгенерированный на лету.{imail}- умная почта, генерируется при пустом поле в видеhash@gmail.com.{phone}- телефон покупателя.{iphone}- телефон покупателя с символом + впереди.{cphone}- телефон покупателя без кода страны.{phonecc}- телефонный код страны из полейphoneccиphc.{iphonecc}- телефонный код страны с символом + впереди.{geo}и{country}- ISO-код страны маленькими буквами.{geoup}- ISO-код страны заглавными буквами.{geoname}- полное название страны на английском языке.{comment}- комментарий к заказу.{index}- почтовый индекс доставки.{area}- регион страны доставки.{city}- город доставки.{street}- улица.{house}- дом, корпус и квартира.{addr}- адрес доставки без индекса.{fulladdr}- адрес доставки с индеком.{straddr}- адрес доставки из улицы и дома.{delivery}- внутренний идентификатор типа доставки.{discount}- процент скидки на товар.{count}- количество товара.{currency}- внутренний идентификатор валюты в системе.{curr}- трёхбуквенный ISO-код валюты.{price}- общая цена заказа.{base}- цена единицы товара.{delpr}- цена доставки.{more}- дополнительная наценка или скидка на доставку в валюте заказа.{offer}- идентификатор оффера в системе.{siteurl}- умный адрес лендинга, который использует параметрurl, реальный адрес сайта заказа или адрес сайта по умолчанию.{sitename}- название лендинга.{spaceurl}- адрес прелендинга.{spacename}- название прелендинга.{land}- адрес лендинга при наличии.{preland}- адрес прелендинга при наличии.{domain}- домен сайта при наличии.{click}- внутренний идентификатор клика.{wm}- идентификатор вебмастера.{wmi}- умный идентификатор вебмастера, который отправляет данные в виде агент-веб для агентского трафика.{wmname}- имя вебмастера.{wmmail}- email вебмастера.{exti}- идентификатор агентства.{extu}- идентификатор заказа на стороне агентства.{exts}- идентификатор источника на стороне агентства.{subid}- значение меткиsubidилиx32.{uuid}- значение меткиuuidилиx64.{sub1}- значение меткиsub1.{sub2}- значение меткиsub2.{sub3}- значение меткиsub3.{sub4}- значение меткиsub4.{sub5}- значение меткиsub5.{utms}- значение меткиutm_source.{utmc}- значение меткиutm_campaign.{utmn}- значение меткиutm_content.{utmt}- значение меткиutm_term.{utmm}- значение меткиutm_medium.{ip}- IP-адрес покупателя.{ip4}- IPv4-адрес покупателя или пустота для IPv6.{ip6}- IPv6-адрес покупателя или пустота для IPv4.{ua}- User-Agent покупателя.{mobile}- тип трафика: 0 - десктоп, 1 - мобильный.{bad}- качество трафика: 0 - обычный, 1 - подозрительный.{cwm}- сумма отчисления вебмастеру в системной валюте.{cwmr}- сумма отчисления вебмастеру в реальной валюте.{cwmc}- ISO-код реальной валюты отчисления вебмастеру.{cpay}- сумма отчисления рекламодателю в системной валюте.{cpayr}- сумма отчисления рекламодателю в реальной валюте.{cpayc}- ISO-код реальной валюты отчисления рекламодателю.
Параметрические поля подставят значение соответствующего параметра с названием xxx:
{ofp:xxx}- параметр оффер.{ofpg:xxx}- гео-зависимый параметр оффера.{goal:xxx}- параметр цели.{site:xxx}- параметр лендинга.{space:xxx}- параметр прелендинга.{offer:xxx}- основное поле оффера.{meta:xxx}- произвольное поле заказа.{file:xxx}- прикреплённый файл из произвольного поля.
В произвольных полях заказа могут использоваться файлы. Отправка файлов поддерживается только при использовании стандартного формата multipart/form-data, передача файлов в JSON-запросах не поддерживается.
Общие сведения о коде обработки
Код обработки получает на вход переменную $result. Она содержит сырые данные ответа сервера. Чаще всего ответ сервера приходит в формате JSON, поэтому результат лучше преобразовать к массиву вот так:
$r = xxdec( $result );
Код обработки должен возвращать результат в случае успеха. Если обработка вернёт false или не вернёт результата, считается, что запрос не удался. Такой запрос будет поставлен в очередь для повторной отправки.
Код обработки для новых лидов
При отправке новых лидов, система ожидает увидеть ID нового лида или код ошибки добавления. Если код обработки вернул отрицательное целое число - оно расценивается как ID причины отказа и лид отменяется. Любое другое значение считается идентификатором лида.
Например, API-функция добавления заказов у поставщика выдаёт нам { status: "ok", id: 123 } в случае успеха, и { status: "error", error: "double" } в случае ошибки добавления заказа с указанием кода ошибки. Код, который реализует это, будет выглядеть вот так:
$r = xxdec( $result ); if ( $r['status'] == 'ok' ) return $r['id']; if ( $r['error'] == 'double' ) return -7; if ( $r['error'] == 'geo' ) return -5; if ( $r['error'] == 'phone' ) return -1; return false;
Заглушка для отправки новых лидов
Иногда новые лиды отправлять не нужно, достаточно перенести заказ в статус обработки. Такое случается при добавлении лидов по API с указанием внешнего ID заказа или при синхронной отправке лида на регистрацию.
Для включения заглушки, оставьте все поля блока "Отправка новых лидов" пустыми и поставьте галочку "Включить интеграцию передачи заказов". Заказы будут переводиться в статус "Обработка" раз в минуту. Если у заказов нет внешнего ID, вместо него будет вписан внутренний ID заказа.
Код обработки для изменений лида
Обработка изменений ожидает от кода только два значения - успех или неудачу. Любое не пустое значение будет расцениваться как успех. Пример реализации:
$r = xxdec( $result ); return ( $r['status'] == 'ok' ) ? true : false;
Код обработки для принятых заказов
При обработке принятых заказов, система ожидает от кода идентификатор заказа на стороне CRM. Любое не пустое значение расценивается как идентификатор. Пример реализации:
$r = xxdec( $result );
if ( $r['status'] == 'ok' ) {
return $r['id'];
} else return false;
Код обработки для синхронной отправки
При синхронной отправке, система ожидает от кода ссылку входа в личный кабинет для заказчика. Но получает её крайне редко, поэтому готова смириться с некоторыми вариантами.
- Полноценный URL будет расцениваться как удачная отправка лида. Пользователь будет перенаправлен по указанному адресу в личный кабинет. Заказ остаётся в статусе "Новый" и ожидает последующей классической отправки.
- Строка текста будет расценена как сообщение об ошибке, оно будет показано пользователю на сайте. Сама отправка будет считаться неудачной - такой лид автоматически переводится в статус "Удалён".
- Отрицательное число будет считаться кодом причины отказа, как при отправке новых лидов. Лид будет отменён с указанной причиной. Пользователь при этом увидит страницу "Спасибо".
- Положительное целое число будет расцениваться как идентификатор лида. Отправка считается успешной, лид переводится в статус "Обработка" с указанным ID. Пользователь видит страницу "Спасибо".
- Строка вида
id:xxx(символыid, двоеточие и произвольное значение) также будет расцениваться как идентификатор лида, аналогично предыдущему пункту. - Пустой ответ расценивается как ошибка отправки. Лид остаётся в статусе "Новый" и отправляется на классическую отправку.
Классическая обработка синхронной отправки выглядит вот так:
$r = xxdec( $result ); if ( $r['autologin_url'] ) return $r['autologin_url']; if ( $r['error_message'] ) return $r['error_message']; return 'Registration failed, try again later';
Классическая обработка никогда не применяется. Реальный код обработки гораздо сложнее и учитывает множество вариаций. В обработчике рекомендуется сразу же устанавливать внешний ID лида, если он был получен.
$core->lead->edit( $o['order_id'], [ 'exto' => $result['id'] ] );
Пример полного кода обработки:
$result = json_decode( $result, true );
if ( $result['status'] == 'ok' ) {
$core->lead->edit( $o['order_id'], [ 'exto' => $result['id'] ] );
return $result['url'] ? $result['url'] : false;
}
if ( $result['message'] ) return $result['message'];
if ( $result['error'] == 'duplicate' ) return -7;
if ( $result['error'] == 'ban' ) return -12;
if ( $result['error'] == 'traffic' ) return -15;
return 'Registration failed, try again later';
Использование только синхронной отправки является небезопасным с точки зрения потери трафика. Если целевая CRM не смогла ответить, лид так и не будет в неё передан. Поэтому рекомендуется совмещать синхронную и классическую отправки. При этом, чтобы лид не был отправлен дважды, необходимо выполнить ряд действий.
При успешном выполнении синхронной отправки в обязательном порядке укажите внешний идентификатор лида, как описано выше. Если целевая CRM не использует свои индентификаторы, воспользуйтесь внутренним:
$core->lead->edit( $o['order_id'], [ 'exto' => $o['order_id'] ] );
В конец кода предобработки для отправки новых лидов добавьте следующие строчки:
if ( $o['ext_oid'] ) {
$url = $post = false;
$result = true;
}
В начало кода обработки добавьте строчку:
if ( $o['ext_oid'] ) return $o['ext_oid'];
Эти манипуляции отключат реальный повторный запрос к целевой CRM и просто пометят лид статусом "В обработке".