Як перемогти шахрайство в Я. Директ AdWords на 600 тисяч рублів у місяць

За останні півроку нам вдалося перемогти «шахрайство» нашої контекстної реклами з бюджетом в 1 мільйон рублів в місяць.

Ключем перемоги над фродом став щохвилинний моніторинг трафіку з повідомленнями про аномальні зміни та відключенням проблемних оголошень за API, і ряд звітів, які відображають ситуацію в реальному часі.


Малюнок 1. Діаграма кількості відвідувачів за ключовими словами по декаминутам

Як дізнатися, що вас атакують?

Одним з перших ознак «склікування» реклами буде збільшення відсотка коштів, що повертаються за фрод в Директі і AdWords.
«Яндекс Директ витрати на фрод автоматично повертаються на баланс рекламної кампанії. Кількість кліків, відсіяних системою захисту від фроду, відображається у звітах «статистика по днях», «загальна статистика» в рядку «недійсні кліки за весь вибраний період.» – довідка Я. Діректа «недійсні кліки».

В AdWords відображення рівня «недійсних кліків» можна включити на вкладці «стовпці»:


Малюнок 2. Налаштовані стовпці з рівнем «недійсних кліків» AdWords

В нашому випадку, при середньому рівні «недійсних кліків» в Директе ≈ 10%, Яндексі раптом став повертати 40% рекламного бюджету, а через місяць і зовсім 54%.

Наступна ознака фроду – це необґрунтоване зростання кількості переходів і сильні зміни поведінкових показників по ряду груп оголошень.

Ми помітили, що за низкою ключових слів, за якими ніколи не було більше 200 відвідувачів в день, раптом з’явилися сплески до 3 000 відвідувачів. За фактом, бюджет, в дні подібних активностей, міг піти на одну рекламну кампанію, якщо її вчасно не зупиняли.


Малюнок 3. Необґрунтоване зростання трафіку по певній групі оголошень в Директ

Яндекс і Google не захищають від фроду

Досить прочитати обговорення рівня фроду в контекстній рекламі в офіційному Клубі Діректа, щоб переконатися: багато рекламодавців втрачають через фроду гроші.

Google офіційно визнає помилки своєї системи захисту і надає рекламодавцям «Refund Claims» (повернення витраченого бюджету). За статистикою сервісу ClickSease, Google Ads в середньому повертає 12% рекламного бюджету.

Як повернути частину грошей за «склік» через AdWordsНеобхідно відправити скаргу на «недійсні кліки» в Адвордс, після розгляду якої вам відшкодують ≈ 12% витрачених коштів. Також сервіс ClickSease автоматичний відправляє в Google подібні вимоги на повернення грошей раз в 2 місяці.

В нашому випадку, Google AdWords спочатку визнав 18% нашого трафіку «недійсними» і повернув за них гроші, а коли ми відправили скаргу «refund claims», Google відшкодував ще 13% бюджету.

Яндекс ж не визнає вразливість власних фільтрів захисту і на скарги про очевидних випадках фроду, відправляє шаблонний відповідь, що проблема полягає в рекламодавця і його сайті.

В нашому випадку, відсоток «недійсних кліків» у звіті Я. Діректа ніколи не піднімався вище заповітних 50% ні по одній з рекламних кампаній, навіть у дні найзапекліших сплесків, коли 80% бюджету «зливалося» зазвичай мало популярну групу оголошень без дзвінків і заявок.


Малюнок 4. Рівень «недійсних кліків» кампаній в Директ

З яким рівнем атаки ми зіткнулися

Шахрайський трафік прямував за чотирма напрямками бізнесу в двох містах. При підключенні нових рекламних кампаній або запуску давно зупинених, протягом кількох годин «шахрайство» перерозподілялося і на них.

Click Fraud не прив’язувався до часу, та перерозподіл бюджету, наприклад на ніч, не давало ніякого ефекту: свій об’єм лівого трафіку ми все одно отримували. «Шахрайство» відбувалося однаково активно і в РМЯ, і на пошуку Яндекса, і в МЕДІЙНІЙ мережі Google.

На сайті боти симулювали поведінку користувача, переходили за розділами сайту, виділяли текст, природно скролили і переміщали курсор.

Є готові засоби захисту?

У всіх сервісів захисту від клікфрода є всього один інструмент прямої боротьби – це блокування підозрілих IP адрес або майданчиків розміщень в кампаніях Я. Директ AdWords.

