Генерация фида товаров для Google Merchant Center
Google Merchant Center принимает данные только в строго регламентированном формате — XML (RSS 2.0 или Atom 1.0) либо через Content API. Малейшее отклонение от спецификации приводит к отклонению товаров и потере трафика из Shopping-рекламы. Разрабатываем генератор фида, который проходит валидацию с первого раза и поддерживается в актуальном состоянии автоматически.
Что входит в работу
- Анализ структуры каталога и маппинг полей на атрибуты GMC
- Генерация XML-фида по спецификации Google Product Data Specification
- Настройка cron-задачи или webhook-триггера для обновления фида
- Регистрация фида в аккаунте Merchant Center и первичная диагностика ошибок
Обязательные и рекомендуемые атрибуты
| Атрибут | Обязательность | Примечание |
|---|---|---|
id |
обязательный | уникальный SKU, не меняется |
title |
обязательный | до 150 символов, без caps lock |
description |
обязательный | до 5000 символов |
link |
обязательный | канонический URL товара |
image_link |
обязательный | HTTPS, мин. 100×100 px |
price |
обязательный | формат 19.99 USD |
availability |
обязательный | in_stock / out_of_stock / preorder |
brand |
рекомендуемый | обязателен для одежды, электроники |
gtin |
рекомендуемый | повышает Quality Score |
google_product_category |
рекомендуемый | числовой ID из таксономии Google |
custom_label_0..4 |
опциональный | сегментация в Smart Shopping |
Структура XML-фида
<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:g="http://base.google.com/ns/1.0" version="2.0">
<channel>
<title>Название магазина</title>
<link>https://example.com</link>
<description>Каталог товаров</description>
<item>
<g:id>SKU-12345</g:id>
<g:title>Кроссовки Nike Air Max 270 мужские чёрные</g:title>
<g:description>Беговые кроссовки с технологией Air Max...</g:description>
<g:link>https://example.com/products/nike-air-max-270</g:link>
<g:image_link>https://cdn.example.com/products/nike-270-black.jpg</g:image_link>
<g:availability>in_stock</g:availability>
<g:price>8990.00 RUB</g:price>
<g:brand>Nike</g:brand>
<g:gtin>0012345678905</g:gtin>
<g:google_product_category>187</g:google_product_category>
<g:condition>new</g:condition>
<g:custom_label_0>sale</g:custom_label_0>
</item>
</channel>
</rss>
Генератор на PHP/Laravel
class GoogleMerchantFeedGenerator
{
public function generate(): string
{
$products = Product::with(['images', 'category', 'brand'])
->where('is_active', true)
->where('stock', '>', 0)
->cursor(); // cursor() для больших каталогов — не грузит RAM
$xml = new \XMLWriter();
$xml->openMemory();
$xml->setIndent(true);
$xml->startDocument('1.0', 'UTF-8');
$xml->startElement('rss');
$xml->writeAttribute('xmlns:g', 'http://base.google.com/ns/1.0');
$xml->writeAttribute('version', '2.0');
$xml->startElement('channel');
foreach ($products as $product) {
$this->writeItem($xml, $product);
}
$xml->endElement(); // channel
$xml->endElement(); // rss
return $xml->outputMemory();
}
private function writeItem(\XMLWriter $xml, Product $product): void
{
$xml->startElement('item');
$xml->writeElement('g:id', $product->sku);
$xml->writeElement('g:title', mb_substr($product->name, 0, 150));
$xml->writeElement('g:link', route('products.show', $product->slug));
$xml->writeElement('g:image_link', $product->mainImage()?->cdn_url ?? '');
$xml->writeElement('g:price', number_format($product->price, 2, '.', '') . ' RUB');
$xml->writeElement('g:availability', $product->stock > 0 ? 'in_stock' : 'out_of_stock');
$xml->writeElement('g:brand', $product->brand?->name ?? '');
$xml->writeElement('g:condition', 'new');
$xml->endElement();
}
}
Фид кэшируется в файловом хранилище и отдаётся через выделенный роут с заголовком Content-Type: application/xml. При каталоге свыше 100 000 позиций фид разбивается на части через механизм supplemental feeds в GMC.
Альтернатива: Content API for Shopping
Для интернет-магазинов с частыми изменениями цен и остатков (несколько раз в сутки) XML-фид неудобен из-за задержки индексации. Content API позволяет отправлять изменения в реальном времени:
// Google API Client Library for PHP
$service = new Google\Service\ShoppingContent($client);
$product = new Google\Service\ShoppingContent\Product([
'offerId' => 'SKU-12345',
'title' => $product->name,
'link' => $productUrl,
'price' => ['value' => '8990.00', 'currency' => 'RUB'],
'availability' => 'in_stock',
'channel' => 'online',
'contentLanguage' => 'ru',
'targetCountry' => 'RU',
]);
$service->products->insert('merchant-account-id', $product);
Подход через API используется, когда магазин обновляет цены несколько раз в день или работает с динамическим ценообразованием.
Типичные ошибки при первичной настройке
-
Missing required attribute — чаще всего
gtinдля брендовых товаров. Решение: добавитьidentifier_exists: noдля товаров без штрихкода -
Image not crawlable — CDN закрыт
robots.txtили требует авторизации. Решение: открыть Googlebot в настройках CDN - Price mismatch — цена в фиде не совпадает с ценой на лендинге. Решение: синхронизировать источник данных
Сроки
Настройка генератора фида, первичная загрузка и устранение ошибок валидации — 3–5 рабочих дней. Плановая индексация товаров Google занимает ещё 2–7 дней после успешной отправки фида.







