Skip to content

Интеграция на сайте: корзина и покупки ​

Чтобы в аналитике появились конверсия в корзину, покупки и выручка с поиска, сайт сообщает виджету о трёх действиях пользователя. Виджет сам дополняет события идентификатором посетителя и атрибуцией к поиску — со стороны сайта это по одному вызову на каждое действие.

Вызов один и тот же для всех событий:

js
window.SearchForceWidget = window.SearchForceWidget || [];
window.SearchForceWidget.push(['имя события', { /* данные */ }]);

Первая строка — очередь готовности: если скрипт виджета ещё не загрузился, события копятся в ней и уходят в аналитику, как только он появится. Поэтому вызов можно ставить в любое место страницы и в любой момент — обёртки и проверки не нужны. Строку с очередью повторяйте перед каждым вызовом (она безопасна: существующую очередь не затирает) или поставьте один раз выше всего своего кода.

Работает и через Google Tag Manager

Очередь не зависит от того, как подключён виджет: обычным тегом, async-скриптом или динамической вставкой из GTM. Если виджет вставляется контейнером GTM, события всё равно доедут.

Добавление в корзину ​

Вызовите на каждом добавлении товара в корзину — в карточке товара, в листинге, в выдаче поиска:

js
window.SearchForceWidget = window.SearchForceWidget || [];
window.SearchForceWidget.push(['addToCart', {
  objectId: 12345,      // id товара или торгового предложения — тот же, что в фиде (offer id)
  amount: '2599.00',    // цена позиции в РУБЛЯХ; необязательно, но нужно для отчёта по выручке
}]);

Оплата заказа ​

Вызовите один раз на странице «спасибо за заказ»:

js
window.SearchForceWidget = window.SearchForceWidget || [];
window.SearchForceWidget.push(['purchase', {
  orderId: 'A-10042',            // номер заказа — обязателен
  amount: '2599.00',             // сумма заказа в РУБЛЯХ; необязательно, но нужно для выручки
  currency: 'RUB',               // необязательно: валюта заказа, если она не совпадает с валютой проекта
  objectIds: [12345, '67890'],   // id товаров заказа — для популярности товаров
}]);

Повторная отправка безопасна

Покупки идемпотентны по orderId: если страница «спасибо» перезагрузится и событие уйдёт дважды, выручка не задвоится.

Цель ​

Для сайтов без корзины — конечное действие покупателя на кнопке: «Узнать цену», «Заказать», «Запросить звонок». Заменяет корзину и заказ в отчётах, если у проекта включён режим «Цель конверсии» (Настройки → Настройки аналитики → раздел «Конверсия»); принимается событие всегда, независимо от режима.

Вызовите на каждом нажатии кнопки, которой закрыт целевой сценарий:

js
window.SearchForceWidget = window.SearchForceWidget || [];
window.SearchForceWidget.push(['goal', {
  objectId: '12345',  // id товара, если цель привязана к товару — необязателен, цель бывает и без товара
  action: 'Узнать цену',  // метка кнопки: короткая и стабильная, до 64 символов
}]);

У проекта одна цель, а кнопок под неё может быть несколько: разрез отчёта «по действию» появляется, когда action принимает больше одного значения.

Если виджета на странице нет (например, форма обрабатывается на бэкенде), то же событие можно отправить прямым запросом:

POST {apiUrl}/api/v1/{projectId}/analytics/events
Content-Type: application/json

{ "type": "goal", "object_id": "12345", "action": "Узнать цену",
  "from_search": true, "attributed_query": "мультиварка redmond",
  "user_token": "…" }

Токен посетителя обязан быть 36-символьным UUID

При прямом вызове это единственное поле, которое легко испортить незаметно: события с токеном другой длины (свой id сессии, id пользователя из CRM, а также токен, который сервер построит сам, если поле не передать) не попадают в отчёты качества — так отсекается служебный и автоматический трафик. Внешне всё исправно: сервис отвечает 202, событие сохраняется, а карточки и график показывают ноль. Генерируйте UUID на стороне сайта и храните его в localStorage, как это делает виджет.

from_search нужно проставлять самостоятельно

У клика по товару сервер выводит атрибуцию к поиску из тега клика. У цели такого тега нет: при прямом вызове (без виджета) обязательно передавайте from_search вместе с attributed_query — без них цель засчитается, но не попадёт в поисковую воронку. Вызов через виджет проставляет оба поля сам.

Не вешайте одну кнопку на цель и на контакт из блока помощи

help_contact значит «покупатель не нашёл товар и пошёл звонить»; цель — «нашёл и сделал целевое действие». Одна и та же кнопка, отправляющая оба события, исказит оба отчёта: цели считаются только по событию goal, ничего не суммируется между типами.

Цель в Яндекс.Метрике нужно создать заранее

Если у проекта подключена интеграция с Яндекс.Метрикой, цель дублируется в счётчик как searchforce_goal. Метрика принимает обращения только к уже созданным целям и не пересчитывает их задним числом — заведите цель в счётчике до того, как кнопка начнёт по ней стрелять.

Клик по товару вне поиска ​

