программирование для селлеров маркетплейсов

Как выгрузить данные из OZON API о рекламных кампаниях и оптимизировать рекламу

Начнём с того, что Youtube, Google, Yandex, ChatGPT рекомендуют данный сайт по данному запросу. api-master.ru Топ 1−2 в выдаче.
В конце статьи и заинтересованным в выгрузке данного отчёта — бонус.

Сравнение отчёта из API с отчётом из кабинета OZON

Я не буду описывать, зачем нужен детализированный отчёт о расходах по каждому SKU, потому что если вы менеджер маркетплейса или аналитик и вы это не знаете, то мне вам уже не помочь — и здесь я могу вам либо предложить спросить ChatGPT, либо поменять сферу приложения ваших умений.


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

Таблцица сравнения отчётов

Но прежде — объясню, почему на основании отчета из кабинета невозможно корректно посчитать ДРР и построить нормальную аналитику.
Критерий Отчёт из кабинета Отчёт по API от api-master.ru
Автоматизация сбора❌ Вручную✅ Полная автоматизация через API
Детализация по дням❌ Нет✅ Есть — можно строить динамику
Детализация заказов❌ Только сумма✅ Полный список заказов, цена, себестоимость
Маржинальность и ROI❌ Невозможно посчитать✅ Считается на основе себестоимости
CTR, показы, клики✅ Есть✅ Есть
Добавления в корзину✅ Есть❌ Нет (но можно по заказам)
Тип кампании✅ Видно в таблице✅ По campaign_id (точнее)
Гибкость анализа❌ Только фиксированный отчёт✅ Свободная аналитика в BI / Excel / Google Sheets
Выручка и расходы❌ Суммарно✅ Покупка по каждой транзакции
Формат выгрузкиCSV / ExcelJSON + Google Sheets / Excel
Обновление❌ Только вручную✅ Ежедневно, автоматически

Сравнение для маркетологов

КабинетAPI
Автоматизация
❌ Вручную✅ Авто
По дням
❌ Нет✅ Есть
Детализация
❌ Только суммы✅ Заказы, цены
ROI / Маржа
❌ нельзя✅ можно
CTR и клики
Корзины
Формат
CSVJSON + Таблицы
Обновление
❌ вручную✅ авто

Почему нельзя посчитать ДРР по отчёту из кабинета Ozon:

Нет связки "расход ↔ заказ"

В кабинете вы видите только суммарные значения: сколько потратили, сколько получили выручки, но не понятно, какие именно заказы (и когда) были получены благодаря этой рекламе.


Выручка по SKU дана в аггрегации

Если один SKU участвует сразу в нескольких кампаниях — например, и в "Продвижении в поиске", и в "Выводе в ТОП", — то в кабинете Ozon вся выручка по этому товару суммируется, а не делится между источниками.

➜ В результате вы не можете понять, какой канал реально сработал, а какой просто слил бюджет.


Нет данных по каждому заказу

Без ID заказа, количества, себестоимости и даты — вы не можете сделать нормальный расчёт рентабельности или возврата на инвестиции (ROI), не говоря уже про корректный анализ по дням.


ДРР в кабинете — просто число

Это число рассчитано Ozon'ом внутри, и вы не можете проверить, как именно оно получено. Оно не учитывает отмены, возвраты, частичные доставки и т. д.

Как устроен процесс получения данных по рекламным кампаниям через OZON API

Я опишу базовый принцип.
  • Получение API ключей

    Для начала нам нужно получить credentials (API ключи) для доступа к OZON Performance API. Вам понадобятся client_id и client_secret. Эти данные можно найти в вашем кабинете на OZON.
  • Получение списка рекламных кампаний

    Для оптимизации процесса можно выгружать только активные кампании и кампании по которым были траты за указанный период, потому что весь список рекламных кампаний может грузиться очень долго
  • Получение динамического токена для доступа к API

    Для доступа к API нам нужно получить токен. Он выдается на ограниченное время и необходим для аутентификации.
  • Получение UUID отчёта и скачивание его с помощью download_report

    Для каждой активной кампании мы отправляем запрос на получение данных. Ответ приходит в виде UUID — уникального идентификатора задачи.
  • Основная функция и сохранение данных в Google Sheets

    После получения UUID мы запрашиваем готовый отчет и выгружаем данные в Google Sheets для дальнейшего анализа.

