Сервер не запущен — запустите start-server.bat в папке server
Неверный URL сервера — сейчас:
Дашборд открыт как файл (file://) — откройте через http или просто двойной клик по index.html (запросы к localhost при этом должны работать)
Период:
или
Пользователей сейчас
—
за последние 5 мин.
Страницы (URL)
Чистые URL без UTM и опционально без GET-параметров. Уникальные пользователи и просмотры.
Товары
Клики по товарам (URL и заголовок страницы).
Блоки по страницам
Время в зоне видимости блока и количество уникальных пользователей. Блоки по умолчанию — h1, h2, h3. Ниже можно добавить свои (корректировщик).
Корректировщик блоков
Для страниц с нестандартной разметкой: укажите блок вручную или выберите на странице букмарклетом. Удаление — по кнопке ×.
Букмарклет: откройте сайт клиента, добавьте в закладки ссылку ниже, затем на нужной странице нажмите закладку — после клика по элементу блок сохранится.
Тепловая карта
Доля трафика, глубина прокрутки и наложение по времени на блоках (синий — мало времени, красный — много).
Оверлей тепловой карты на странице
Откройте нужную страницу на сайте, добавьте закладку ниже и нажмите её — на страницу наложится цветовая карта по блокам. Переключатель ПК/Мобилка — в панели оверлея.
Нормализация URL
Укажите, какие GET-параметры убирать из URL (по одному в строке). По умолчанию — UTM, Calltouch, Roistat, Callibri и др. колл/email-трекинг. Можно править и исключать ненужное.
Сохранено
Не учитывать в отчётах
Адреса из этого списка не сохраняются в базу и не попадают в аналитику. Можно указать путь целиком или с * (например /admin* или *?preview=*).
Удалить проект
Удаляются проект и вся его аналитика. Отменить нельзя.
Код установки
Один и тот же код для всех сайтов. Вставьте его в <head> или перед </body> — на любом сайте. Счётчик определяется по домену (указывается при добавлении проекта).
Если редактор пишет «незакрытый тег» — вставьте через «Произвольный HTML» или в шаблон темы.
После добавления проекта укажите домен сайта (например roadmap.su) — данные с этого домена будут попадать в этот счётчик.
Добавить проект
Позже можно будет добавить несколько доменов — данные будут учитываться только с разрешённых.
";
var el = document.getElementById("installSnippet");
if (el) el.textContent = snippet;
}
function getCurrentCounter() {
for (var i = 0; i < counters.length; i++) {
if (counters[i].id === currentCounterId) return counters[i];
}
return null;
}
var copyInstallEl = document.getElementById('copyInstall');
if (copyInstallEl) copyInstallEl.onclick = function() {
var snip = document.getElementById('installSnippet');
if (snip) navigator.clipboard.writeText(snip.textContent);
copyInstallEl.textContent = 'Скопировано';
setTimeout(function() { copyInstallEl.textContent = 'Копировать'; }, 1500);
};
var submitBtn = document.getElementById('modalSubmit');
if (submitBtn) submitBtn.onclick = async function() {
var name = document.getElementById('modalProjectName').value.trim();
var domain = document.getElementById('modalAllowedDomain').value.trim();
var metrikaId = document.getElementById('modalMetrikaId').value.trim();
if (!metrikaId || !name) {
alert('Укажите название и ID счётчика Метрики.');
return;
}
var allowedDomains = domain ? [domain.replace(/^https?:\/\//i, '').split('/')[0].toLowerCase()] : [];
try {
var r = await fetch(apiUrl('/api/counters'), {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ metrikaId: metrikaId, name: name, allowedDomains: allowedDomains })
});
if (!r.ok) {
var err = await r.json().catch(function() { return {}; });
throw new Error(err.error || 'HTTP ' + r.status);
}
var created = await r.json();
if (!created || !created.id) {
alert('Сервер вернул неверный ответ. Обновите страницу (Ctrl+F5) и попробуйте снова.');
return;
}
await fetchCounters();
document.getElementById('modalAddCounter').classList.add('hidden');
document.getElementById('fetchError').classList.add('hidden');
document.getElementById('noCounter').classList.add('hidden');
selectCounter(created.id);
} catch (e) {
alert('Ошибка: ' + (e.message || e));
}
};
var btnChangeUrl = document.getElementById('btnChangeServerUrl');
if (btnChangeUrl) btnChangeUrl.onclick = function() {
var url = prompt('URL сервера аналитики', API);
if (url) {
localStorage.setItem('rca_server', url.trim());
location.reload();
}
};
if (!localStorage.getItem('rca_server')) {
var url = prompt('URL сервера аналитики (например http://localhost:3333)', 'http://localhost:3333');
if (url) { localStorage.setItem('rca_server', url.trim()); location.reload(); }
}
fetchCounters().then(function() {
if (counters.length && !currentCounterId) {
document.getElementById('fetchError').classList.add('hidden');
selectCounter(counters[0].id);
}
}).catch(function(err) {
if (document.getElementById('fetchError')) {
document.getElementById('fetchError').classList.remove('hidden');
document.getElementById('noCounter').classList.add('hidden');
}
});