Как шпионить за конкурентами в Google Ads

Я думаю, все знакомы с типом отчета Auction insights в Google Ads.

На протяжении многих лет это выглядело очень бедно и давало лишь общее представление о том, в каком положении вы находитесь по отношению к конкурентам.

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

Однако некоторое время назад Google добавила возможность просмотра данных Auction insights в стандартном построителе отчетов. И оказалось, что там гораздо больше данных:

Сейчас у нас много данных, но работать с такой таблицей не очень удобно. Нужно организовать хранение данных, строить по ним отчеты и обновлять их. Я решил сделать это в Google Data Studio.

К сожалению, отчет не может быть загружен через API, поэтому я написал скрипт в Google Apps, который обновит данные в отчете.

Сбор данных

На Google Диске создана общая папка. Любой из менеджеров трафика, имеющий доступ к отчету и папке, может загрузить csv-файл отчета в интерфейсе Google Ads и загрузить его в эту общую папку. Скрипт проверяет папку раз в час и, если находит в ней файл отчета, загружает его в Google BigQuery.

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

function main() {
    var date = Utilities.formatDate(new Date(), 'GMT', 'yyyyMMdd');

    // folder for reports
    var folderCSV = DriveApp.getFolderById('*********************************');
    var files = folderCSV.getFilesByType(MimeType.CSV);
    while (files.hasNext()) {
        var file = files.next();
        var filename = file.getName();

        // processed files will be renamed and deleted, this is a filter so as not to get confused
        if (filename.indexOf('__') == -1) {
            var data = file.getBlob().getDataAsString();
            var arr = Utilities.parseCsv(data);
            arr.splice(0, 3);

            // cut headings and log the number of lines
            Logger.log(arr.length);
            var uniqueArr = [];
            for (var i = 0; i < arr.length; i++) {
                uniqueArr.push([arr[i][1], 0]);
            }
            uniqueArr = unique(uniqueArr);
            var filterArr = [];

            // and counted the number of unique domains in the report
            Logger.log(uniqueArr.length);
            for (var d = 0; d < uniqueArr.length; d++) {
                var line = uniqueArr[d];
                for (var l = 0; l < arr.length; l++) {
                    if (uniqueArr[d][0] == arr[l][1]) {
                        line[1] = +line[1] + +1;
                    }
                }

                // in BigQuery, we will add data only for domains that appear in the report more than 100 times
                if (line[1] >= 100) {
                    filterArr.push(line[0]);
                }
            }
            var filteredArr = [];
            for (var f = 0; f < filterArr.length; f++) {
                for (var l = 0; l < arr.length; l++) {
                    if (filterArr[f] == arr[l][1]) {
                        try {

                            // everything is beautifully formatted and put into an array
                            arr[l][2] = Utilities.formatDate(new Date(arr[l][2]), "GMT", "yyyy-MM-dd'T'HH:mm:ss'Z'");
                            arr[l][3] = arr[l][3].replace(/\%/i, '').replace(/<10/i, '1');
                            arr[l][4] = arr[l][4].replace(/\%/i, '');
                            arr[l][5] = arr[l][5].replace(/\%/i, '');
                            arr[l][6] = arr[l][6].trim().replace(/\-\-/i, '0');
                            filteredArr.push(arr[l].join(','));
                        } catch (e) {
                            Logger.log(e);
                        }
                    }
                }
            }

            // Collecting a csv file from the array for uploading to BigQuery
            var newCSVstring = filteredArr.join('\r\n');

            var newFile = folderCSV.createFile('__AU_' + date + '.csv', newCSVstring);
            if (newFile) {
                try {
                    file.setName('___DEL__' + date + '.csv');
                    file.setTrashed(true);
                } catch (e) {
                    Logger.log(e);
                }
                var fileId = newFile.getId();

                // delete the original file, and send the formatted and cleaned file to BigQuery
                loadCsv(fileId);
            }
        } else {
            try {
                file.setName('___DEL__' + date + '.csv');
                file.setTrashed(true);
            } catch (e) {
                Logger.log(e);
            }
        }
        break;
    }
}

function unique(arr) { // remove duplicates
    var tmp = {};
    return arr.filter(function (a) {
        return a in tmp ? 0 : tmp[a] = 1;
    });
}

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

function loadCsv(csvFileId) {
    var projectId = '***********'; // Project name
    var datasetId = '***********'; // dataset name
    var date = Utilities.formatDate(new Date(), 'GMT', 'yyyyMMdd');
    var tableId = 'AU_IS_' + date; // table name
    var table = {
        tableReference: {
            projectId: projectId,
            datasetId: datasetId,
            tableId: tableId
        },
        schema: {
            fields: [{
                    name: 'account', // if you do not have an MCC report, you will not need this field
                    type: 'STRING'
                },
                {
                    name: 'domain',
                    type: 'STRING'
                },
                {
                    name: 'keyword',
                    type: 'STRING'
                },
                {
                    name: 'date',
                    type: 'TIMESTAMP'
                },
                {
                    name: 'search_impr_share',
                    type: 'FLOAT'
                },
                {
                    name: 'top_of_page_rate',
                    type: 'FLOAT'
                },
                {
                    name: 'abs_top_of_page_rate',
                    type: 'FLOAT'
                },
                {
                    name: 'position_above_rate',
                    type: 'FLOAT'
                }
            ]
        }
    };
    table = BigQuery.Tables.insert(table, projectId, datasetId);
    Logger.log('Table created: %s', table.id);

    var file = DriveApp.getFileById(csvFileId);
    var data = file.getBlob().setContentType('application/octet-stream');
    // Create a job to load data
    var job = {
        configuration: {
            load: {
                destinationTable: {
                    projectId: projectId,
                    datasetId: datasetId,
                    tableId: tableId
                },
                skipLeadingRows: 1
            }
        }
    };
    job = BigQuery.Jobs.insert(job, projectId, data);
    Logger.log('Load job started. Check on the status of it here: ' + 'https://bigquery.cloud.google.com/jobs/%s', projectId);
}

Вот и все, функция main() должна быть настроена на запуск каждый час с помощью триггера, и данные из папки автоматически попадут в BigQuery.

Визуализация данных

Я решил визуализировать отчет в Data Studio.

Сначала нам нужно создать источник данных. В списке предлагаемых коннекторов выберите BigQuery, а затем создайте запрос с помощью пользовательского запроса:

SELECT * FROM `project-name.dataset_name.AU_IS_*`

Этот запрос соберет данные для отчета из нескольких таблиц, что позволит вам добавлять таблицы с данными «на лету».

Перейдите к настройке полей:

Для полей с параметрами конкурентов мы устанавливаем агрегацию в среднее значение.

И построение отображения отчета:

Удобнее всего использовать комбинацию сглаженного графика и еженедельного вывода данных.

Кроме того, вы можете легко создать отчет в формате «конкуренты по ключам»:

С помощью которого вы можете получить четкое представление о конкуренции по ключевому слову (или всем фразам, в которых встречается это слово) за интересующий вас период.

Или отчет «Ключи конкурента», где вы можете увидеть, насколько конкурент вторгся на вашу территорию и как сильно он пытается победить вас:

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