Необязательный вызов — позволяет сравнивать поведение «поисковых» и «беспоисковых» посетителей:

js
window.SearchForceWidget = window.SearchForceWidget || [];
window.SearchForceWidget.push(['productClick', { objectId: 12345 }]);

Форматы полей ​

Идентификаторы (objectId, orderId, objectIds) — строка или число, как удобнее вашему шаблонизатору: 12345 и '12345' равнозначны. Главное, чтобы значение совпадало с id товара в фиде (offer id).

Суммы (amount) — в основных единицах валюты проекта: рубли, а не копейки. Допустимы строка '2599.00' и число 2599; разделитель дробной части — точка. Строка надёжнее: она не зависит от того, как ваш шаблонизатор печатает дробные числа.

Что не принимается: '2 599,00', '2599,00', '2599 руб'. Разделители разрядов и запятая неоднозначны ('1 000,5' — это 1000.5 или 10005?), а угадывать в деньгах опаснее, чем отказаться от значения. В таком случае событие всё равно доедет, но без суммы, а в консоли появится предупреждение.

Валюту проекта задаёт настройка проекта в панели (по умолчанию — рубли); поле currency в событии — разовое переопределение для мультивалютных заказов.

Проверка интеграции ​

Вставьте в консоль браузера на своём сайте — сниппет прогонит корзину и заказ и сам скажет, что не так:

js
(() => {
  window.SearchForceWidget = window.SearchForceWidget || [];
  const W = window.SearchForceWidget;
  W.push(['addToCart', { objectId: 12345, amount: '2599.00' }]);
  W.push(['purchase', { orderId: 'TEST-' + Date.now(), amount: '2599.00', objectIds: [12345] }]);
  if (typeof W.on !== 'function') {
    return console.error('Скрипт виджета не загружен на эту страницу: события ушли в очередь и будут отправлены, когда он появится. Если он не появится — проверьте тег <script>.');
  }
  console.info('События отправлены. Проверьте вкладку Network: POST …/analytics/events → 202.');
})();

Замените 12345 на реальный offer id из вашего фида — иначе товар не свяжется с каталогом.

Для проекта в режиме «Цель конверсии» замените в сниппете вызовы addToCart и purchase на push(['goal', { objectId: '12345', action: 'Узнать цену' }]) — остальная проверка (Network, консоль, отчёты) та же.

Чек-лист:

  1. Скрипт виджета загружен — то есть typeof window.SearchForceWidget.on === 'function'. Нет — скрипт не подключён на эту страницу (сами события при этом не теряются: они ждут в очереди).
  2. В Network есть POST …/analytics/events. Нет запроса — событие не прошло проверку; смотрите предупреждение в консоли.
  3. Ответ 202. 422 — проверьте формат полей (в теле ответа указано, какое поле не подошло). 404 — неверный projectId в скрипте виджета.
  4. В консоли нет предупреждений [SearchForce]. Есть — вызов доехал, но часть данных отброшена; в тексте написано, что именно и как исправить.
  5. Отчёты. Через одну-две минуты события видны в панели: «Аналитика → Корзина и выручка». Тестовые заказы попадут в отчёты — используйте узнаваемый orderId вида TEST-….

Частые вопросы ​

Обязательна ли сумма? Нет — корзина и заказ учитываются и без неё, для проектов без цен. Но без amount не наберутся отчёты «Выручка с поиска» и «Запросы с максимальной выручкой».

Нужно ли ждать загрузки виджета? Нет. Очередь готовности принимает события в любой момент — до подключения скрипта, во время и после. Проверок readyState, обработчиков load и условий «если виджет загрузился» в коде сайта быть не должно.

Что, если скрипт виджета вообще не подключён на страницу? События останутся в очереди и никуда не уйдут — потерь нет, но и данных не будет. Проверить: typeof window.SearchForceWidget.on === 'function' в консоли этой страницы.

Код на странице «спасибо» есть, предупреждений нет, а заказы не приходят? Проверьте, что код действительно исполняется на этой странице (например, console.log рядом с вызовом) и что он использует push из примера выше, а не устаревшую форму вызова. Частая причина — сниппет положен в шаблон, который на этой странице не рендерится: движок чекаута может быть кастомным.

Как понять, что событие дошло? В DevTools → Network появится запрос POST …/analytics/events с ответом 202. Данные в отчётах обновляются в течение одной-двух минут.

Виджет пишет предупреждение в консоль — что делать? Значит вызов не прошёл проверку: в тексте указано, какое поле не подошло, что с событием стало (отброшено целиком или без одного поля) и какая форма ожидается. Каждая причина печатается один раз на загрузку страницы. Если из текста непонятно, что править — напишите в поддержку searchforce.ru и приложите строку предупреждения.

У нас включена корзина, но мы хотим ещё и считать цель — можно? Отправлять goal можно всегда, независимо от режима. Но в отчётах видна воронка только одного режима: пока в настройках аналитики выбрана «Корзина и заказы», цели принимаются и хранятся, но отчёты показывают корзину и выручку. Переключите режим на «Цель конверсии», когда захотите увидеть цели в отчётах.