Вместо трех дней — 10 минут: как автоматизировать проверку товарных остатков и остановку/запуск контекстной рекламы

Привет! Я Владимир Малюгин, CEO агентства performance-маркетинга Digital Geeks. Мы активно автоматизируем процессы: это удобно и выгодно. В статье я расскажу, как создать алгоритм, который проверяет наличие товаров в десятке маркетплейсов. А затем останавливает или запускает контекстную рекламу без участия человека.

Внутри — код и пошаговая инструкция.

Как было бы без автоматизации?

Ответ простой — долго и неэффективно:) Но все же расскажу подробнее, чтобы вы представили масштаб проблемы и всю пользу автоматизации.

Мы работали с компанией Panasonic, которая продает пару сотен товаров на разных онлайн-площадках. В качестве способа продвижения заказчик выбрал контекстную рекламу в «Яндекс.Директе» и Google Ads. В этом случае очень важно отслеживать остатки товаров в каждом интернет-магазине — невнимательность может привести к убыткам.

Вместо трех дней — 10 минут: как автоматизировать проверку товарных остатков и остановку/запуск контекстной рекламы

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

Такая ситуация невыгодна и агентству, и заказчику:

  • Риск для клиента: бессмысленный слив бюджета

Всегда есть вероятность, что сотрудник что-то упустит и, к примеру, забудет отключить показы объявления. И пользователь, кликая на рекламу, будет попадать на страницу товара, которого нет в продаже. Компания же будет за это платить. А теперь представьте, что таких товаров пара сотен.

Таким образом, исключить влияние человеческого фактора — значит минимизировать риск пустой траты бюджета.

  • Ущерб для агентства: затраты на оплату труда неквалифицированного сотрудника

Если специалист по контекстной рекламе будет сам открывать тысячи страниц и проверять наличие товаров, у него просто не будет времени для выполнения прямых обязанностей (например, оптимизации рекламных кампаний для увеличения конверсии). Чтобы пройти по всем ссылкам, одному человеку понадобится примерно три дня.

Конечно, на эту работу можно нанять несколько вчерашних выпускников. Но есть и более эффективное решение, которое сэкономит ФОТ. Это автоматизация.

Как внедрить автоматизацию для остановки и запуска контекстной рекламы?

Продолжу рассказывать на примере проекта Digital Geeks для Panasonic.

Заказчик сотрудничал с двенадцатью интернет-магазинами, среди которых были «Ситилинк», DNS, Ozon и Wildberries. Чтобы нарастить объем продаж, Panasonic включил в тендер на Performance-маркетинг ведение контекстной рекламы товаров на разных площадках. Мы предложили автоматизировать проверку остатков продукции.

В итоге мы создали робота, который автоматически собирает информацию о наличии предложений бренда во всех интернет-магазинах. Если позиция закончилась, скрипт отключает рекламу соответствующего объявления в Google Ads и «Яндекс.Директе». А если продукт, наоборот, поступил на склад, алгоритм самостоятельно возобновляет продвижение.

Это не все полезные функции робота — он взял на себя и оповещение специалистов двух компаний. Сотрудникам Panasonic он рассылает уведомления о том, что пора отправить партию товара на определенную площадку. А команде агентства алгоритм сообщает, что остановил показ объявлений, ведущих на страницы раскупленных продуктов.

А как же готовый софт?

Сразу расскажу, почему мы не использовали существующие на рынке сервисы.

  • Во-первых, среди них нет платформы, которая «дружит» со всеми интернет-магазинами. Обычно готовые решения интегрированы только с акулами e-commerce.
  • Во-вторых, помимо проверки наличия товаров алгоритм должен был останавливать и запускать контекстную рекламу. А этого сегодня нет в функционале даже самых продвинутых сервисов.

Как создать алгоритм для проверки остатков?

Для решения нашей задачи требовалось два скрипта. Функция первого — собирать информацию о наличии продуктов бренда в интернет-магазинах в гугл-таблицу. Цель второго — остановка и запуск контекстной рекламы. Рассылку сообщений мы автоматизировали без создания скрипта, используя сервис Make (но об этом чуть позже).

Алгоритм для сбора данных написали на Python, для остановки и запуска рекламы в «Яндекс.Директе» — на языке R, в Goolge Ads — на встроенном Goolge Ads Scripts. Наши скрипты вы найдете в конце этого раздела статьи — и сможете попробовать самостоятельно настроить автоматизацию.

Для работы первого алгоритма мы вручную подготовили список URL-адресов всех страниц сайтов с товарами. Данные можно собирать и с XML-файлов, но позиций было не так много, до 200 в каждом интернет-магазине, и мы предпочли первый способ.

Вместо трех дней — 10 минут: как автоматизировать проверку товарных остатков и остановку/запуск контекстной рекламы

