Сергей Макаров

веб-аналитика

Как объединить данные из MCF API и CORE API

Так сложилось, что данные по многоканальным последовательностям в Google Analytics выделены в отдельное API: Multi-Channel Funnels Reporting.
В интерфейсе Google Analytics нельзя построить отчет по параметрам и метрикам MCF API → нужно выгружать сторонними инструментами.

Покажу, как объединить данные MCF API и CORE API, и как построить отчеты на основе этих данных.

Запросы и обработка данных

Используем аддон Google Analytics для Spreadsheet.
1

Параметры MCF:


mcf:transactionId
mcf:conversionDate
mcf:basicChannelGroupingPath
mcf:pathLengthInInteractionsHistogram
mcf:timeLagInDaysHistogram

Метрики MCF:

mcf:totalConversionValue

Параметры CORE:

ga:transactionId
ga:productName

Метрики CORE:

ga:itemRevenue

Фильтруем только нужные конверсии:

mcf:conversionType==Transaction

Получили данные → теперь обработаем их. Например, в Power Query.

Получаем данные from web:

2

После обработки присоединяем таблицу MCF к таблице CORE через функцию Merge:
3

Выгружаем на лист и строим сводную.

Отчеты

Отчет показывает зависимость между ценностью корзины и количеством дней до транзакции:
dayshistogram

Видим, что наибольший доход приходится на корзины в диапазоне 500-2499 и длиной пути в 1 день.

Отчет показывает зависимость между ценностью корзины и количеством взаимодействий до транзакции:
interactionshistogram

Можно построить и другие отчеты. Например, исследовать зависимость между параметрами ga:productName, mcf:timeLagInDaysHistogram и метрикой mcf:totalConversionValue.

Нет комментариев

, ,

Анализ параметра «Число сеансов»

В Google Analytics есть параметр «Число сеансов». Подробное описание из справки:

Каждый раз, когда пользователь начинает взаимодействие с вашим контентом, ему засчитывается ещё один сеанс. Допустим, пользователь А впервые взаимодействует с вашим контентом в январе и ему засчитан один сеанс. Если в феврале этот пользователь снова вернется на сайт, количество сеансов станет равно двум, при следующем посещении – трем и т. д.

Исследовал взаимосвязь между числом сеансов и показателями коэффициента транзакции и дохода.

Выгружаем данный по всем пользователям или по сегменту. Я выгрузил по платному трафику. Создаем сводную:

count of sessions

Добавляем вычисляемый показатель «Ценность сеанса» по формуле Доход/Сеанс и строим диаграмму:

Count of sessions 2

Вывод:

— При первом посещении ценность сеанса невысока, но между 2 и 6 сеансом ценность увеличилась на 20%.

— Коэффициент транзакции также высок между 2 и 5 сеансом.

Как использовать:

Создать список ремаркетинга с условием: «(2 <Число сеансов <6) – купившие». Привлечем потенциально ценных пользователей.

Нет комментариев

,

Как отслеживать события в GTM c помощью jQuery

jQuery — популярная javascript библиотека. У jQuery простой и понятный синтаксис. Базовая конструкция:


$('#element').on('event', function (){
	dataLayer.push({
		'event':'GAevent',
		'eventCategory': 'GAeventCategory',
		'eventAction':   'GAeventAction'
	});
	fbq('track', 'Lead');
	yaCounterXXXXXX.reachGoal('yaEvent');
});

Алгоритм состоит из 3 шагов:

— С помощью селектора выбираем нужный элемент для отслеживания. Конструкция $('#element') найдет элемент с идентификатором #element

— Задаем тип события в конструкции .on('event', function (){});

— Внутри function (){} передаем данные в dataLayer и счетчики.

Опишу примеры использования.

Отслеживание клика

Базовая конструкция:


$('.clickElement').on('click', function (){
	dataLayer.push({
		'event':'GAevent',
		'eventCategory': 'GAeventCategory',
		'eventAction':   'GAeventAction'
	});
});

Если в момент инициализации скрипта элемента еще нет на странице, то используем:


$(document).on('click', '.clickElement', function() {
   dataLayer.push({
		'event':'GAevent',
		'eventCategory': 'GAeventCategory',
		'eventAction':   'GAeventAction'
	});
});

Для определения элементов на странице:


$(document).find('*').on('click', function(e){console.log(e)});

Отправка формы

Простая отправка формы


$('#submitElement').on('submit', function (){
	dataLayer.push({
		'event':'GAevent',
		'eventCategory': 'GAeventCategory',
		'eventAction':   'GAeventAction'
	});
});

Отправка формы с валидацией


$('#id_формы').on('submit', function() {
   	if ($(this).find('.errorClass').length) return;
   	dataLayer.push({
		'event':'GAevent',
		'eventCategory': 'GAeventCategory',
		'eventAction':   'GAeventAction'
	});
});

Заменить .errorClass на класс ошибки, которая возникает при валидации формы.

Отправка формы AJAX


// С точным соответствием
$( document ).ajaxSuccess(function( event, xhr, settings ){
 	if ( settings.url === "requestURL"){
    	dataLayer.push({
			'event':'GAevent',
			'eventCategory': 'GAeventCategory',
			'eventAction':   'GAeventAction'
		});
 	}
});