У разі, якщо проти вас використовуються динамічні IP, будь-сервіс боротьби з клік фродом завжди буде відставати на один крок від шахраїв у блокуванні їх за IP: бот вже зробить кілька кліків по вашій рекламі до того моменту, коли сервіс внесе цей IP в чорний список і зупинить по ньому показ реклами. До того ж, після того, як шахрайський софт не зможе побачити вашу рекламу, він просто поміняє IP адреса, Hardware-ID і продовжить свої дії.

Читайте також  Хто такий контент-менеджер і що він повинен вміти

При атаці на рекламу в КМС або РМЯ, зазвичай використовуються різні місця розміщення, і системи автоматичного захисту не можуть виявити підозрілі майданчиків для блокування.

Повернемося до блокування по IP – тут ми підходимо до найцікавішого – якщо в AdWords допускається блокувати до 500 IP адрес, то в Яндекс Директ можна блокувати всього лише 25 унікальних IP-адрес на одну рекламну кампанію! Такий маленький чорний список IP адрес вже не актуальний, так як зараз можна спокійно закупити 500 IPv4 адрес за 10 тисяч рублів і обійти це обмеження.

Захиститися від «склікування», що виконується на високому рівні, можна лише двома способами:

  1. навчитися не показувати рекламу свідомо шахрайським користувачам або ботам, для чого треба знайти певні «патерни» в їх поведінці і характеристиках;
  2. тимчасово зупиняти конкретні групи оголошень і ключові слова, за якими йде атака.

 

Відрізати частину аудиторії, щоб зберегти її більшу частину

Якщо навчитися не показувати рекламу клік ботам або шахрайським користувачам – то і нашкодити вони не зможуть.

Завжди можна відстежити схожі моделі поведінки і патерни, наприклад, що фрод зазвичай йде за Windows 7 з 5:00 до 9:00 в Москві, і виставити коригування ставок -100% для такої аудиторії в усіх атакованих рекламних кампаніях. Функціонал коригування ставок AdWords досить великий, чого не скажеш про коригування в Yandex Direct.

Шукаємо патерни у фроде через сервіси захисту

Для того, щоб мати уявлення про те, як саме нас атакують, і вручну відстежити закономірності в шахрайському трафік, що ми підключили російський сервіс захисту від фроду ClickFrog. Продукт це давно всім відомий, популярний в середовищі CPA і так далі.

ClickFrog швидко довів повну недієздатність:

  1. у день виділяв не більше 40 підозрілих IP адрес, за трафік з Діректа в 3 000 тисячі переходів в день, і, визнаних навіть, Яндексом 1300 „лівих“ кліків в день;
  2. основний інструмент захисту сервісу – це блокування по IP адресою, команда про яку API відправляється в Я. Директ, проте як тільки чорний список 25 IP адрес заповнюється вручну видаляти останні кілька IP кожної рекламної кампанії і чекати чергового заповнення списку, і так по колу.

Потім ми встановили код американського сервісу ClickSease, націленого на AdWords, і поки ще не працює з Діректом. У сервісу, до речі, є, на відміну від ClickFrog, безкоштовний тестовий період на 2 тижні.

ClickSease виявився корисніше: він почав виловлювати по 300-400 унікальних шахрайських IP в день. По кожному заблокованого IP сервіс віддає статистику:

  • інтернет-провайдер;
  • майданчик з якої відбувся перехід;
  • операційна система;
  • унікальний ID пристрою;
  • час першого і останнього переходу;
  • регіон.

Зі звіту ClickSease нам вдалося виявити закономірності у фроде:

  • у 81% випадків пристрій симулює мобільну ОС: Android або iOS;
  • у 59% випадків геолокація IP адреси відноситься не до Москви, при фроде направленому на Москву.

 

Шукаємо патерни у фроде вручну

Проте навіть таких очевидних патернів виявилося мало для зниження шкоди від фроду, так і відключати рекламу на мобільних не хотілося. Сервіси зазвичай здатні тільки дати ідеї щодо виявлення схожих патернів у фроде, а далі необхідно виявити фрод в Метриці (у разі атаки на Директ) і виділити його в окремих сегмент Яндекс Аудиторій для подальшого аналізу і блокування.


Малюнок 5. Приклад аналізу трафіку за віковими групами в Метриці для пошуку патернів фроду

