Today

ТЗХЗХЗХЗХЗ

Полина, привет! Задача по UTM-меткам в GetCourse

Никита запустил SEO-блог (ceo.nikexpert.ru), и нам нужно видеть, какая статья блога привела человека к заказу в школе edu.malovnik.ru. Штатный «источник заказа» GetCourse для этого не годится: у людей, которые уже есть в базе, он часто подтягивает метки из старой сессии, а читатели блога почти все уже в базе. Поэтому пишем метки в дополнительные поля своим скриптом.

Задача из трёх шагов, всё в интерфейсе GetCourse. По времени — минут 30–40.

Шаг 1. Создать дополнительные поля

В разделе дополнительных полей пользователя создай пять текстовых полей (названия важны, по ним потом строятся отчёты):

  • blog_utm_source
  • blog_utm_medium
  • blog_utm_campaign
  • blog_utm_content
  • blog_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. Проверить на тестовом заказе

  1. Открой любую страницу оффера с хвостом: ?utm_source=ceo-blog&utm_medium=article&utm_campaign=test&utm_content=test-statya
  2. Оформи тестовый заказ (можно нулёвку или отменить сразу).
  3. Открой карточку пользователя → допполя: должны заполниться blog_utm_source=ceo-blog и остальные.
  4. Если заполнились — напиши Никите «работает», если нет — пришли скрин карточки и адрес страницы, где вставлен скрипт, разберёмся.

Спасибо! Если что-то в интерфейсе GetCourse не совпадает с описанием — пиши, поправим ТЗ под вашу конфигурацию, версии у всех немного разные.