ТЗХЗХЗХЗХЗ
Полина, привет! Задача по UTM-меткам в GetCourse
Никита запустил SEO-блог (ceo.nikexpert.ru), и нам нужно видеть, какая статья блога привела человека к заказу в школе edu.malovnik.ru. Штатный «источник заказа» GetCourse для этого не годится: у людей, которые уже есть в базе, он часто подтягивает метки из старой сессии, а читатели блога почти все уже в базе. Поэтому пишем метки в дополнительные поля своим скриптом.
Задача из трёх шагов, всё в интерфейсе GetCourse. По времени — минут 30–40.
Шаг 1. Создать дополнительные поля
В разделе дополнительных полей пользователя создай пять текстовых полей (названия важны, по ним потом строятся отчёты):
blog_utm_sourceblog_utm_mediumblog_utm_campaignblog_utm_contentblog_first_visit(дата первого прихода с блога)
Если в вашей конфигурации удобнее завести такие же поля и у заказа — заведи и там, лишним не будет.
Шаг 2. Вставить скрипт на страницы офферов
Скрипт ниже вставляется в блок HTML/JS на страницах, куда ведут ссылки из блога (лендинг клуба и другие посадочные). Он ловит UTM-метки из адреса, сохраняет их в браузере на 90 дней и подставляет в скрытые поля форм GetCourse при отправке.
<script>
(function () {
var KEYS = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_content'];
var TTL = 90 * 24 * 3600 * 1000;
// 1. Если пришли с метками — сохраняем (первое касание не перетираем)
var params = new URLSearchParams(location.search);
if (params.get('utm_source') === 'ceo-blog') {
var saved = null;
try { saved = JSON.parse(localStorage.getItem('blog_utm') || 'null'); } catch (e) {}
if (!saved || Date.now() - saved.ts > TTL) {
var data = { ts: Date.now() };
KEYS.forEach(function (k) { data[k] = params.get(k) || ''; });
try { localStorage.setItem('blog_utm', JSON.stringify(data)); } catch (e) {}
}
}
// 2. При отправке любой формы GetCourse дописываем метки в допполя
function fill() {
var saved = null;
try { saved = JSON.parse(localStorage.getItem('blog_utm') || 'null'); } catch (e) {}
if (!saved) return;
document.querySelectorAll('form').forEach(function (form) {
KEYS.forEach(function (k) {
var name = 'blog_' + k; // имя допполя из Шага 1
if (!form.querySelector('[name="formParams[' + name + ']"]')) {
var input = document.createElement('input');
input.type = 'hidden';
input.name = 'formParams[' + name + ']';
input.value = saved[k] || '';
form.appendChild(input);
}
});
if (!form.querySelector('[name="formParams[blog_first_visit]"]')) {
var d = document.createElement('input');
d.type = 'hidden';
d.name = 'formParams[blog_first_visit]';
d.value = new Date(saved.ts).toISOString().slice(0, 10);
form.appendChild(d);
}
});
}
fill();
document.addEventListener('DOMContentLoaded', fill);
})();
</script>
Важно: имена скрытых полей в формах GetCourse должны совпадать с именами допполей из Шага 1 — проверь, как в вашей версии конструктора форм подставляются допполя (formParams[имя] — типовой вариант; если у вас иначе, поправь строку с input.name, логика та же).
Шаг 3. Проверить на тестовом заказе
- Открой любую страницу оффера с хвостом:
?utm_source=ceo-blog&utm_medium=article&utm_campaign=test&utm_content=test-statya - Оформи тестовый заказ (можно нулёвку или отменить сразу).
- Открой карточку пользователя → допполя: должны заполниться
blog_utm_source=ceo-blogи остальные. - Если заполнились — напиши Никите «работает», если нет — пришли скрин карточки и адрес страницы, где вставлен скрипт, разберёмся.
Спасибо! Если что-то в интерфейсе GetCourse не совпадает с описанием — пиши, поправим ТЗ под вашу конфигурацию, версии у всех немного разные.