Зрізи трафіку, які допоможуть визначити паттерни фроду:

  • динаміка аудиторії за віковими групами;
  • динаміка довгострокових інтересів користувачів;
  • динаміка пристроїв і ОС.

У разі AdWords механіка протидії ясна:

  1. визначаємо сегмент аудиторії «заражений» фродом;
  2. виставляємо коригування ставок -100% для обраного сегмента;
  3. відстежуємо зміна показників: конверсія, час на сайті, глибина перегляду, показник відмов.

В Яндекс Директ механіка боротьби складніше і поділяється на два варіанти:

а) вам вдалося знайти очевидний патерн фроду, що відноситься до підлоги, віку або мобільності:

  1. виставляємо коригування ставки -50% або -100% для обраного сегмента;
  2. відстежуємо зміну ключових показників.

б) очевидних патернів не виявлено:

  1. виділяємо фродовий трафік в окремий сегмент Яндекс.Аудиторій (наприклад, ви точно знали, що з 1 по 20 жовтня не могло бути 5 000 переходів по групі оголошень, за якою завжди було не більше 30 відвідувань в день)
  2. через look-alike Яндекса створюємо сегмент схожих на наш фрод користувачів;
  3. виставляємо коригування ставок -100% для створеного вручну сегмента аудиторії;
  4. акуратно тестуємо зниження ставок в рекламі для створених Яндексом сегментів.
Читайте також  Google Analytics: створюємо списки ремаркетингу зі старих користувачів без обмежень

 

Будуємо діаграми, які показують фрод

Фрод завжди породжує очевидні вогнища і піки, будь то зарозуміла софт з імітацією поведінки цього користувача або група фрілансерів, які виконують технічне завдання.


Малюнок 6. Діаграма кількості відвідувачів за ключовими словами по декаминутам

Фрод відбувається нерівномірно з кількох причин:

  • щоб зробити атаку «згладжено» потрібно володіти конфіденційною інформацією і знати хто, коли і скільки переходів здійснює по вашій рекламі;
  • софт діє ривками, і на хвилинному, 10 хвилинному, а іноді і на годинному графіку, його дії будуть кидатися в очі;
  • навіть якщо проти вас працюють «школярі» з дощок оголошень, і вони діють за певним завданням з алгоритмом, і аномалії, породжені ними легко буде відстежити.

Якщо навчиться оперативно знаходити і усувати вогнища, то можна помітно знизити шкоду від фроду. В нашому випадку, очевидною ознакою стало аномальне збільшення кількості переходів з контекстної реклами в конкретних 10 хвилинах або одній хвилині за деякими ключовими словами.

Для візуалізації найкраще підійде Google Data Studio, оскільки коректно збирати дані, розбиті за часу на 1 і 10 хвилин, здатний тільки Analytics, а Метрика, при побудові звітів по декахвилинам, віддає некоректні показники.

Як будувати діаграми по 10 хвилинах, а не по годині, в Google Data StudioЗа замовчуванням, в Analytics або Data Studio можна будувати графіки щохвилини або по 10 хвилинах, проте це можна зробити наступним чином Дата Студії:

Крок 1. Відкриваємо редагування полів

