Что делает этот плагин

VH Funnel Progress – это мощный инструмент для отслеживания вовлеченности в WordPress, который помогает вам мониторить как зарегистрированные пользователи взаимодействуют с вашим контентом. Плагин:

  • Отслеживает время, которое пользователи проводят на определенных постах или страницах
  • Отправляет данные о вовлеченности через вебхуки, когда пользователи достигают заданного порога времени
  • Работает только с зарегистрированными пользователями, собирая информацию из их профилей
  • Интегрируется с внешними сервисами, такими как Google Sheets, для хранения и анализа данных
  • Помогает определить наиболее привлекательный контент и понять модели поведения пользователей
  • Позволяет создавать целевые маркетинговые воронки на основе реальной вовлеченности пользователей

Этот инструмент идеально подходит для сайтов с платным членством, онлайн-курсов и контент-ориентированных платформ, где понимание вовлеченности пользователей имеет решающее значение.

Настройка плагина

Подключение к Google Sheets

  1. Создайте новую таблицу Google с следующими заголовками столбцов:
    • NAME (Полное имя)
    • eMAIL (Email пользователя)
    • STEP 1 (название должно быть идентичным custom_post_id)
    • STEP 2
    • STEP 3
  2. Перейдите в Extensions > Apps Script в вашей таблице Google.
  3. Замените код по умолчанию следующим:
function doPost(e) {
 try {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = spreadsheet.getSheetByName("All Clients");
var data = JSON.parse(e.postData.contents);
// Debugging: Log the incoming data and headers
Logger.log('Incoming data: ' + JSON.stringify(data));
// Get all headers and log them
var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
Logger.log('Headers found: ' + JSON.stringify(headers));
// Find column indices
var nameColumnIndex = headers.indexOf('NAME');
var emailColumnIndex = headers.indexOf('eMAIL');
if (emailColumnIndex === -1) {
throw new Error('Email column not found. Headers are: ' + headers.join(', '));
 }
// Find custom post ID column index
var customPostIdColumnIndex = headers.indexOf(data.custom_post_id);
if (customPostIdColumnIndex === -1) {
throw new Error('Column for custom_post_id not found: ' + data.custom_post_id);
 }
// Get last row with data
var lastRow = sheet.getLastRow();
// If sheet is empty (only headers), create a new row with full data
if (lastRow <= 1) {
var newRow = new Array(headers.length).fill('');
// Set name if available
if (nameColumnIndex !== -1) {
newRow[nameColumnIndex] = data.full_name;
 }
newRow[emailColumnIndex] = data.user_email;
newRow[customPostIdColumnIndex] = data.timestamp;
// Set TG ID if available
var tgIdColumnIndex = headers.indexOf('tg_id');
if (tgIdColumnIndex !== -1 && data.tg_id) {
newRow[tgIdColumnIndex] = data.tg_id;
 }
sheet.appendRow(newRow);
return ContentService.createTextOutput(JSON.stringify({ "status": "success" }));
 }
// If sheet is not empty, proceed with existing logic
var existingRows = sheet.getRange(2, emailColumnIndex + 1, lastRow - 1, 1).getValues();
var rowToUpdate = -1;
for (var i = 0; i < existingRows.length; i++) {
if (existingRows[i][0] === data.user_email) {
rowToUpdate = i + 2; // +2 because sheets are 1-indexed and we skip header
break;
 }
 }
// If no existing row, create a new one
if (rowToUpdate === -1) {
var newRow = new Array(headers.length).fill('');
// Set name if available
if (nameColumnIndex !== -1) {
newRow[nameColumnIndex] = data.full_name;
 }
newRow[emailColumnIndex] = data.user_email;
newRow[customPostIdColumnIndex] = data.timestamp;
// Set TG ID if available
var tgIdColumnIndex = headers.indexOf('tg_id');
if (tgIdColumnIndex !== -1 && data.tg_id) {
newRow[tgIdColumnIndex] = data.tg_id;
 }
sheet.appendRow(newRow);
rowToUpdate = sheet.getLastRow();
 } else {
// Update the specific column with timestamp only if it's empty
var currentCustomPostId = sheet.getRange(rowToUpdate, customPostIdColumnIndex + 1).getValue();
if (!currentCustomPostId) {
sheet.getRange(rowToUpdate, customPostIdColumnIndex + 1).setValue(data.timestamp);
 }
// Update name if it's empty
if (nameColumnIndex !== -1) {
var currentName = sheet.getRange(rowToUpdate, nameColumnIndex + 1).getValue();
if (!currentName && data.full_name) {
sheet.getRange(rowToUpdate, nameColumnIndex + 1).setValue(data.full_name);
 }
 }
// Optionally update other fields
var tgIdColumnIndex = headers.indexOf('tg_id');
if (tgIdColumnIndex !== -1 && data.tg_id) {
if (!sheet.getRange(rowToUpdate, tgIdColumnIndex + 1).getValue()) {
sheet.getRange(rowToUpdate, tgIdColumnIndex + 1).setValue(data.tg_id);
 }
 }
 }
return ContentService.createTextOutput(JSON.stringify({ "status": "success" }));
 } catch (error) {
Logger.log('Full Error: ' + error.toString());
return ContentService.createTextOutput(JSON.stringify({
"status": "error",
"message": error.toString()
 }));
 }
}

// Test function to see headers
function testHeaders() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getActiveSheet();
  
  // Log sheet name
  Logger.log('Active Sheet Name: ' + sheet.getName());
  
  // Get headers
  var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
  Logger.log('Headers: ' + JSON.stringify(headers));
  
  // Check email column
  var emailColumnIndex = headers.findIndex(header => header.toLowerCase() === 'email');
  Logger.log('Email Column Index: ' + emailColumnIndex);
  
  // If email column not found, log alternative possibilities
  if (emailColumnIndex === -1) {
    var possibleEmailColumns = headers.filter(header => 
      header.toLowerCase().includes('email') || 
      header.toLowerCase().includes('mail')
    );
    Logger.log('Possible Email Columns: ' + JSON.stringify(possibleEmailColumns));
  }
}
  1. Сохраните скрипт и опубликуйте его как веб-приложение:
    • Нажмите на Deploy > New deployment
    • Выберите “Web app” как тип развертывания
    • Установите “Execute as” на “Me”
    • Установите “Who has access” на “Anyone”
    • Нажмите “Deploy”
  2. Скопируйте URL веб-приложения, предоставленный после развертывания.
  3. В админке WordPress перейдите в Settings > Funnel Progress и вставьте URL в поле “Default Webhook URL”.
  4. Нажмите “Save Changes”.

Использование плагина

Настройка отслеживания для отдельных постов/страниц

  1. Отредактируйте любой пост или страницу, где вы хотите отслеживать вовлеченность пользователей.
  2. Найдите мета-блок “Funnel Progress Tracking” в боковой панели.
  3. Настройте следующие параметры:
    • Отметьте “Enable engagement tracking”, чтобы активировать отслеживание для этого поста/страницы
    • Введите URL вебхука (или оставьте пустым, чтобы использовать значение по умолчанию из настроек)
    • Установите “Minutes before trigger” – это время, которое пользователь должен провести на странице, прежде чем сработает вебхук
    • При желании введите “Post/Page ID” – пользовательский идентификатор, который вы можете использовать для отслеживания этого контента
  4. Сохраните или обновите пост/страницу.

Как работает отслеживание

  1. Когда авторизованный пользователь посещает пост или страницу с включенным отслеживанием, плагин начинает мониторить время на странице.
  2. Плагин отслеживает активное взаимодействие, а не просто открытые вкладки.
  3. Как только пользователь проводит указанное количество времени (например, 5 минут) на странице, плагин отправляет вебхук со следующей информацией:
    • ID поста (внутренний ID WordPress)
    • Пользовательский ID поста (если указан)
    • Информация о пользователе (ID, email, имя)
    • Контактные данные (ID в Telegram, номер телефона, если доступно)
    • Точное время, проведенное на странице
    • Текущая временная метка и URL страницы
  4. Эти данные затем записываются в вашу таблицу Google или другой конечный пункт вебхука. В случае с Google Таблицей в клетку столбца с названием идентичным ID поста (или страницы) будет вписана текущая временная метка – то есть будет отмечено, что пользователь провел, например, 5 минут на конкретной странице.

Анализ данных

Данные, собранные в вашей таблице Google, можно использовать для:

  • Определения контента, который удерживает пользователей дольше всего
  • Отслеживания индивидуальных путей пользователей через ваш контент
  • Создания сегментов на основе уровней вовлеченности
  • Запуска автоматизированных рабочих процессов на основе достижения этапов вовлеченности
  • Оптимизации вашей контент-стратегии на основе реальных данных использования

Расширенное использование

  • Несколько вебхуков: Вы можете установить разные URL-адреса вебхуков для разных постов, чтобы отправлять данные в различные конечные точки.
  • Пользовательские ID постов: Используйте содержательные идентификаторы вместо ID постов WordPress для лучшей организации данных.
  • Пороги времени: Варьируйте порог времени в зависимости от длины или важности контента.
  • Интеграция с другими инструментами: Вебхук может подключаться к различным сервисам помимо Google Sheets, включая CRM-системы, платформы email-маркетинга или пользовательские приложения.

Устранение неполадок

  • Убедитесь, что пользователи авторизованы – плагин отслеживает только зарегистрированных пользователей
  • Проверьте, что профили пользователей содержат необходимую информацию (email, имя и т. д.)
  • Проверьте URL-адреса вебхуков на опечатки или проблемы с подключением
  • Просмотрите разрешения скрипта Google Apps, если данные не записываются
  • Тестируйте с более короткими порогами времени во время начальной настройки, чтобы подтвердить функциональность

СТОИМОСТЬ ПЛАГИНА:

85€

По оплате по оплате и функциональности пишите в Телеграм: https://t.me/atmoravi