Скрипт для отправки целей в Яндекс Метрику – универсальный инструмент для отслеживания активности посетителей сайта и фиксации действий с email-ссылками. Он помогает автоматически отправлять события (цели) в Метрику, чтобы вы могли видеть, сколько времени посетители проводят на сайте и как часто они копируют ваш email (например, для обратной связи).
А также он позволяет не платить за клики по рекламе Яндекс Директ, которые постоянно растут в цене – можно настроить стратегию кампании с оплатой за конверсии, например за активного пользователя, который действительно изучал ваш товар или услугу!
Таким образом, вы получаете полную картину активности на сайте и сможете использовать эти данные для аналитики, настройки рекламных кампаний и оптимизации работы сайта.
user_active_60_sec
, user_active_90_sec
и т.д.;mailto:
) – при обычном клике или касании цель отправляется сразу;metricId
на номер вашего счётчика (например, 12345678
). user_active_60_sec
, user_active_90_sec
и т.д.;email_copied
.Используйте данные о целях (например, активность пользователя – 180 секунд активности) для настройки стратегий оплаты за конверсии. Например, настройте кампанию с оплатой за конверсии, где конверсия определяется достижением 180 секунд активности. Это позволит более точно оценивать вовлечённость аудитории и оптимизировать рекламный бюджет.
Если нужна помочь с рекламными кампаниями – обращайтесь в наше агентство за настройкой Яндекс Директ.
</body>
на всех нужных страницах вашего сайта. Если используется шаблон, добавьте скрипт в общий футер;user_active_30_sec
user_active_60_sec
user_active_90_sec
user_active_120_sec
user_active_150_sec
user_active_180_sec
user_active_240_sec
user_active_300_sec
email_copied
reachGoal('email_copied')
). После установки скрипта добавьте параметр /?_ym_debug=2
к URL вашего сайта, чтобы увидеть отладочную информацию в консоли и убедиться, что цели отправляются корректно. Изучите подробнее как проверять цели https://yandex.ru/support/metrica/general/check-goal.html
/?_ym_debug=2
к URL вашего сайта (например, https://вашсайт.ru/?_ym_debug=2
). <script>
(function() {
// ------------------ Отслеживание активности пользователя ------------------
var cursorInWindow = true;
var userIsActive = true;
var activeTime = parseInt(sessionStorage.getItem('activeTime')) || 0;
var activityTimeout;
var intervalId = null;
var inactivityThreshold = 5000; // 5 секунд бездействия
var metricId = '12345678'; // Номер счётчика Яндекс Метрики
var allGoalsSent = false;
var timeIntervals = [30, 60, 90, 120, 150, 180, 240, 300]; // интервалы в секундах
var sentGoals = JSON.parse(sessionStorage.getItem('sentGoals')) || {};
function isGoalSent(goalId) {
return sentGoals.hasOwnProperty(goalId);
}
function setGoalAsSent(goalId) {
sentGoals[goalId] = true;
sessionStorage.setItem('sentGoals', JSON.stringify(sentGoals));
}
function sendGoal(goalId) {
if (!isGoalSent(goalId) && typeof window.ym === 'function') {
console.log('Отправка цели:', goalId);
window.ym(metricId, 'reachGoal', goalId);
setGoalAsSent(goalId);
}
}
function trackActivity() {
if (allGoalsSent) return;
if (!intervalId) {
intervalId = setInterval(function() {
if (cursorInWindow && userIsActive) {
activeTime++;
sessionStorage.setItem('activeTime', activeTime);
for (var i = 0; i < timeIntervals.length; i++) {
var sec = timeIntervals[i];
var goalId = 'user_active_' + sec + '_sec';
if (activeTime >= sec && !isGoalSent(goalId)) {
sendGoal(goalId);
}
}
}
}, 1000);
}
resetActivityTimer();
}
function stopTracking() {
clearInterval(intervalId);
intervalId = null;
}
function resetActivityTimer() {
clearTimeout(activityTimeout);
activityTimeout = setTimeout(function() {
stopTracking();
}, inactivityThreshold);
}
function checkCursorInWindow(event) {
cursorInWindow = !(event.relatedTarget == null);
if (!cursorInWindow) stopTracking();
}
function handleVisibilityChange() {
if (document.hidden) {
stopTracking();
} else {
userIsActive = true;
trackActivity();
}
}
function handleFocus() {
userIsActive = true;
trackActivity();
}
function handleBlur() {
stopTracking();
}
window.addEventListener('mouseout', checkCursorInWindow);
window.addEventListener('mouseover', function() { cursorInWindow = true; });
document.addEventListener('visibilitychange', handleVisibilityChange);
window.addEventListener('focus', handleFocus);
window.addEventListener('blur', handleBlur);
var activityEvents = ['mousemove', 'scroll', 'click', 'keydown'];
for (var i = 0; i < activityEvents.length; i++) {
document.addEventListener(activityEvents[i], trackActivity);
}
// ------------------ Отслеживание email-ссылок ------------------
function sendEmailCopiedGoal() {
if (!isGoalSent('email_copied') && typeof window.ym === 'function') {
console.log('Отправка цели: email_copied');
window.ym(metricId, 'reachGoal', 'email_copied');
setGoalAsSent('email_copied');
}
}
function emailLinkHandler(e) {
var target = e.target;
while (target && target !== document) {
if (target.tagName && target.tagName.toLowerCase() === 'a') {
var href = target.getAttribute('href');
if (href && href.indexOf('mailto:') === 0) {
if (e.type === 'click' && (typeof e.button === 'undefined' || e.button === 0)) {
sendEmailCopiedGoal();
} else if (e.type === 'touchstart') {
sendEmailCopiedGoal();
}
break;
}
}
target = target.parentNode;
}
}
document.addEventListener('click', emailLinkHandler);
document.addEventListener('touchstart', emailLinkHandler);
document.addEventListener('copy', function() {
var selectedText = window.getSelection().toString().trim();
if (/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(selectedText)) {
if (contextMenuTimer) {
clearTimeout(contextMenuTimer);
contextMenuTimer = null;
}
sendEmailCopiedGoal();
}
});
var pendingEmailCopy = null;
var contextMenuTimer = null;
document.addEventListener('contextmenu', function(e) {
var target = e.target;
pendingEmailCopy = null;
if (contextMenuTimer) {
clearTimeout(contextMenuTimer);
contextMenuTimer = null;
}
while (target && target !== document) {
if (target.tagName && target.tagName.toLowerCase() === 'a') {
var href = target.getAttribute('href');
if (href && href.indexOf('mailto:') === 0) {
pendingEmailCopy = href.replace('mailto:', '').trim();
console.log('contextmenu: pendingEmailCopy установлено: ' + pendingEmailCopy);
contextMenuTimer = setTimeout(function(){
console.log('contextmenu timer fired, отправляем цель');
sendEmailCopiedGoal();
pendingEmailCopy = null;
contextMenuTimer = null;
}, 1500);
break;
}
}
target = target.parentNode;
}
});
document.addEventListener('click', function(e) {
if (contextMenuTimer) {
clearTimeout(contextMenuTimer);
contextMenuTimer = null;
}
pendingEmailCopy = null;
});
function setupEmailCopyTracking() {
var emailLinks = document.querySelectorAll('a[href^="mailto:"]');
for (var i = 0; i < emailLinks.length; i++) {
(function(link) {
link.addEventListener('touchstart', function(e) {
sendEmailCopiedGoal();
});
})(emailLinks[i]);
}
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', setupEmailCopyTracking);
} else {
setupEmailCopyTracking();
}
})();
</script>
Если вам понравился этот скрипт и вы хотите узнавать ещё больше полезных советов, подписывайтесь на наш Telegram-канал https://t.me/keyclient. Мы регулярно делимся фишками, инструментами и практическими решениями для оптимизации сайтов и работы с Яндекс Метрикой!
Веб-форма не найдена.