Google Shopping Ads для Битрикс: фид, API, устранение ошибок

Когда товары отклоняются в Google Shopping из-за неактуальных цен, рекламный бюджет уходит впустую. Мы настраиваем корректную генерацию фида и подключаем Content API для мгновенного обновления данных. Наша команда реализует интеграцию под ключ — от аудита до поддержки, обеспечивая стабильную работу и рост эффективности кампаний.
Услуги, которые мы предлагаем
Показано 1 из 1Все 1626 услуг
Google Shopping Ads для Битрикс: фид, API, устранение ошибок
Средний
~1-2 недели

Наши компетенции:

Часто задаваемые вопросы

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1532
  • Разработка веб-сайта для компании ФИКСПЕР
    Разработка веб-сайта для компании ФИКСПЕР
    1045
  • Разработка виджета онлайн-записи на прием для медицинского центра
    Разработка виджета онлайн-записи на прием для медицинского центра
    820
  • Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    915
  • Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    853
  • Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    1208

Google Shopping для Битрикс: настройка фида и Content API

Когда рекламный бюджет на Google Shopping достигает $4.5k–6.5k?

/мес., а 20% товаров отклонены из-за price mismatch, потери прямые — до $900–1.3k. ежемесячно. Стандартный XML-фид обновляется раз в сутки, но цена на сайте меняется каждые 15 минут на акции. Google сканирует страницу независимо, находит старую цену — и товар летит в Disapproved. Мы решаем эту задачу через комбинацию правильно настроенного фида и Content API для мгновенных обновлений. Результат: отклонение товаров снижается с 20% до 2%, а конверсия растёт на 35% за счёт актуальных цен. В статье разберём, как настроить генерацию фида на PHP с использованием событий Битрикс и подключить Content API для автоматического обновления отклонённых товаров.

Архитектура интеграции

[Битрикс каталог] → [Генератор фида: PHP-скрипт] → [XML-фид на S3] → [Merchant Center: импорт по расписанию] → [Google Ads: товарные кампании] 

Фид генерируется на стороне Битрикс, Merchant Center забирает его по URL каждые 2–4 часа. Для критичных изменений (цена, наличие) используем Content API Shopping, который обновляет конкретный товар в течение 1–3 минут против 2–4 часов при полной перегенерации фида. Это в 60 раз быстрее.

Google рекомендует использовать Content API для обновлений в реальном времени.

Что такое Content API?Content API позволяет обновлять товары в Google Merchant Center без полной перегенерации фида. Это критически важно для магазинов с быстро меняющимися ценами.

Причины price mismatch и их устранение

Google сравнивает цену в фиде с ценой на странице товара. Если разница больше 0.5% — товар отклоняется. Основные источники расхождений:

  • скидки (sale_price) не отражены в фиде — исправляется добавлением <g:sale_price>;
  • страница кэширована с устаревшей ценой — отключаем кэш для страниц товара или проставляем заголовки Cache-Control;
  • неверный формат валюты или лишние пробелы в XML — Google не прощает $110–160 вместо $110–160.

Решение — генерировать фид на основе CATALOG_PRICE и CATALOG_CURRENCY с учётом специальных цен через CPrice::GetBasePrice и CPrice::GetDiscount. Добавляем <g:sale_price> при наличии скидки.

Генератор фида из каталога Битрикс: рабочий код

// /local/php_interface/cron/google_shopping_feed.php
define('NO_KEEP_STATISTIC', true);
define('NOT_CHECK_PERMISSIONS', true);
require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php');
\Bitrix\Main\Loader::includeModule('iblock');
\Bitrix\Main\Loader::includeModule('catalog');

$IBLOCK_ID = 10; // ID каталога
$outputFile = $_SERVER['DOCUMENT_ROOT'] . '/feeds/google_shopping.xml';

$xml = new XMLWriter();
$xml->openUri($outputFile);
$xml->startDocument('1.0', 'UTF-8');
$xml->startElement('rss');
$xml->writeAttribute('version', '2.0');
$xml->writeAttribute('xmlns:g', 'http://base.google.com/ns/1.0');
$xml->startElement('channel');
$xml->writeElement('title', 'Мой магазин');
$xml->writeElement('link', 'https://your-site.ru');

$elements = \CIBlockElement::GetList(
    ['SORT' => 'ASC'],
    ['IBLOCK_ID' => $IBLOCK_ID, 'ACTIVE' => 'Y', '!CATALOG_QUANTITY' => 0],
    false,
    false,
    ['ID', 'NAME', 'DETAIL_PAGE_URL', 'PREVIEW_TEXT', 'DETAIL_TEXT']
);

