Интеграция на сайте: корзина и покупки
Чтобы в аналитике появились конверсия в корзину, покупки и выручка с поиска, сайт сообщает виджету о трёх действиях пользователя. Виджет сам дополняет события идентификатором посетителя и атрибуцией к поиску — со стороны сайта это по одному вызову на каждое действие.
Вызов один и тот же для всех событий:
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, консоль, отчёты) та же.
Чек-лист:
- Скрипт виджета загружен — то есть
typeof window.SearchForceWidget.on === 'function'. Нет — скрипт не подключён на эту страницу (сами события при этом не теряются: они ждут в очереди). - В Network есть
POST …/analytics/events. Нет запроса — событие не прошло проверку; смотрите предупреждение в консоли. - Ответ
202.422— проверьте формат полей (в теле ответа указано, какое поле не подошло).404— неверныйprojectIdв скрипте виджета. - В консоли нет предупреждений
[SearchForce]. Есть — вызов доехал, но часть данных отброшена; в тексте написано, что именно и как исправить. - Отчёты. Через одну-две минуты события видны в панели: «Аналитика → Корзина и выручка». Тестовые заказы попадут в отчёты — используйте узнаваемый
orderIdвидаTEST-….
Частые вопросы
Обязательна ли сумма? Нет — корзина и заказ учитываются и без неё, для проектов без цен. Но без amount не наберутся отчёты «Выручка с поиска» и «Запросы с максимальной выручкой».
Нужно ли ждать загрузки виджета? Нет. Очередь готовности принимает события в любой момент — до подключения скрипта, во время и после. Проверок readyState, обработчиков load и условий «если виджет загрузился» в коде сайта быть не должно.
Что, если скрипт виджета вообще не подключён на страницу? События останутся в очереди и никуда не уйдут — потерь нет, но и данных не будет. Проверить: typeof window.SearchForceWidget.on === 'function' в консоли этой страницы.
Код на странице «спасибо» есть, предупреждений нет, а заказы не приходят? Проверьте, что код действительно исполняется на этой странице (например, console.log рядом с вызовом) и что он использует push из примера выше, а не устаревшую форму вызова. Частая причина — сниппет положен в шаблон, который на этой странице не рендерится: движок чекаута может быть кастомным.
Как понять, что событие дошло? В DevTools → Network появится запрос POST …/analytics/events с ответом 202. Данные в отчётах обновляются в течение одной-двух минут.
Виджет пишет предупреждение в консоль — что делать? Значит вызов не прошёл проверку: в тексте указано, какое поле не подошло, что с событием стало (отброшено целиком или без одного поля) и какая форма ожидается. Каждая причина печатается один раз на загрузку страницы. Если из текста непонятно, что править — напишите в поддержку searchforce.ru и приложите строку предупреждения.
У нас включена корзина, но мы хотим ещё и считать цель — можно? Отправлять goal можно всегда, независимо от режима. Но в отчётах видна воронка только одного режима: пока в настройках аналитики выбрана «Корзина и заказы», цели принимаются и хранятся, но отчёты показывают корзину и выручку. Переключите режим на «Цель конверсии», когда захотите увидеть цели в отчётах.