// Фильтр по "содержит"
$( document ).ajaxSuccess(function( event, xhr, settings ){
	if ( settings.url.indexOf("requestURL") > -1 ){
    	dataLayer.push({
			'event':'GAevent',
			'eventCategory': 'GAeventCategory',
			'eventAction':   'GAeventAction'
		});
 	}
});

Не всегда срабатывает. В объектах ищем к чему привязать отправку:


$(document).ajaxSuccess(function( event, xhr, settings ){
	console.log(xhr); 
});

Или так:


$(document).ajaxSuccess(function( event, xhr, settings ){
	console.log(settings);
});

Копирование


function getSelectionText() {
				var text = "";
				if (window.getSelection) {
					text = window.getSelection().toString();
				} else if (document.selection && document.selection.type != "Control") {
					text = document.selection.createRange().text;
				}
				return text;
			}
			document.addEventListener("copy", function ( e ){
				if (getSelectionText() === "#ваш_текст#")
					dataLayer.push({
						'event': 'GAevent',
						'eventCategory': 'GAeventCategory',
						'eventAction': 'GAeventAction'
					});
			});

Изменение полей формы


$('.changeElement').on('change', function (){
	dataLayer.push({
		'event':'GAevent',
		'eventCategory': 'GAeventCategory',
		'eventAction':   'GAeventAction'
		});
});

Какой элемент находится в поле видимости


var $window = $(window);
var gtmFlagFormaView = true;
var gtmFormaView;
var gtmTopHeight = $window.innerHeight();
var elemPosTop = $("#idElement").offset().top;
var doit;
$window.scroll(function(){
	gtmFormaView = $window.scrollTop()+gtmTopHeight;
 	if (gtmFormaView > elemPosTop && gtmFlagFormaView){
  		gtmFlagFormaView = false; 
  		dataLayer.push({
   			'event':         'GAevent',
   			'eventCategory': 'GAeventCategory',
   			'eventAction':   'GAeventAction'
 		});
	}
})

function resizedw(){
 	elemPosTop = $("#idElement").offset().top;
	gtmTopHeight = $window.innerHeight();
}

window.onresize = function(){
	clearTimeout(doit);
  	doit = setTimeout(resizedw, 300);
};

На каких полях возникают ошибки заполнения


$('.classForm').on('submit', function(){
  setTimeout(function(){
    if ($('#idInput1').hasClass('error1')){
      dataLayer.push({
        'event':'GAevent',
        'eventCategory':'GAeventCategory',
        'eventAction':'GAeventAction'
      });
    }
    if ($('#idInput2').hasClass('error2')){
      dataLayer.push({
        'event':'GAevent',
        'eventCategory':'GAeventCategory',
        'eventAction':'GAeventAction'
      });
    }
  }, 300);
});

Полезные ссылки

Официальная документация
Документация (ru)

Нет комментариев

, ,

Схема оптимизации контекстной рекламы

Публикую mind map по оптимизации контекстной рекламы. Это стандартные и проверенные методы, подойдут для большинства проектов. Схема не затрагивает оптимизацию сайта.

Оптимизация_контекстной_рекламы
Скачать pdf

 

Комментарии к некоторым разделам:

Оценка эффективности по бизнес KPI

Что оцениваем:

— Источник/канал

— Кластер рекламных кампаний

— Кампании

— Группы объявлений

— Объявления

— Кластер ключевых слов

— Ключевые слова

— Площадки

Дополнительно:

— Интересы

— Аудитории

— Расширения

— Время суток и день недели

— География

— Соц. демо

— Устройства

Примеры использования:

— Найти потенциально выгодные ключевые слова. Вывести ключевые фразы с CPA ниже среднего на 20% и долей показа в спецразмещении ниже 20%. Повысить ставки для найденных ключевых слов.

— Построить отчет по ROI в разрезе рекламных кампаний. Найти убыточные кампании и переработать их.

— Выгрузить данные из AdWords и построить отчет по зависимости метрик CR(%) и CPA от позиции объявления на поиске. Определить выгодные позиции и настроить автоматические правила.

Оценка эффективности по синтетическим KPI

Примеры использования:

— Проверить релевантность ключевых слов, вывести ключевые слова с CTR менее 5% в спецразмещении.

— Найти объявления в кампании КМС с показателем относительного CTR (relative CTR) < 0,7. Переработать найденные объявления.

— Найти «скликивающие» площадки КМС с CTR>7%.

Поиск новых минус слов

Используем отчет по поисковым фразам в Яндекс Метрике и Google AdWords.

Расширение семантики

Проверяем отчеты по поисковым фразам, поиску по сайту, отчеты из вебмастеров.

Анализ потерянных показов по бюджету

Потери по бюджету – увеличиваем бюджет или(и) уменьшаем ставки.

Тестирование

Методы тестирования:

— «Шахматка»

— Группы объявлений в Яндекс Директ

— Чередование в AdWords

— Эксперименты AdWords

Добавление нового функционала

Каждые 2-3 месяца рекламные системы выкатывают новый функционал: обновляются таргетинги, появляются новые расширения и дополнительные возможности. Тестируем обновления → делаем выводы.

Подключение оптимизаторов

Внутренние оптимизаторы AdWords:

— Оптимизатор цены за конверсию

— Оптимизатор конверсий

— Гибкие стратегии

Внутренние оптимизаторы Яндекс Директ:

— Недельный бюджет с максимальной конверсией

— Средняя рентабельность инвестиций

— Средняя цена конверсии

Внешние оптимизаторы:

— Alytics

— K50

— Marin

Нет комментариев

,