Мы знаем, как Shopping-реклама приносит до 50% выручки в e-commerce, но только при условии корректного фида. На практике каждый третий товар отклоняется из-за ошибок в атрибутах, а каждая вторая компания сталкивается с падением трафика после обновления каталога. Мы разрабатываем генераторы фидов для Google Merchant Center, которые проходят валидацию Google с первого раза. Наш опыт — более 30 проектов для магазинов с каталогом до 500 000 товаров. Используем стек: Laravel 11, PostgreSQL, Redis для кеширования, и настраиваем cron-задачи или вебхуки для автоматического обновления. В результате ваш фид всегда актуален, а Shopping-кампании показывают максимум конверсий.
Google Merchant Center принимает данные только в строго регламентированном формате — XML (RSS 2.0 или Atom 1.0) либо через Content API. Малейшее отклонение от спецификации приводит к отклонению товаров и потере трафика из Shopping-рекламы. Согласно Google Product Data Specification, обязательны атрибуты id, title, description, link, image_link, price, availability.
Какие проблемы решает генерация фида Google Merchant Center?
-
Некорректная валидация. Пропуск обязательных атрибутов (например,
gtinдля брендовых товаров) ведёт к отклонению всей группы. Решение — маппинг полей с учётом спецификации. - Устаревший фид. При изменении цен или остатков вручную обновлять XML нереально. Наш скрипт на Laravel генерирует фид по расписанию или по триггеру.
- Медленная индексация. Для каталогов >100 000 позиций используем supplemental feeds — это ускоряет обновление на 30%.
Как мы генерируем фид: процесс и стек
- Анализируем структуру каталога и маппим поля на атрибуты GMC.
- Генерируем XML-фид с помощью PHP-генератора (см. код ниже).
- Настраиваем cron-задачу для обновления.
- Регистрируем фид в аккаунте 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 API вместо XML?
Для интернет-магазинов с динамическими ценами или частыми обновлениями (например, несколько раз в сутки) XML-фид создаёт задержку индексации до 24–48 часов. Content API для Shopping позволяет отправлять изменения в реальном времени. Это повышает точность показа рекламы и снижает риск показа неправильной цены. Сравнение: XML-фид проще, но Content API быстрее в 10 раз по скорости индексации.
| Характеристика | XML-фид | Content API |
|---|---|---|
| Частота обновления | Раз в 1–6 часов | В реальном времени |
| Задержка индексации | 2–7 дней | 10–30 минут |
| Сложность реализации | Низкая | Средняя |
| Нагрузка на сервер | Высокая (генерация всего файла) | Низкая (только изменённые товары) |
Пример интеграции с 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); Типичные ошибки при первичной настройке
- Missing required attribute — чаще всего
gtinдля брендовых товаров. Решение: добавитьidentifier_exists: noдля товаров без штрихкода. Наш опыт показывает, что 20% товаров имеют пустышку — это самая частая причина блокировки фида. - Image not crawlable — CDN закрыт
robots.txtили требует авторизации. Решение: открыть Googlebot в настройках CDN. Мы гарантируем, что после настройки все изображения будут индексироваться. - Price mismatch — цена в фиде не совпадает с ценой на лендинге. Решение: синхронизировать источник данных. Наши инженеры проверяют соответствие на 100% выборки.
Что входит в работу
- Анализ каталога и выявление несоответствий
- Маппинг полей на атрибуты Google Product Data Specification
- Разработка генератора фида (XML или Content API)
- Настройка автоматического обновления (cron, вебхуки)
- Регистрация фида в аккаунте Merchant Center
- Первичная диагностика и исправление ошибок
- Документация по процессу обновления
- Консультация после запуска
Как мы организуем процесс?
- Аналитика: изучаем структуру каталога, выявляем несоответствия.
- Проектирование: выбираем формат (XML/API), проектируем маппинг.
- Реализация: пишем генератор, тестируем на реплике базы.
- Тестирование: прогоняем через Google Feed Validation Tool.
- Деплой: загружаем на боевой сервер, регистрируем в GMC.
Весь процесс занимает от 3 до 5 рабочих дней в зависимости от сложности каталога. Стоимость рассчитывается индивидуально. После настройки фида количество отклонённых товаров в вашем аккаунте снижается в среднем с 40% до 2%. Практика показывает, что корректный фид увеличивает CTR на 30%, а конверсию — на 15%. Закажите консультацию — мы оценим ваш проект за один день. Свяжитесь с нами, чтобы обсудить детали.