Крок 2. Створюємо копії наступних полів: Рік, Місяць року, День, Година, Хвилина, і називаємо їх, наприклад, Рік (число, Місяць року (число) і так далі. Також в скопійованих полях необхідно змінити Тип, формат часу і дати на „число“ як показано на малюнку.


Крок 2. Змінюємо тип скопійованого з поля «дати» на «число»

Крок 3. Створюємо нове поле, в якому прописуємо наступну формулу: Рік (число)*10000000+Місяць року (число)*100000+День місяця (число)*1000+Годину (число)*10+FLOOR(Хвилина (число)/10)


Крок 3. Створюємо обчислюване поле «Час за 10 хвилин»

Крок 4. Зберігаємо створене поле, потім повертаємося до списку всіх полів і знаходимо наше нове поле «Час за 10 хвилин (декахвилин)». Необхідно змінити його тип з «Число» на «Дата і час» як показано на малюнку, а потім назад присвоїти цього поля тип «Число».


Крок 4. Створюємо обчислюване поле „Час за 10 хвилин“

Крок 5. Створюємо «Комбіновану діаграму» і ставимо як параметр наше нове поле «Час за 10 хвилин», як показано на рисунку. Готове.


Крок 5. Створюємо «комбіновану діаграму»

 

Налаштовуємо повідомлення на осередки фроду

Щоб не стежити за всіма випадками фроду вручну, я зробив звіт в Google Таблицях, який оновлює дані кожну хвилину і повідомляє про початок фроду.

Google Таблиці підтримують Core Reporting API, звертатися до якого можна через «Редактор скриптів» в Таблицях.

Крок 1. Заходимо в редактор скриптів для звернення до Analytics


Малюнок 7. Редактор скриптів для звернення до Analytics Core Reporting API через Гугл Таблиці

Крок 2. Прописуємо API запит до Analytics, щоб одержувати дані по потрібних показниках (наприклад, про кількість користувачів, що перейшли з платної реклами, в кожну хвилину доби, як у нашому випадку).

Код Google Script для запиту будь-яких даних з Analytics, Google Таблиці

function runDemo() {
 try {

 var firstProfile = getFirstProfile();
 var results = getReportDataForProfile(firstProfile);
outputToSpreadsheet(results);

 } catch(error) {
Browser.msgBox(error.message);
}
}

function getFirstProfile() {
 var accounts = Analytics.Management.Accounts.list();
 if (accounts.getItems()) {
 var firstAccountId = accounts.getItems()[0].getId();

 var webProperties = Analytics.Management.Webproperties.list(firstAccountId);
 if (webProperties.getItems()) {

 var firstWebPropertyId = webProperties.getItems()[0].getId();
 var profiles = Analytics.Management.Profiles.list(firstAccountId, firstWebPropertyId);

 if (profiles.getItems()) {
 var firstProfile = profiles.getItems()[0];
 return firstProfile;

 } else {
 throw new Error('No views (profiles) found.');
}
 } else {
 throw new Error('No webproperties found.');
}
 } else {
 throw new Error('No accounts found.');
}
}

function getReportDataForProfile(firstProfile) {

 var profileId = firstProfile.getId();
 var tableId = 'ga:' + profileId;
 var startDate = "today"; //наприклад getLastNdays(14) дорівнює 2 weeks (a fortnight) ago.
 var a list = "today"; //getLastNdays(0) дорівнює Today.

 var optArgs = {
 'dimensions': 'ga:date,ga:hour,ga:minute,ga:sourceMedium', // Comma separated list of dimensions.
 'sort': 'ga:date,ga:hour,ga:minute', // Sort by sessions descending, then keyword.
 //'segment': 'dynamic::ga:isMobile==Yes', // Process only mobile traffic.
 'filters': 'ga:sourceMedium==yandex / cpc',
 'start-index': '1',
 'max-results': '10000' // Display the first 250 results.
};

 // Make a request to the API.
 var results = Analytics.Data.Ga.get(
 tableId, // Table id (format ga:xxxxxx).
 startDate, // Start-date (format yyyy-MM-dd).
 a list, // End date format yyyy-MM-dd).
 'ga:users', // Comma seperated list of metrics.
optArgs);

 if (results.getRows()) {
 return results;

 } else {
 throw new Error('No views (profiles) found');
}
}

function getLastNdays(nDaysAgo) {
 var today = new Date();
 var before = new Date();
 before.setDate(today.getDate() - nDaysAgo);
 return Utilities.formatDate(before, 'GMT', 'yyyy-MM-dd');
}

function outputToSpreadsheet(results) {
 var sheets = SpreadsheetApp.getActiveSpreadsheet();
 var sheet = sheets.getSheetByName("coeff1");
 var range = sheet.getRange('A:E');
range.clear();

 // Print the headers.
 var headerNames = [];
 for (var i = 0, header; header = results.getColumnHeaders()[i]; i++) {
headerNames.push(header.getName());
}
 sheet.getRange(1, 1, 1, headerNames.length)
.setValues([headerNames]);

 // Print the rows of data.
 sheet.getRange(2, 1, results.getRows().length, headerNames.length)
.setValues(results.getRows());
}

Крок 3. Задаємо тригер на оновлення даних кожну хвилину:

Читайте також  Реклама в інтернеті - види, приклади та ціни


Малюнок 8. Запитуємо свіжі дані кожну хвилину для оперативного реагування на фрод

Крок 4. Створюємо зведену таблицю з аркуша, оновлюваного потрібними відомостями раз на хвилину, і аналізуємо ці показники для установки тригерів для повідомлень на електронну пошту або ж відключення груп оголошень за API Я. Діректа або AdWords.

Малюнок 9. Приклад налаштування формул для повідомлень про аномалії

Приклад мого коду Google Script для відправки повідомлень на електронну пошту

function myFunction() {
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var sheet = ss.getSheetByName("notification");

 var range = sheet.getRange("D2:E4");

// The row and column here are relative to the range
// getCell(1,1) in this code returns the cell at B2, B2
 var cell = range.getCell(1, 2);
Logger.log(cell.getValue());
 if (cell.getValue() !== "no") {
 MailApp.sendEmail("your_email@yandex.ru", "Fraud notification "+cell.getValue(), "Check me "+range.getCell(1, 1).getValue());
}
 else {
}
 var cell2 = range.getCell(2, 2);
Logger.log(cell2.getValue());
 if (cell2.getValue() !== "no") {
 MailApp.sendEmail("your_email@yandex.ru", "Fraud notification "+cell2.getValue(), "Check me "+range.getCell(2, 1).getValue());
}
 else {
}
 var cell3 = range.getCell(3, 2);
Logger.log(cell3.getValue());
 if (cell3.getValue() !== "no") {
 MailApp.sendEmail("your_email@yandex.ru", "Fraud notification "+cell3.getValue(), "Check me "+range.getCell(3, 1).getValue());
}
 else {
}
}

Підсумки: як перемогти склікування

Протидіяю клік фроду можна підрозділити на три групи:

а) Попереджувальні дії:

  • відключення «забруднених майданчиків»;
  • відключення показу реклами для аудиторії з фродовими для вас ознаками, наприклад, для людей на планшетах з Санкт-Петербурга (більш складні параметри для блокування можна використовувати через списки AdWords і сегменти Метрики);
  • коригування ставок для сегментів аудиторії, схожих на сегменти фроду («look-alike» сегменти створюються в Я. Аудиторіях і списках Google);
  • блокування фроду по маскам IP мереж (доступно тільки в AdWords).

