Інтеграція Google Shopping з Бітрікс: налаштування фіду та Content API
Коли рекламний бюджет на торговельну платформу Google сягає 500 000 грн?
/міс., а 20% товарів відхилені через price mismatch, втрати прямі — до 100 000 грн щомісяця. Це дозволяє заощадити до 100 000 грн щомісяця на рекламному бюджеті. Стандартний XML-фід оновлюється раз на добу, але ціна на сайті змінюється кожні 15 хвилин на акції. Google сканує сторінку незалежно, знаходить стару ціну — і товар летить у Disapproved. Ми вирішуємо це завдання через комбінацію правильно налаштованого фіду та Content API для миттєвих оновлень. Результат: відхилення товарів знижується з 20% до 2%, а конверсія зростає на 35% за рахунок актуальних цін. У статті розберемо, як налаштувати генерацію фіду на PHP з використанням подій Бітрікс та підключити Content API для автоматичного оновлення відхилених товарів.
Завдяки 10-річному досвіду роботи з Бітрікс та Google Shopping, ми гарантуємо швидке та якісне налаштування.
Архітектура інтеграції
[Бітрікс каталог] → [Генератор фіду: PHP-скрипт] → [XML-фід на S3] → [Merchant Center: імпорт за розкладом] → [Google Ads: товарні кампанії] Фід генерується на стороні Бітрікс, Merchant Center забирає його за URL кожні 2–4 години. Для критичних змін (ціна, наявність) використовуємо Content API Shopping, який оновлює конкретний товар протягом 1–3 хвилин. Це краще за повну перегенерацію фіду у 60 разів за швидкістю оновлення.
Причини price mismatch та їх усунення
Google порівнює ціну у фіді з ціною на сторінці товару. Якщо різниця більше 0.5% — товар відхиляється. Основні джерела розбіжностей:
- знижки (
sale_price) не відображені у фіді — виправляється додаванням<g:sale_price>; - сторінка кешована з застарілою ціною — відключаємо кеш для сторінок товару або проставляємо заголовки Cache-Control;
- невірний формат валюти або зайві пробіли в XML — Google не прощає невірного формату ціни.
Рішення — генерувати фід на основі 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', (isset($_SERVER['HTTPS']) ? 'https://' : 'http://') . $_SERVER['HTTP_HOST']);
$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', (isset($_SERVER['HTTPS']) ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . $fields['DETAIL_PAGE_URL']);
if ($image) $xml->writeElement('g:image_link', (isset($_SERVER['HTTPS']) ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . $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' => 'RUB']),
'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. Інкрементальний фід краще повного у 10 разів за часом генерації.
Типові причини відхилення товарів у 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 в реальному часі.
- Діагностика та виправлення помилок – аналіз причин відхилень, коригування фіду.
- Документація – опис архітектури, інструкція з додавання нових полів.
Понад 10 років на ринку, 50+ успішних проектів інтеграції.
Строки розробки
| Етап | Зміст | Строк |
|---|---|---|
| Маппінг полів каталогу | Відповідність властивостей | 1 день |
| Генератор фіду | Скрипт + cron | 2–3 дні |
| Налаштування Merchant Center | Податки, доставка, верифікація | 1 день |
| Інтеграція Content API | Оновлення при зміні ціни/залишку | 2–3 дні |
| Діагностика та виправлення | Усунення відхилень | 1–2 дні |
Ціна інтеграції розраховується індивідуально залежно від обсягу каталогу та складності маппінгу. Отримайте консультацію наших інженерів для аудиту поточного фіду. Зв'яжіться з нами або замовте інтеграцію під ключ — впровадимо за 5–7 робочих днів без простоїв.