Итак, скрипт сам открывает файл, а затем последовательно кликает по каждой ссылке и определяет статус товара по двум критериям: надписи на кнопке и наличию на странице цены. Когда стоимость указана, а на кнопке — фраза «Добавить в корзину», система считает, что товар есть в магазине. А когда данных о цене нет, а покупателю предлагают узнать о его поступлении, скрипт понимает, что товар закончился.

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

Из-за того, что ключевая информация на разных сайтах указана немного по-разному, нам пришлось написать несколько версий основного скрипта с учетом особенностей каждого ресурса. Еще одна сложность возникла из-за периодических изменений визуала интернет-магазинов. Чтобы предотвратить возможные ошибки, мы дополнили скрипт. Если алгоритм не видит ни цены, ни кнопки, он на всякий случай отключает показ объявлений в «Яндекс.Директе» и Google Ads. А затем сообщает нам о ситуации, чтобы мы проверили спорную страницу сами.

Алгоритм распределяет данные, полученные за прошлый и текущий день, по двум столбцам. Дальше в работу включается второй робот. Сравнивая данные, он распознает, какой продукт закончился, а какой, наоборот, поступил в продажу. В первом случае он отключает показы рекламы, а во втором — включает.

Вот скрипт для Google Ads:

function main() { ////////// Подключение к Sheets с URL на остановку var sheet = SpreadsheetApp.openById(ID).getSheetByName("Eplaza"); var data = sheet.getRange("A2:F755").getValues(); var rows = data.length var ads = AdWordsApp.ads() //отсюда берем URL для проверки .get(); Logger.log('%s ads found.', ads.totalNumEntities()); // Берем URL с объявлений и ищем статус в Sheets var out = new Array() var i = 0 while(ads.hasNext()) { var ad = ads.next(); var adURL = ad.urls().getFinalUrl(); Logger.log (adURL); Logger.log (adURL.split("?")); for (var i = 0; i < rows; i++) { if (data[i][0] == adURL) { if (data[i][0] == adURL && data[i][5] == "Нет в наличии") { Logger.log ("Товара нет в наличии") Logger.log ("Найденно соответствие") Logger.log (adURL) Logger.log ("и ссылка в шитс") Logger.log (data[i][0]) Logger.log (data[i][5]) if (ad.isPaused() == false) { Logger.log ("Кампания активна") Logger.log(ad.isPaused()) Logger.log ("Выключаем....") ad.pause() } else { Logger.log ("Кампания уже на паузе") Logger.log(ad.isPaused()) Logger.log ("Пропускаем") } } else { Logger.log ("Товар в наличии") Logger.log ("Найденно соответствие") Logger.log (adURL) Logger.log (data[i][5]) if (ad.isPaused() == true) { Logger.log ("Кампания неактивна") Logger.log(ad.isPaused()) Logger.log ("Включаем") ad.enable() } else { Logger.log ("Кампания уже активна") Logger.log(ad.isPaused()) Logger.log ("Пропускаем") } } } else { Logger.log (adURL) Logger.log ("URL не найден. Пропускаем") } } } }

Скрипт для «Яндекс.Директа»:

#Set Russian Locale Sys.setlocale("LC_CTYPE", "russian") library(ryandexdirect) token = "C:/Scripts/Access" yadirAuth(Login = "login@yandex.ru", TokenPath = "C:/Scripts/Access") # подключаем пакет library(googlesheets4) #https://habr.com/ru/post/488756/ # указываем путь к JSON файлу, который ранее скачали gs4_auth_configure(path = "C:/Scripts/Access/client_secret.json") # проходим авторизацию gs4_auth(email = "login@digitalgeeks.ru") ##################################################eplaza########################## print(accounts[1]) #Получаем список рекламных кампаний my_camp <- yadirGetAds(Login = accounts[1], AgencyAccount = "login@yandex.ru") my_camp$TextAdHref <- sub("\\?.+", "", my_camp$TextAdHref) surveyresults <-read_sheet(URL_Sheets,sheet = 'Eplaza', col_types = 'c') surveyresults <- as.data.frame(surveyresults) i2 <- match(my_camp$TextAdHref,surveyresults$URL ) index_url <- as.data.frame(i2) i<-1 ads_to_stop <- data.frame() ads_to_start <- data.frame() for(index in index_url$i2) { if (!is.na(index) == TRUE) { if (surveyresults$`Что теперь?`[index] =="Нет в наличии" ) { ads_to_stop <-rbind(ads_to_stop,my_camp$Id[i]) } if (surveyresults$`Что теперь?`[index] =="Товар в наличии" ) { ads_to_start <-rbind(ads_to_start,my_camp$Id[i]) } } i <- i+1 } if (length(ads_to_start)>0) { colnames(ads_to_start) <- c("Campaign") #Возобнолвям показы объявлений для Товар наличии err <- yadirStartAds(Login = accounts[1], AgencyAccount = "login@yandex.ru", Ids = ads_to_start$Campaign) } if (length(ads_to_stop)>0) { colnames(ads_to_stop) <- c("Campaign") # #Останавливаем показы объявлений для товаров НЕТ в наличии err <- yadirStopAds(Login = accounts[1], AgencyAccount = "login@yandex.ru", Ids = ads_to_stop$Campaign) }

Как настроить отправку данных в мессенджер?

Чтобы контекстолог не тратил время на проверку таблицы, мы настроили автоматическое оповещение в Telegram. Это можно сделать с помощью сервиса для автоматизации Make (прежнее название — Integromat). Это no-code платформа с интуитивно-понятным интерфейсом. Для работы с ней не нужно уметь программировать — достаточно понимать структуру и логику соединяемых систем, а также знать английский язык, чтобы читать названия полей сервиса.

Публикую пошаговый визуал по настройке рассылки в Make.

Первый шаг: создаем триггер — ссылку, по которой переходит парсер после завершения проверки остатков. Это позволяет сразу же запустить следующий этап работы алгоритма
Первый шаг: создаем триггер — ссылку, по которой переходит парсер после завершения проверки остатков. Это позволяет сразу же запустить следующий этап работы алгоритма
Второй шаг: проверяем, есть ли изменения статусов товаров в Google Sheets
Второй шаг: проверяем, есть ли изменения статусов товаров в Google Sheets
Третий шаг: настраиваем отправку сообщений в чат о том, что парсер закончил работу и обнаружил изменения
Третий шаг: настраиваем отправку сообщений в чат о том, что парсер закончил работу и обнаружил изменения
Четвертый шаг: формируем одну таблицу со всеми изменениями
Четвертый шаг: формируем одну таблицу со всеми изменениями
Пятый шаг: настраиваем автоматическую отправку данных на электронную почту
Пятый шаг: настраиваем автоматическую отправку данных на электронную почту

Благодаря этому решению, когда оба скрипта завершают свою работу, в проектный чат приходит информация о числе товаров, статус которых изменился. Подробности можно узнать из письма, которое система автоматически отправляет на почту сотрудников Digital Geeks и Panasonic.

Сбор результатов парсинга, отправка данных в Telegram и на почту
Сбор результатов парсинга, отправка данных в Telegram и на почту
Формат шаблона письма в среде Make
Формат шаблона письма в среде Make

Такая система уже работает как часы, но можно еще кое-что улучшить. К примеру, сделать так, чтобы алгоритм сохранял данные последовательно, пропуская URL с ошибками. Наш скрипт сначала собирает информацию, а затем размещает ее таблицу, поэтому при любой проблеме на одной из страниц начинает все заново. Чтобы система действовала еще быстрее, можно добавить многопоточность организовать параллельный сбор данных сразу с нескольких адресов.

Экономия 150 тыс. рублей в месяц и другие выгоды от автоматизации

Благодаря внедрению этого решения мы сэкономили на оплате труда новых сотрудников, которых пришлось бы нанимать для проверки товарных остатков. При этом скрипты работают несравнимо быстрее человека: вместо 2-3 дней они тратят около 10 минут. А специалисты агентства вместо перехода по ссылкам и изучения таблиц могут заняться задачами, которые требуют креативности и интеллекта.

Не менее очевидна выгода для заказчика. Благодаря автоматизации он может быть уверен, что бюджет не уходит на рекламу страниц товара, который нельзя заказать.

Cоздание индивидуальных алгоритмов вместо выбора готовых сервисов ежемесячно экономит компании порядка 150 тыс. рублей.А оперативное оповещение о том, какой товар на каком сайте закончился, помогает нашему партнеру вовремя пополнять запасы продукции во всех интернет-магазинах, не допуская простоя.

Если вы хотите знать больше о продвижении в интернете, загляните в наш телеграм-канал Digital Geeks. Его цель — облегчить жизнь директорам и менеджерам по Digital-маркетингу, а также предпринимателям, которые привлекают клиентов в Сети. В постах мы рассказываем, например, как построить эффективную систему управления SЕО, используя принципы регулярного менеджмента; как быстрее получить результаты; как автоматизировать различные процессы и сделать команду эффективнее.

17
3 комментария

Здравствуйте! Я из команды Digital Geeks. Спасибо за положительный отклик и вопрос!
Под Директ можно протестировать такой модуль: http://www.easydirect.ru/
Для Adwords нужно будет создавать что-то свое.
Make используется только для вывода результатов, вкл\откл и парсинг реализовано скриптами.

1
Ответить

Спасибо! Именно такое решение искал долго

1
Ответить

Спасибо за статью и скрипты, очень полезно.

Интересно, а для связки битрикс сайта с директом и адвордс есть готовые решения? Или через Make можно также настроить?

1
Ответить