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->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 рабочих дней без простоев.