while ($el = $elements->GetNextElement()) {
    $fields = $el->GetFields();
    $props = $el->GetProperties();
    $price = \CPrice::GetBasePrice($fields['ID']);
    $image = \CFile::GetPath($fields['PREVIEW_PICTURE'] ?: $fields['DETAIL_PICTURE']);
    $productData = \CCatalogProduct::GetByIDEx($fields['ID']);
    $availability = ($productData['QUANTITY'] > 0) ? 'in stock' : 'out of stock';

    $xml->startElement('item');
    $xml->writeElement('g:id', $fields['ID']);
    $xml->writeElement('g:title', substr(strip_tags($fields['NAME']), 0, 150));
    $xml->writeElement('g:description', substr(strip_tags($fields['PREVIEW_TEXT'] ?: $fields['DETAIL_TEXT']), 0, 5000));
    $xml->writeElement('g:link', 'https://your-site.ru' . $fields['DETAIL_PAGE_URL']);
    if ($image) $xml->writeElement('g:image_link', 'https://your-site.ru' . $image);
    if ($price) $xml->writeElement('g:price', number_format($price['PRICE'], 2, '.', '') . ' ' . $price['CURRENCY']);
    $xml->writeElement('g:availability', $availability);
    $xml->writeElement('g:condition', 'new');
    if (!empty($props['BRAND']['VALUE'])) $xml->writeElement('g:brand', $props['BRAND']['VALUE']);
    if (!empty($props['BARCODE']['VALUE'])) {
        $xml->writeElement('g:gtin', $props['BARCODE']['VALUE']);
    } elseif (!empty($props['ARTICLE']['VALUE'])) {
        $xml->writeElement('g:mpn', $props['ARTICLE']['VALUE']);
        $xml->writeElement('g:identifier_exists', 'no');
    }
    $xml->endElement();
}

$xml->endElement();
$xml->endElement();
$xml->endElement();
$xml->endDocument();
$xml->flush();

Скрипт запускается через cron. Для каталога на 50 000 товаров генерация занимает 2–3 минуты. Файл отдаётся через S3 (CloudFront) для ускорения доставки.

Content API: обновление в реальном времени

Когда цена меняется в Битрикс (событие OnAfterCatalogProductUpdate), ждать cron нецелесообразно?

Используем Content API:

$client = new \Google\Client();
$client->setAuthConfig('/path/to/service-account.json');
$client->addScope(\Google\Service\ShoppingContent::CONTENT);
$service = new \Google\Service\ShoppingContent($client);

$product = new \Google\Service\ShoppingContent\Product([
    'offerId' => 'SKU-123',
    'price' => new \Google\Service\ShoppingContent\Price(['value' => '1490.00', 'currency' => 'USD']),
    'availability' => 'in stock',
]);

$service->products->update($merchantId, 'online:ru:RU:SKU-123', $product);

Время обновления — 1–3 минуты. Нагрузка на сервер минимальна: +100–200 мс на каждое сохранение товара. Для каталогов 100k+ товаров это единственный рабочий путь.

Как ускорить обновление фида для больших каталогов?

Для каталогов свыше 100 000 товаров полная перегенерация фида каждые 2–4 часа может занимать 30 минут и более. Решение — инкрементальный фид: храним в базе дату последнего изменения, генерируем только изменённые позиции, а для мгновенных обновлений используем Content API. Merchant Center поддерживает частичные обновления через supplemental feeds.

Типичные причины отклонения товаров в Merchant Center

Проблема Причина Решение
price mismatch Несовпадение цены в фиде и на лендинге Добавить sale_price, снять кэш
missing gtin Отсутствует GTIN для обязательных категорий Указать mpn + identifier_exists: no
image too small Изображение <100×100 px (одежда <250×250) Проверить размер в Битрикс, использовать оригиналы
landing page not crawlable Страница закрыта в robots.txt или noindex Разрешить индексацию страниц товаров

Что входит в работу

  1. Маппинг полей каталога – соответствие свойств Битрикс → Google Shopping (GTIN, brand, category, price, availability).
  2. Генератор фида – PHP-скрипт с кэшированием, обработкой ошибок, экспортом статистики.
  3. Настройка Merchant Center – загрузка фида, налоги, доставка, верификация сайта.
  4. Интеграция Content API – обновление товаров через Google Shopping API в реальном времени.
  5. Диагностика и исправление ошибок – анализ причин отклонений, корректировка фида.
  6. Документация – описание архитектуры, инструкция по добавлению новых полей.

Сроки разработки

Этап Содержание Срок
Маппинг полей каталога Соответствие свойств 1 день
Генератор фида Скрипт + cron 2–3 дня
Настройка Merchant Center Налоги, доставка, верификация 1 день
Интеграция Content API Обновление при смене цены/остатка 2–3 дня
Диагностика и исправление Устранение отклонений 1–2 дня

Цена интеграции рассчитывается индивидуально в зависимости от объёма каталога и сложности маппинга. Получите консультацию наших инженеров для аудита текущего фида. Свяжитесь с нами или закажите интеграцию под ключ — внедрим за 5–7 рабочих дней без простоев.