Кейс Райффайзен банка: Как бороться с мошенничеством в CPA-сетях
Опубликовано: 2022-05-25По мере развития цифрового маркетинга растет и мошенничество с цифровой партнерской рекламой, которое становится серьезной проблемой для онлайн-маркетологов. Это выполняется путем отправки нежелательного трафика на веб-сайты или использования ботов для запуска партнерских вознаграждений. Независимо от конкретного метода, он все равно берет 1 доллар из каждых 3 долларов, заработанных с помощью онлайн-рекламы. Другими словами, это значительная сумма украденных доходов, совершаемых каждый день.
В данном случае мы описываем решение, предоставленное командой OWOX BI для Райффайзен банка, которое пригодится как банкам, так и любым другим пользователям CPA-сети.
Оглавление
- Вызов
- Решение
- Шаг 1. Соберите необработанные данные
- Шаг 2. Обработайте данные
- Шаг 3. Создайте отчеты
- Полученные результаты
Вызов
Специалисты по маркетингу Райффайзен обнаружили резкий рост расходов на партнерский трафик при неизменном доходе. Еще одна проблема заключалась в том, что у клиентов банка были короткие перерывы в сессии при вводе данных для анкеты на сайте.
Вот почему Райффайзен предположил, что некоторые из их CPA-партнеров могли подставить значение источника трафика на странице оформления заказа банка. Работает это так: например, пользователь устанавливает расширение для браузера, чтобы получать скидки. Когда пользователь переходит на ваш сайт и открывает кассу, расширение отображает всплывающее окно с предложением скидки. При наличии кликов по ссылке из всплывающего окна расширение автоматически перезаписывает данные об источнике трафика в куки с данными об источниках трафика аффилиатов.
Решение
Маркетинговая команда решила начать со сбора необработанных данных о поведении пользователей, чтобы подтвердить гипотезу о том, что аффилиаты переписывают данные об источниках трафика в свою пользу. Далее собирались данные о конкретных клиентах. У этих клиентов было два сеанса на одной странице менее чем за 60 секунд, и источник трафика второго сеанса был переключен на партнерский. Такие данные об этих клиентах помогли бы определить аффилированных партнеров, которые приписали трафик из других каналов себе. При наличии этих данных можно было бы прекратить сотрудничество с недобросовестными веб-мастерами и оптимизировать бюджет на маркетинг.
Команда OWOX BI помогла собрать и обработать необходимые данные. Вот схема для демонстрации потока данных:

Шаг 1. Соберите необработанные данные
Google Analytics производит выборку данных, когда количество сеансов превышает порог выборки. Поэтому аналитики OWOX BI предложили собирать данные в Google BigQuery. Более того, это облачное хранилище данных соответствует самым высоким стандартам безопасности, что действительно важно для банка.
Для настройки импорта данных с сайта в Google BigQuery Райффайзен использовал OWOX BI Pipeline. Таким образом, специалисты компании получали полные данные в режиме, близком к реальному времени, и собирали метку времени каждого попадания. Такое решение позволяло отслеживать все возможные последовательности действий пользователя по сеансам в рамках одного отчета. Например, вам нужен отчет о пользователях, которые посетили вашу компанию/промо-страницу, вернулись на сайт по CPC и, наконец, что-то купили. Еще одна необходимая вещь — это отобразить эти посещения за выбранную дату в отчете. Вот запрос для получения нужного вам отчета:
SELECT cp.promo.date AS Date, cp.promo.clientId AS ClientId, cp.promo.time AS Promo_time, cp.cpc.time AS CPC_time, send.time AS SEND_time FROM ( SELECT promo.date, promo.clientId, promo.time, cpc.time FROM ( SELECT date, clientId, MIN(time) AS time FROM TABLE_DATE_RANGE({dataSetName}.{tableName},TIMESTAMP('{startDate}'), TIMESTAMP('{endDate}')) WHERE page.pagePath CONTAINS '/promo/' AND type = 'pageview' AND traffic.medium != 'cpc' GROUP BY date, clientId, ORDER BY clientId ASC) AS promo LEFT JOIN ( SELECT date, clientId, traffic.medium, time FROM TABLE_DATE_RANGE({dataSetName}.{tableName},TIMESTAMP('{startDate}'), TIMESTAMP('{endDate}')) WHERE traffic.medium = 'cpc' AND type = 'pageview' GROUP BY date, clientId, traffic.medium, time ORDER BY clientId ASC) AS cpc ON promo.clientId=cpc.clientId WHERE promo.time < cpc.time) AS cp LEFT JOIN ( SELECT date, clientId, time FROM TABLE_DATE_RANGE({dataSetName}.{tableName},TIMESTAMP('{startDate}'), TIMESTAMP('{endDate}')) WHERE eventInfo.eventCategory = 'send_ok' AND type = 'event' GROUP BY date, clientId, time ORDER BY clientId ASC) AS send ON cp.promo.clientId = send.clientId WHERE cp.cpc.time < send.time
SELECT cp.promo.date AS Date, cp.promo.clientId AS ClientId, cp.promo.time AS Promo_time, cp.cpc.time AS CPC_time, send.time AS SEND_time FROM ( SELECT promo.date, promo.clientId, promo.time, cpc.time FROM ( SELECT date, clientId, MIN(time) AS time FROM TABLE_DATE_RANGE({dataSetName}.{tableName},TIMESTAMP('{startDate}'), TIMESTAMP('{endDate}')) WHERE page.pagePath CONTAINS '/promo/' AND type = 'pageview' AND traffic.medium != 'cpc' GROUP BY date, clientId, ORDER BY clientId ASC) AS promo LEFT JOIN ( SELECT date, clientId, traffic.medium, time FROM TABLE_DATE_RANGE({dataSetName}.{tableName},TIMESTAMP('{startDate}'), TIMESTAMP('{endDate}')) WHERE traffic.medium = 'cpc' AND type = 'pageview' GROUP BY date, clientId, traffic.medium, time ORDER BY clientId ASC) AS cpc ON promo.clientId=cpc.clientId WHERE promo.time < cpc.time) AS cp LEFT JOIN ( SELECT date, clientId, time FROM TABLE_DATE_RANGE({dataSetName}.{tableName},TIMESTAMP('{startDate}'), TIMESTAMP('{endDate}')) WHERE eventInfo.eventCategory = 'send_ok' AND type = 'event' GROUP BY date, clientId, time ORDER BY clientId ASC) AS send ON cp.promo.clientId = send.clientId WHERE cp.cpc.time < send.time
Ниже представлена таблица со всеми данными, полученными в результате запроса.

Шаг 2. Обработайте данные
Список необходимых значений был создан для определения значений источника трафика, которые были изменены с партнерским:

- Логин пользователя.
- Источник и носитель первой и следующей сессий.
- Время между сеансами.
- Первый и конечный URL каждого сеанса.
- События в каждом сеансе.
- Событие транзакции в финальном сеансе.
Далее, чтобы убедиться, что значения источников трафика точно переписаны, аналитики OWOX BI выбрали фильтрацию данных с учетом следующих условий:
- Промежуток времени между двумя сеансами должен составлять до 60 секунд.
- Страница сайта должна оставаться неизменной при смене источника.
- В последнем сеансе должна быть транзакция.
- Среда трафика в финальной сессии должна быть партнерской.
Вот SQL-запрос, который использовался для получения необходимых данных:
SELECT * FROM ( SELECT traff.clientId clientId, traff.page.pagePath pagePath, traff.traffic.source startSource, traff.traffic.medium startMedium, traff.time startTime, aff.evCategory eventCategory, aff.evlabel eventLabel, aff.evSource finishSource, aff.evMedium fifnishMedium, aff.time finishTime, aff.isTransaction isTransaction, aff.pagePath link, traff.time - aff.time AS diff FROM ( SELECT clientId, page.pagePath, traffic.source, traffic.medium, date, INTEGER(time) time FROM TABLE_DATE_RANGE({dataSetName}.{tableName},TIMESTAMP('{startDate}'), TIMESTAMP('{endDate}')) WHERE traffic.medium != 'affiliate')AS traff JOIN ( SELECT total.date date, total.time time, total.clientId clientId, total.eventInfo.eventCategory evCategory, total.eventInfo.eventLabel evlabel, total.traffic.source evSource, total.traffic.medium evMedium, tr.eventInfo.eventCategory isTransaction, total.page.pagePath pagePath FROM ( SELECT clientId, page.pagePath, eventInfo.eventCategory, eventInfo.eventLabel, traffic.source, traffic.medium, date, INTEGER(time) time FROM TABLE_DATE_RANGE({dataSetName}.{tableName},TIMESTAMP('{startDate}'), TIMESTAMP('{endDate}')) WHERE traffic.medium = 'affiliate') AS total LEFT JOIN ( SELECT clientId, date, eventInfo.eventCategory, INTEGER(time) time FROM TABLE_DATE_RANGE({dataSetName}.{tableName},TIMESTAMP('{startDate}'), TIMESTAMP('{endDate}')) WHERE eventInfo.eventCategory = 'send_ok' GROUP BY 1, 2, 3, 4) AS tr ON total.clientId = tr.clientId AND total.date = tr.date WHERE tr.eventInfo.eventCategory = 'send_ok' AND tr.time>total.time)AS aff ON traff.clientId = aff.clientId) WHERE diff >-60 AND diff<0 GROUP BY 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 ORDER BY clientId, finishTime
SELECT * FROM ( SELECT traff.clientId clientId, traff.page.pagePath pagePath, traff.traffic.source startSource, traff.traffic.medium startMedium, traff.time startTime, aff.evCategory eventCategory, aff.evlabel eventLabel, aff.evSource finishSource, aff.evMedium fifnishMedium, aff.time finishTime, aff.isTransaction isTransaction, aff.pagePath link, traff.time - aff.time AS diff FROM ( SELECT clientId, page.pagePath, traffic.source, traffic.medium, date, INTEGER(time) time FROM TABLE_DATE_RANGE({dataSetName}.{tableName},TIMESTAMP('{startDate}'), TIMESTAMP('{endDate}')) WHERE traffic.medium != 'affiliate')AS traff JOIN ( SELECT total.date date, total.time time, total.clientId clientId, total.eventInfo.eventCategory evCategory, total.eventInfo.eventLabel evlabel, total.traffic.source evSource, total.traffic.medium evMedium, tr.eventInfo.eventCategory isTransaction, total.page.pagePath pagePath FROM ( SELECT clientId, page.pagePath, eventInfo.eventCategory, eventInfo.eventLabel, traffic.source, traffic.medium, date, INTEGER(time) time FROM TABLE_DATE_RANGE({dataSetName}.{tableName},TIMESTAMP('{startDate}'), TIMESTAMP('{endDate}')) WHERE traffic.medium = 'affiliate') AS total LEFT JOIN ( SELECT clientId, date, eventInfo.eventCategory, INTEGER(time) time FROM TABLE_DATE_RANGE({dataSetName}.{tableName},TIMESTAMP('{startDate}'), TIMESTAMP('{endDate}')) WHERE eventInfo.eventCategory = 'send_ok' GROUP BY 1, 2, 3, 4) AS tr ON total.clientId = tr.clientId AND total.date = tr.date WHERE tr.eventInfo.eventCategory = 'send_ok' AND tr.time>total.time)AS aff ON traff.clientId = aff.clientId) WHERE diff >-60 AND diff<0 GROUP BY 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 ORDER BY clientId, finishTime
Шаг 3. Создайте отчеты
Для дальнейшего анализа была применена надстройка для импорта выбранных данных из Google BigQuery в Google Sheets. С помощью импортированных данных была создана таблица с идентификаторами каждого клиента, чей сеанс был закрыт, а новый сеанс был открыт на той же странице менее чем за минуту между двумя сеансами.

Затем данные были объединены в сводную таблицу, чтобы продемонстрировать, что партнерские маркетологи действовали недобросовестно. Цифры на скриншоте ниже изменены и приведены для примера:

Например, отчет демонстрирует количество транзакций с переписанным значением источника, а также то, какие аффилиаты заменили источники трафика на свои. В отчете также показано, какие каналы украли транзакции: CPC и органические.
Полученные результаты
Команда OWOX BI помогла быстро выявить и устранить слабые места в CPA-сетях банка. Благодаря предоставленному решению банк смог отслеживать статистику по аффилейтам (точнее относить конверсии и продажи к каналам трафика) и выявлять случаи мошенничества в CPA-сетях. Команде маркетинга удалось оптимизировать рекламный бюджет, прекратив сотрудничество с двумя недобросовестными партнерами, которые переписали источники трафика и необоснованно завышали счета Райффайзенбанка.