Получение API-ключей

Итак получаем список активных кампаний из OZON:

2. Получение списка кампаний

Итак получаем список активных кампаний из OZON:
Список возможных рекламных кампаний
function fetchCampaigns() {
  var apiToken = "Здесь сгенерированный PERFORMANCE API TOKEN "
  var advObjectType = 'SKU'; // Тип кампаний, например, трафареты
  var desiredStates = 'CAMPAIGN_STATE_RUNNING'; // Берем только активные кампании

  var url = 'https://performance.ozon.ru/api/client/campaign?' +
    'advObjectType=' + encodeURIComponent(advObjectType);

  var options = {
    'method': 'get',
    'headers': {
      'Authorization': 'Bearer ' + apiToken,
      'Accept': 'application/json'
    }
  };


    var response = UrlFetchApp.fetch(url, options);
    if (response.getResponseCode() == 200) {
      var data = JSON.parse(response.getContentText());
      var campaignIds = data.list.map(campaign => campaign.id);
      Logger.log('Получено ' + campaignIds.length + ' активных кампаний');
      return campaignIds;
    } else {
      Logger.log('Ошибка получения кампаний: ' + response.getResponseCode());
      return [];
    }
 
  }
}

3. Получение Токена API

Перед тем как получить хоть какой-то отчёт по рекламе нам надо сгенерировать токен. Генерацию и создание токена для OZON Performance API мы оставим за рамками данной статьи. Скажем, что он отличается от статичного токена WB и его нужно обновлять каждые 30 минут

4. Получение отчета по UUID кампаний

Итак у нас есть список кампаний, теперь по ним мы хотим получить отчёты, но не так всё просто. Для того чтобы получить отчёт мы должны отправить запрос на генерации данного отчёта, в качестве ответа мы получаем не сам отчёт, а UUID - номер, по которому в дальнейшем мы получим отчёт. Этот процесс может занять достаточно продолжительно время. Особенно если Performance API занят другими задачи. Данный запрос может выдавать ошибки.
Данный запрос не является оптимальным и приводится лишь для объяснения принципа работы
function fetchCampaignUUID(campaignId, apiToken) {
  var url = 'https://performance.ozon.ru/api/client/statistics/json'; // URL для запроса статистики по рекламной кампании
  var payload = JSON.stringify({
    "campaigns": [campaignId], // можно передать список до 10 кампаний
    "dateFrom": '2024-01-01', // дата начала сбора статистики в формате ГГГГ-ММ-ДД
    "dateTo": '2024-01-31', // дата конца сбора статистики в том же формате
    "groupBy": "DATE"  // группировка данных в отчете по дате  
  });

  var options = {
    'method': 'post',
    'headers': {
      'Authorization': 'Bearer ' + apiToken, // Токен аутентификации
      'Content-Type': 'application/json'
    },
    'payload': payload
  };

    var response = UrlFetchApp.fetch(url, options);
    if (response.getResponseCode() == 200) {
      var data = JSON.parse(response.getContentText());
      return data['UUID']; // Возвращаем UUID отчета
    }  else {
      Logger.log('Ошибка получения UUID : ' + campaignId + ' . Код ответа: ' + response.getResponseCode());
      return null;
    }
 
}

5. Функция download_report

Код функции для скачивания отчёта из API OZON. Она универсальна и может быть применена для других типов отчётов
function downloadReport(UUID, apiToken) {
  var url = 'https://performance.ozon.ru/api/client/statistics/report?UUID=' + UUID; 
  // URL для получения отчета по UUID
  var headers = {
    'Authorization': 'Bearer ' + apiToken, // Токен аутентификации
    'Content-Type': 'application/json'
  };

  var options = {
    'method': 'get',
    'headers': headers
  };


    var response = UrlFetchApp.fetch(url, options);
    if (response.getResponseCode() === 200) {
      Logger.log('Отчет успешно загружен для UUID: ' + UUID);
      return response.getContentText(); // Возвращаем данные отчета
    } else {
      Logger.log('Ошибка загрузки отчета для UUID: ' + UUID);
      return null;
    }
  } 
}

5. Общая функция

Как всё работает.
  1. Вы запускаете в интерфейсе Google App Script Функцию main().
  2. Она запускает процесс получения API токен.
  3. Затем происходит запрос списка активных кампаний через fetchCampaigns().
  4. Для каждой кампании запрашивается UUID отчета через fetchCampaignReportUUID(). Процесс может занимать длительное время.
  5. Если получены UUID, происходит запрос отчета, и он обрабатывается функцией processReport, которая добавляет данные в Google Sheets.
Лимиты OZON Performance API. запрещают отправлять параллельно несколько запросов. Кроме этого прогцесс может занимать длительное время и поэтому предпочительнее использовать серверный код для загрузки данных по данному отчёту. За настройкой решения вы можете обратить ко мне в Telegram t.me/mislawsky
function main() {
  var apiToken = getApiToken(); // Получаем токен доступа от OZON performance API
  if (!apiToken) {
    Logger.log('Ошибка: токен не был получен.');
    return;
  }

  var campaignIds = fetchCampaigns(apiToken); // Получаем список активных кампаний из первого пункта
  if (campaignIds.length === 0) {
    Logger.log('Нет активных кампаний для обработки.');
    return;
  }

  Logger.log('Получено кампаний: ' + campaignIds.length);
  
  // Получение отчетов по каждому campaign_id
  var maxRetries = 5; // Максимальное число попыток при ошибке 429
  var sleepTime = 1000; // Начальное время ожидания в случае ошибки 429
  
  // Цикл по обходу списка campaign_ids
  for (var i = 0; i < campaignIds.length; i++) {
    var campaignId = campaignIds[i];
    Logger.log('Запрашиваем отчет для кампании ID: ' + campaignId);

    for (var retry = 0; retry < maxRetries; retry++) {
      var reportUUID = fetchCampaignReportUUID(campaignId, apiToken); // Получаем UUID отчета для текущей кампании
      
      if (reportUUID) {
        Logger.log('Получен UUID отчета для кампании: ' + campaignId + ' UUID: ' + reportUUID);
        // Скачиваем и обрабатываем отчет по полученному UUID
        var reportData = downloadReport(reportUUID, apiToken);
        if (reportData) {
          processReport(reportData); // Обрабатываем отчет и добавляем данные в Google Sheets
        }
        break; // Выходим из цикла попыток, так как отчет был успешно получен
      } else {
        Logger.log('Получена ошибка или пустой UUID, пробуем снова через ' + sleepTime + ' мс.');
        Utilities.sleep(sleepTime); // Ждем перед повторной попыткой
        sleepTime *= 2; // Увеличиваем время ожидания в два раза для экспоненциального backoff
      }

      if (retry === maxRetries - 1) {
        Logger.log('Достигнуто максимальное количество попыток для кампании: ' + campaignId);
      }
    }
  }
}

function processReport(reportData) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('raw data');
  if (!sheet) {
    sheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet('raw data'); // Создаем лист, если его нет
    sheet.appendRow(['Дата', 'Клики', 'Показы', 'CTR', 'Расход']); // Заголовки столбцов
  }

  var jsonData = JSON.parse(reportData); // Преобразуем данные отчета в JSON
  var reportRows = jsonData.report.rows;

  // Проходим по строкам отчета и добавляем данные в Google Sheets
  reportRows.forEach(function(row) {
    sheet.appendRow([
      row.date, // Дата
      row.clicks, // Количество кликов
      row.views, // Количество показов
      row.ctr.replace(',', '.'), // CTR с заменой запятой на точку
      row.moneySpent.replace(',', '.') // Расход с заменой запятой на точку
    ]);
  });

  Logger.log('Отчет успешно обработан и добавлен в Google Sheets.');
}

Обработка 429 ошибки

В скрипте опущена логика обработки 429 ошибки (превышен лимит запросов). Данная логика должна позволить повторно отправить запрос в API. Обработка этой ошибки важна, чтобы избежать блокировок со стороны API и корректно получать данные.

6 минут — ограничение Google App Script

Для небольших магазинов с 2-3 кампаниями данный отчёт можно получить через Google App Script и может быть реализовано по данному мануалу и будет удобным поскольку не требует оплаты абонентской платы. Остальным же предлагаем воспользоваться бесплатной выгрузкой данной рекламы в течении одного месяца.
за сервисы аналитики таких как Маяк, SellMonitor, MPSTAT, однако, если у вас крупный магазин, то вы просто можете не поместиться в лимиты Google Sheets и тут требуют заказывать отдельное решение по загрузке данных из API.

Решение

Мы предлагаем подобное решение, которое позволит хранить ваши данные в удобном для вас виде mySQL, PostgreSQL, XLSX, CSV, TSV. Кроме этого данное решение позволяет хранить исторические данные, которые уже не доступны в API — обращайтесь через Telegram и мы сделаем нужную для вас настройку: t.me/mislawsky.

В качестве заключение

Этот подход не описывают полностью логику работы выгрузки данного отчёта в продакшене по причине того, что это наш бизнес, но скажем так, что данная статья помогает понять как устроен процесс получения данных по рекламным кампаниям из API OZON, которые можно выгрузить как "отчёт по рекламе Ozon" в Google Sheets и строить по ним дашборды и отчёты для анализа эффективности рекламных кампаний.

Почему выгрузка отчёта по рекламе OZON по подписке дешевле разработки

Год назад ко мне пришёл менеджер агентства настройки рекламы на OZON: "Мне нужен отчёт по рекламе OZON."
Мы изучили API и оценили работу в 30.000р. Сейчас клиент ежемесячно платит 100.000р за поддержку работу данного отчёта поскольку риск не получения отчёта приводит к большим финансовым потерям.

Клиент делает агентство настройки и аналитику рекламы на OZON и в промышленном масштабе помогает средним и крупным магазинам увеличивать продажи на OZON
  • 🚀 Как на самом деле выглядит процесс получения отчёта из API OZON?Получаешь список кампаний.

    1. Фильтруешь их по нужным параметрам.
    2. Пытаешься скачать отчёт... но нет – его так просто не получить.
    3. Заказываешь отчёт → ждёшь 1 час, чтобы получить ссылку.
    4. Можно запросить только 1-10 кампаний за раз, а у клиента их 200.
    5. Ждёшь, загружаешь, проверяешь...
    6. И вдруг выясняется, что некоторые кампании не скачались!
    Почему? Причина непонятна.
    Неделя поиска – оказывается, отчёты приходят с ошибками.
  • Сколько занимает сбор отчёта?

    Полный отчёт (из 20 частей) собирается около 8 часов.
    А потом клиент говорит:
    💬 "Я хочу перезапускать отчёт, если он не собрался."
    💬 "Мне нужно видеть статус загрузки и ошибки."
    💬 "Я хочу удобное меню управления процессом сборки отчёта."
    💬 "Хочу добавить магазин"
    💬 "Хочу изменить глубину отчёта"
    💬 "А можно накапливать данные отчёта"
    Окей, но это уже не Google Apps Script. Нужно писать python-сервер скрипт, логику, обработку ошибок, интерфейс
  • Почему это выгодно?

    Актуальные данные – реклама без аналитики = деньги на ветер.
    Гарантия работоспособности – я слежу в ежедневном режиме вместе с клиентами за изменениями в OZON, API и ошибками на сервере.
    Автоматизация – отчёты приходят без участия человека, 24/7.
    Экономия времени – отчёт из кабинета OZON не содержит нужных для аналитики группировок по SKU. Вы знаете траты по кампаниям.
    Поддержка и обновления – если в OZON что-то сломается, это будет быстро починено
  • 💥 А если OZON меняет API или падает сервер?

    Именно так однажды случилось – сервер OZON лёг в феврале 2025, отчёты начали выдавать ошибки, время загрузки выросло до бесконечности. Отчёты не собирались. Письма в поддержку не помогали - они знали и так, что у них всё упало

    Вот и ответ: "Вообще нет проблем написать готовую выгрузку из 30 функций, но как быстро она сломается."
    📌 Программист написал код и ушёл, а мои клиенты получают отчёты каждый день – автоматически.

Это не просто выгрузка отчётов – это инструмент, который позволяет зарабатывать больше.

Именно поэтому крупные офлайн-бизнесы доверяют нам ведение рекламы, и мы помогаем им быть в ТОПе продаж электроники на OZON.
Хотите точную аналитику? Присылайте API-ключи –и будет у вас отчёт!

Интеграции для селлеров маркетплейсов

Масштабируем бизнес селлеров — Агентство по настройке OZON рекламы

Ежедневный сбор аналитики по рекламе, анализ и выводы, обновление рекламных ставок. Контроль цен акций, маржинальности, ДРР

ChatGPT-Автоматизация. Аналитика и управление маркетплейсами WB, OZON, YM

Массовое изменение цен товаров, автоматическое создание объявлений, автоматический запуск рекламы, передача ставок — интеграция с Google Sheets

Отчёт по рекламе OZON, финотчёт в Google Sheets по API

Отчеты по рекламе трафаретов, вывод в топ, поиск из Performance и Seller API, воронка продаж. Отчет по заказам, транзакциям, отправлениям, остатки, РНП

Полу-автоматическая аналитика рекламы OZON и биддер ставок

Снижкайте расходы на рекламу и увеличивайте продажи за счёт автоматической аналитики рекламных кампаний. Массовая передача ставок

Массовая загрузка рекламных ставок в OZON из Google Sheets

Давайте скажем честно, что это нужно каждом бизнесу на OZON

Контроль минимальной цены на товары в акциях OZON

Акции могут быть губительны для маржинальности бизнеса. Рекомендуем внедрить решение для контроля товаров, акций и цен в акциях на OZON

Интеграции для бизнеса

Python-cкрипты парсинга цен и позиций в Wildberries и Авито

Парсинг конкурентов, анализ цен, позиций карточек товаров конкурентов в Вайлдбериз. Создание таблиц товарного ряда конкурентов на Wildberries, OZON

Дашборд для маркетологов и CEO AmoCRM, Битрикс24, Yclients

Выгрузка состояния CRM: статусов сделок, лидов, отчёта план-факт по API из любых CRM в базу данных, Power BI, Data Lens, Google Sheets

Бизнес по разработке сервисов для селлеров на маркетплейсах

Идея для бизнеса: разработка системы аналитики, телеграм-бота для селлеров маркетплейсов
Синхронизация остатков, создание штрихкодов, поставок, обработка заказов, автоматизация ставок — автобиддер

Передача конверсий при регистации в Телеграм канале или чате

Передача конверсий в Fa. ok, Яндекс, Google при реальных регистраций в Телеграм канале. Лучше чем цель"клик по ссылке Телеграм".

Модуль СМС и Flash-Call верификации заявок с форм на сайте

Хотели бы платить только за качественные заявки с ващего сайта на Tilda, Битрика, Wordpress, OpenCart. Разработка модуля для вашего сайта

Передача оффлайн конверсий из CRM в системы аналитики

Оптимизация рекламных кампаний Яндекс Директ, Google, и др. только по качественным лидам, оптимизация расходов на рекламу

Отслеживание UTM-меток для лидов написавших в Whatspp

Сквозная аналитика для отслеживания источников трафика в мессенджерах

Другие интеграции для бизнеса

Интеграции с CRM, парсеры цен, сквозная аналитика, настройка Roistat, дашборды для руководителей и маркетологов, передача оффлайн-конверсий, настройка целей в GA4 и GTM

Python-cкрипты парсинга цен и позиций в Wildberries и Авито

Парсинг конкурентов, анализ цен, позиций карточек товаров конкурентов в Вайлдбериз. Создание таблиц товарного ряда конкурентов на Wildberries, OZON

Дашборд для маркетологов и CEO AmoCRM, Битрикс24, Yclients

Выгрузка состояния CRM: статусов сделок, лидов, отчёта план-факт по API из любых CRM в базу данных, Power BI, Data Lens, Google Sheets

Бизнес по разработке сервисов для селлеров на маркетплейсах

Идея для бизнеса: разработка системы аналитики, телеграм-бота для селлеров маркетплейсов
Синхронизация остатков, создание штрихкодов, поставок, обработка заказов, автоматизация ставок — автобиддер

Передача конверсий при регистации в Телеграм канале или чате

Передача конверсий в Fa. ok, Яндекс, Google при реальных регистраций в Телеграм канале. Лучше чем цель"клик по ссылке Телеграм".

Модуль СМС и Flash-Call верификации заявок с форм на сайте

Хотели бы платить только за качественные заявки с ващего сайта на Tilda, Битрика, Wordpress, OpenCart. Разработка модуля для вашего сайта

Передача оффлайн конверсий из CRM в системы аналитики

Оптимизация рекламных кампаний Яндекс Директ, Google, и др. только по качественным лидам, оптимизация расходов на рекламу

Отслеживание UTM-меток для лидов написавших в Whatspp

Сквозная аналитика для отслеживания источников трафика в мессенджерах