б) Профілактичні дії:

  • відправка скарг про повернення бюджету в AdWords і Директ;
  • розслідування «хто замовив атаку на вас»;
  • групування підозрілих і часто атакованих груп оголошень в єдину рекламну кампанію;
  • «пастки» для найпростіших ботів, а саме приховані кнопки на сайті, які видно тільки боту і при натисканні на які він потрапляє в список.

в) Дії «post factum»:

  • блокування по IP адресам;
  • оперативне відключення вогнищ склікування: ключових слів, груп оголошень, рекламних кампаній, сегментів аудиторії.


Малюнок 10. Способи захисту від click fraud

Корисні посилання:

  • Бібліотека Core Reporting API;
  • Query Explorer для зручної відпрацювання API команд;
  • Пишемо скрипти для автоматизації роботи з додатками Google;
  • Automate Google Sheets.
  • Analytics Intelligence, щоб запитати бота Analytics: – «А чи не було аномалій в платному трафіку за останній рік?» – і отримати чітку відповідь;

Як дізнатися, хто замовив атаку на вашу рекламуБудь-який адекватний конкурент буде мінімізувати свої збитки при атаці на інших:

  1. по-перше, атакуючий постарається не показувати свою рекламу за напрямами, за якими йде атака в дану хвилину, щоб не злити свій CTR і підвищити собі ціну за клік;
  2. по-друге, недобросовісний конкурент підбере такі ключові слова для атаки, за яким він може перестати показувати свою рекламу без особливої шкоди для себе.

В нашому випадку, конкурент ще й почав клік фрод за 4 напрямками у двох містах, тому вирахувати його не склало праці.

Щоб було простіше аналізувати конкурентів, з якими ви перетинаєтеся, можна дивитися всі включені оголошення конкурентів по кожному ключовому слову в иінтерефейсі Діректа:


Малюнок 9. Всі оголошення конкурентів по ключовому слову

Хто зіткнувся з склікуванням контекстної реклами – пишіть в коментарях, постараємося допомогти один одному!

Степан Лютий

Обожнюю технології в сучасному світі. Хоча частенько і замислююся над тим, як далеко вони нас заведуть. Не те, щоб я прям і знаюся на ядрах, пікселях, коллайдерах і інших парсеках. Просто приходжу в захват від того, що може в творчому пориві вигадати людський розум.

You may also like...

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *