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 | Разрешить индексацию страниц товаров |
Что входит в работу
- Маппинг полей каталога – соответствие свойств Битрикс → Google Shopping (GTIN, brand, category, price, availability).
- Генератор фида – PHP-скрипт с кэшированием, обработкой ошибок, экспортом статистики.
- Настройка Merchant Center – загрузка фида, налоги, доставка, верификация сайта.
- Интеграция Content API – обновление товаров через Google Shopping API в реальном времени.
- Диагностика и исправление ошибок – анализ причин отклонений, корректировка фида.
- Документация – описание архитектуры, инструкция по добавлению новых полей.
Сроки разработки
| Этап | Содержание | Срок |
|---|---|---|
| Маппинг полей каталога | Соответствие свойств | 1 день |
| Генератор фида | Скрипт + cron | 2–3 дня |
| Настройка Merchant Center | Налоги, доставка, верификация | 1 день |
| Интеграция Content API | Обновление при смене цены/остатка | 2–3 дня |
| Диагностика и исправление | Устранение отклонений | 1–2 дня |
Цена интеграции рассчитывается индивидуально в зависимости от объёма каталога и сложности маппинга. Получите консультацию наших инженеров для аудита текущего фида. Свяжитесь с нами или закажите интеграцию под ключ — внедрим за 5–7 рабочих дней без простоев.







